我有一个功能,我想找到它的根源。我可以写一个程序来弄清楚它的根源,但重点是,每次我想找到另一个根我应该手动给它一个初始值,我不想这样做。我希望在列表中包含所有根,因为我想在查找它们之后对根进行一些操作。这是我的代码:
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)
答案 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=0
和k=-1
根可能是实值的。
对于非整数c
,由于额外的分支切割,情况似乎有点复杂,尽管至少应该捕获实值正根。