【问题标题】:Finding all roots of an equation in Python在 Python 中查找方程的所有根
【发布时间】:2015-04-27 17:52:45
【问题描述】:

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

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)

【问题讨论】:

  • 没有算法可以计算一个函数的所有根,除了一些特殊结构的函数(例如多项式等)。对于您的函数,根似乎可以与 Lambert W 函数相关。
  • 确实,我会赞同@pv. 的评论。你需要在函数上使用一些聪明(并且有一些关于变得更聪明的文献),但最终,在某种意义上,你注定要失败,即使你知道所有的根源都是真实的。如果它们可以变得复杂,那么生活会变得更加艰难......

标签: python function scipy


【解决方案1】:

对于整数 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,由于额外的分支切割,情况似乎有点复杂,尽管至少应该捕获实值正根。

【讨论】:

  • 假设我有自己的代码,我想通过给出初始值来计算复数根。可能吗?并假设我只对它们的大小小于 1 的根感兴趣。
  • 当您有问题的解析解时,为什么要计算给出初始值的解?至于您的第二个问题:查找 Lambert W 函数的属性并尝试解决。
  • 我不知道你为什么使用 Lambert W 函数,因为根据 Rouche 定理,上述函数是多项式。
  • 你在公式zeta^c exp(a*b - a*b*zeta) - 1 = 0 上面写了。这不是一个多项式方程。如果您有不同的方程式,请正确书写。
  • 抱歉回答晚了。根据 Rouch 定理,上述方程将被视为多项式方程。
猜你喜欢
  • 2020-02-29
  • 1970-01-01
  • 2013-11-25
  • 1970-01-01
  • 1970-01-01
  • 2020-10-09
  • 2022-08-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多