機能していない(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
ソルバーは正常に動作します。返された解は、「1」までの合計を含む式(機械精度内)を満たす。さらに、解は確率ベクトル、すなわち '[0,1]'の範囲の要素でなければなりませんか? – Stelios
はい、私はそれが必要です。実際、これは、式p_u + p_m + p_d-1がちょうどこの要件に対応するので、システムの最初の方程式です。 –
まあ、変数の合計が '1'に等しくなることは、変数が確率分布に対応するのに必要な*ただし、十分ではない*条件です。例えば、ベクトル '[-12.4、13.4]'は '1'に合計されますが、確率ベクトルではありません。どのようにして解の探索空間を各変数の区間[[0,1] 'に制約する必要があります(方法は分かりません)。 – Stelios