求方程的数值解,表示为 Python 中的和

Finding a numerical solution to a equation expressed as a sum in Python

我想找到 Python 中表示为无穷和的方程的数值解。使用 fsolve()sympy 的简化示例是:

from scipy.optimize import fsolve
import math
from sympy import *

i = symbols('i', integer=True)

def f(x):
        return Sum(x**i, (i,0, oo)).evalf(10)-1

print fsolve(f, 0.5)

我收到一个错误:

AttributeError: 'list' object has no attribute 'is_commutative'

我尝试用只有有限项的总和替换无限总和,并将函数 f() 输出类型转换为浮点数,但我遇到了同样的错误。尽管这似乎是一项简单的任务,但我无法在 Whosebug 或文档中找到解决此问题的方法。

我的问题是:如何用 Python 中的总和对方程式进行数值求解。

这个特定的和不过是一个几何级数的和。 sympy 同意:

In [23]: x = symbols('x')

In [24]: i = symbols('i', integer=True)

In [25]: Sum(x**i, (i, 0, oo)).doit()
Out[25]: Piecewise((1/(-x + 1), Abs(x) < 1), (Sum(x**i, (i, 0, oo)), True))

请注意,它在 x >=1 上发散。 Sympy 引发了一个错误(尝试 f(1.1)),fsolve 的胆量没有准备好处理,这不知何故导致了你看到的错误。

总的来说,我不认为用l.h.s解方程有什么特别之处。被评估为总和。您需要通过这种或其他方式确保您呈现给 fsolve 或其亲属的函数实际上 return 是一个数字输出。

此外,fsolve (i) 期望您的函数相当流畅 并且 (ii) 它不处理边界。这样,如果您需要限制求根的范围,最好使用 brentq。 (在更高的维度中,寻找 least_squares。)

原则上,你可以在你的函数中使用try-except,return nan以防不收敛。这可能只会让求解器感到困惑,并且 return 值很可能是垃圾。