用Python求和表示的方程的数值解
我想找到一个用Python表示为无穷和的方程的数值解。使用用Python求和表示的方程的数值解,python,scipy,numeric,sympy,Python,Scipy,Numeric,Sympy,我想找到一个用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) 我得到一个错误: Attribute
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数值求解用求和表示的方程 这个特殊的和不过是一个几何级数的和<代码>同类型同意:
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))
[23]中的:x=符号('x')
在[24]中:i=symbols('i',integer=True)
[25]中:和(x**i,(i,0,oo)).doit()
Out[25]:分段((1/(-x+1),Abs(x)<1),(和(x**i,(i,0,oo)),真)
请注意,它因x>=1而发散。Sympy引发了一个错误(tryf(1.1)
),而fsolve
的胆量并没有准备好处理这个错误,这不知何故导致了您看到的错误
总的来说,我不认为用l.h.s.作为求和来求解方程有什么特别之处。您需要以这种或那种方式确保呈现给fsolve
或其相关函数的函数实际返回数值输出
此外,fsolve
(i)期望您的函数相当平滑,(ii)它不处理边界。这样,如果需要限制根查找的范围,最好使用brentq
。
(在更高的维度中,查找最小二乘法
)
原则上,您可以在函数中使用try-except,并在没有收敛的情况下返回nan
。这可能只会使解算器感到困惑,返回值很可能是垃圾。有趣的是,Brentq不会产生错误,但是,如果所有实数的和都收敛,则错误仍然存在于fsolve中。这解决了我的问题。