在Python中查找方程的所有根

在Python中查找方程的所有根,python,function,scipy,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(

我有一个函数,我想找到它的根。我可以编写一个程序来计算它的根,但问题是,每次我想找到另一个根,我应该手动给它一个初始值,我不想这样做。我想把所有的根都放在一个列表中,因为我想在找到它们之后对根进行一些操作。这是我的代码:

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)
对于整数c,函数的根由Lambert W函数给出

方程有无穷多个复数根。与Lambert W函数的实分支相对应的k=0和k=-1根可以是实值的


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

除了具有某些特殊结构的函数(如多项式等),没有算法可以计算函数的所有根。。对于您的函数,似乎根可以与Lambert W函数相关。事实上,我将支持@pv.的评论。你需要使用一些关于函数的智能,并且有一些关于更智能的文献,但是从某种意义上说,最终你是注定要失败的,即使你知道所有的根都是真实的。如果它们可能是复杂的,那么,生活会变得更加困难……假设我有自己的代码,我想通过给出初始值来计算复数根。可能吗?假设我只对根感兴趣,它们的大小小于1,当你有问题的解析解时,为什么要计算给出初始值的解呢?至于你的第二个问题:查找Lambert W函数的性质,并试着计算出来。我不知道你为什么使用Lambert W函数,因为根据Rouche定理,上面提到的函数是多项式。你在上面写了方程zeta^c expa*b-a*b*zeta-1=0。这不是一个多项式方程。如果你有一个不同的方程式,请把它写正确。很抱歉回答晚了。根据Rouch定理,上述方程将被视为多项式方程。
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))))