用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

我想找到一个用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数值求解用求和表示的方程

这个特殊的和不过是一个几何级数的和<代码>同类型同意:

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引发了一个错误(try
f(1.1)
),而
fsolve
的胆量并没有准备好处理这个错误,这不知何故导致了您看到的错误

总的来说,我不认为用l.h.s.作为求和来求解方程有什么特别之处。您需要以这种或那种方式确保呈现给
fsolve
或其相关函数的函数实际返回数值输出

此外,
fsolve
(i)期望您的函数相当平滑,(ii)它不处理边界。这样,如果需要限制根查找的范围,最好使用
brentq
。 (在更高的维度中,查找
最小二乘法


原则上,您可以在函数中使用try-except,并在没有收敛的情况下返回
nan
。这可能只会使解算器感到困惑,返回值很可能是垃圾。

有趣的是,Brentq不会产生错误,但是,如果所有实数的和都收敛,则错误仍然存在于fsolve中。这解决了我的问题。