我想找到一个在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()输出类型转换为float,但是我得到了相同的错误。虽然这似乎是一项简单的任务,但我无法在StackOverflow或文档中找到解决此问题的方法。
我的问题是:我如何在数值上求解使用Python中求和表示的方程式。
答案 0 :(得分:2)
这个特殊的总和只不过是几何系列的总和。 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.解决方程有什么特别之处。被评估为总和。您需要确保您向fsolve
或其亲属提供的函数实际返回数字输出的方式。
此外,fsolve
(i)期望您的函数相当平滑和(ii)它不处理边界。这样,如果您需要限制根查找的范围,最好使用,brentq
。
(在更高的维度中,查找least_squares
。)
原则上,您可以在函数中使用try-except,并在没有收敛的情况下返回nan
。这可能只会让解算器感到困惑,返回值很可能是垃圾。