找到一个方程的数值解,表示为Python中的和

时间:2016-03-29 13:22:49

标签: 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)

我收到错误:

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

我尝试用只有有限数量的项的和来代替无穷和,并且还将函数f()输出类型转换为float,但是我得到了相同的错误。虽然这似乎是一项简单的任务,但我无法在StackOverflow或文档中找到解决此问题的方法。

我的问题是:我如何在数值上求解使用Python中求和表示的方程式。

1 个答案:

答案 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。这可能只会让解算器感到困惑,返回值很可能是垃圾。