2017-07-11 13 views
0

機能していない(python.scipyでfsolveは):ソルバー私はscipyのダウンロードソルバーを使用して以下の式のシステムを解決しようとしてきた

from scipy.optimize import fsolve 
    import math 
    import numpy as np 

    S0 = 1000 
    u = 1 
    d = 1 

    delta_t = 1 
    r = 0 
    psi_r = (np.exp(-r*delta_t))**(-1) 
    fi_r = np.exp(-r*delta_t) 
    fi_2r = np.exp(-2*r*delta_t) 

    def equations(p): 
     p_u,p_m,p_d = p 
     return (p_u+p_m+p_d - 1, fi_r*(p_u*(S0+u) + p_m*S0 + p_u*(S0-d)) -S0,fi_2r* 
(p_u*p_u*(S0+2*u) + 2*p_m*p_u*(S0+u) + (2*p_u*p_d+p_m*p_m)*S0 + 2*p_m*p_d*(S0-d) + p_d*p_d*(S0-2*d)) - S0) 

    p_u,p_m,p_d = fsolve(equations,(0.3,0.5,0.4)) 

    print(equations((p_u,p_m,p_d))) 

問題があり、その和旨の最初の方程式にもかかわらず、私の未知数は1になるはずですが、これを満たす結果は得られません。私が得意とするのは、予想外の数字が10から-12まで、あるいは時には負の数であって、正しい解決策ではないことがわかっています。

私はいくつかの初期の推測を試してみて知っているが、どのような私を懸念することは推測のいずれも、これまでのシステムは、複数のソリューションを持っている一般的には1

+0

ソルバーは正常に動作します。返された解は、「1」までの合計を含む式(機械精度内)を満たす。さらに、解は確率ベクトル、すなわち '[0,1]'の範囲の要素でなければなりませんか? – Stelios

+0

はい、私はそれが必要です。実際、これは、式p_u + p_m + p_d-1がちょうどこの要件に対応するので、システムの最初の方程式です。 –

+1

まあ、変数の合計が '1'に等しくなることは、変数が確率分布に対応するのに必要な*ただし、十分ではない*条件です。例えば、ベクトル '[-12.4、13.4]'は '1'に合計されますが、確率ベクトルではありません。どのようにして解の探索空間を各変数の区間[[0,1] 'に制約する必要があります(方法は分かりません)。 – Stelios

答えて

2

に私に合計最大確率を与えていないということです、数値ソルバによって返される解は、初期解推定と実装されたアルゴリズムに依存します。しかし、一般に、ソルバーから返される解のプロパティを「制御する」ことは困難です。

あなたの場合、すべての要素が間隔[0,1]内にあるソリューションが必要です。ただし、fsolveアルゴリズムは、このプロパティを満たさないソリューションに収束します。残念ながら、fsolveは、それが返す解に対する制約を課すことはできません(他の数値方程式ソルバーの場合も同様です)。

解決策に制約を課す回避策は、方程式解決問題を制約最適化問題として定式化することです。 1つの直接的なアプローチは次のとおりです。

ベクトルxに対して、[f(x)==0, g(x)==0]という2つの式を解く必要があるとします。システムのいかなる解決策も、f(x)**2+g(x)**2の最小化器であり、これはscipy.optimize.least_squaresを呼び出すことによって得ることができることに留意されたい。さて、scipy.optimize.least_squaresは、それが返す解の境界を受け取ります。これにより、元の方程式系の解を求めることができます。

from scipy.optimize import least_squares 
sol = least_squares(equations,(0.3,0.5,0.4), bounds = (0,1)) 
print('solution: ', sol.x, '\n', 'equations:', equations(sol.x)) 
solution: [ 0.295 0.4101 0.295 ] 
    equations: (0.0, 0.0, 0.0) 

返さ溶液が実際方程式系の確率分布と根であることに留意されたいです。

+0

ありがとうございました! –

関連する問題