在Python中查找方程的所有根

时间:2015-02-25 16:17:49

标签: python function scipy

我有一个功能,我想找到它的根源。我可以写一个程序来弄清楚它的根源,但重点是,每次我想找到另一个根我应该手动给它一个初始值,我不想这样做。我希望在列表中包含所有根,因为我想在查找它们之后对根进行一些操作。这是我的代码:

import math
import scipy
import scipy.optimize
c = 5
alambda = 1
rho = 0.8
b = rho * c / alambda
def f(zeta):
    y = ((zeta**c)*(math.exp((alambda*b)*(1-zeta)))) - 1
    return y

print scipy.optimize.newton(f,  -1)

1 个答案:

答案 0 :(得分:0)

对于整数c,函数的根由Lambert W函数https://en.wikipedia.org/wiki/Lambert_W_function

给出
from numpy import exp, pi
from scipy.special import lambertw
c = 3
alambda = 1.234
rho = 0.8
b = rho * c / alambda
def f(zeta):
    y = ((zeta**c)*(exp((alambda*b)*(1-zeta)))) - 1
    return y
def zeta_root(k, n):
    a = alambda
    return -c/(a*b) * lambertw(-a*b/c * exp(-(a*b+2j*pi*n)/c), k=k)
for k in range(-20, 20):
    # also n can be any integer; probably reproduces the same root set
    # as varying k
    zeta = zeta_root(k, 3)
    print("k={0}, zeta={1}, error={2}".format(k, zeta, abs(f(zeta))))

该等式具有无数个复值根。与Lambert W函数的实分支对应的k=0k=-1根可能是实值的。

对于非整数c,由于额外的分支切割,情况似乎有点复杂,尽管至少应该捕获实值正根。