python中高达1E9值的非线性反转

时间:2014-12-23 14:11:26

标签: python numpy scipy

这是我的问题。它很简单,我已经找到了一些好方法,但它们太慢了:

我有一个简单的多项式,其顺序在2到4之间(这是用户的选择)。现在,我们只说我们有第三个订单:

a*x**3 + b*x**2 + c*x + d = 0

我需要反转此函数并获得x的(实际)值,但是需要几百万甚至十亿的值。系数(a,b,c)总是相同的,但d通常是一个包含数百万个条目的数组。

e.g。

a = -0.001
b = -0.1
c = 1.5
d = numpy.random.rand(2000, 2000)

我正在研究scipy的非线性求解器:

http://docs.scipy.org/doc/scipy/reference/optimize.nonlin.html

但这太慢了。有没有快速的方法来进行反演?

我希望你理解我的问题并感谢任何提示。 欢呼声

1 个答案:

答案 0 :(得分:0)

存在分析解决方案:Degree 3Degree 4。你可以直接实现这些。

更新(回复@HansSnah):

使用Sympy提供了一般解决方案:

import sympy as sy

#sy.init_printing() # pretty printing for ipython console

a,b,c,d,e,x = sy.symbols("a,b,c,d,e,x", real=True)
eq3 = sy.Eq(a*x**3 + b*x**2 + c*x + d, 0)
eq3a = eq3.subs({a: -.011, b: 0.1, c: 1.5, d:0})
sy.solve(eq3a, x)
# Gives: [-7.98549886553656, 0.0, 17.0764079564457]

对于我来说,1e9解决方案似乎也不够快。