2016-03-29 5 views
1

Pythonで無限和として表現された方程式の数値解を見つけたいと思っています。 fsolve()sympyを使用して簡略化した例は次のようになります。Pythonで和として表現された方程式の数値解を見つける

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()は浮動小数点型を出力しますが、同じエラーが発生します。これは簡単な作業のようですが、StackOverflowやドキュメントでこの問題の解決策を見つけることができませんでした。

私の質問は、Pythonで合計を使って表現された方程式を数値的に解決する方法です。

答えて

2

この特定の合計は、幾何級数の合計に過ぎません。 sympy同意:それはx >=1のために発散することを

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)) 

注意してください。 Sympyはfsolveの腸が処理するために準備されていないエラー(try f(1.1))を発生させ、これは何とかあなたが見るエラーにつながります。

一般に、私はl.h.sで方程式を解くことについて特別なことはないと思います。合計として評価される。 fsolveに表示されている関数またはその親戚が実際に数値出力を返すようにする必要があります。

また、fsolve(i)は、あなたの関数は(ⅱ)それは境界を処理しない合理的に滑らかであることを期待しています。このようにして、ルート探索の範囲を制限する必要がある場合は、たとえばbrentqを使用する方がよいでしょう。 (高次元では、least_squaresを探してください)

原則として、関数内でtry-exceptを使用し、収束しない場合はnanを返すことができます。これはソルバーだけを妨害する可能性が高く、戻り値は非常にうまくゴミになる可能性があります。

+0

興味深いことに、Brentqはエラーを発生させませんが、すべての実数に収束する合計の場合、fsolveの誤差は依然として続きます。これは私の問題を解決しました。 –

関連する問題