求方程的数值解,表示为 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 值很可能是垃圾。
我想找到 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 值很可能是垃圾。