1 に答える
少なくとも正しい方向に向けることができると思います。光学ブロッホ方程式は、科学界ではよく理解されている問題ですが、私はそうではありません :-)、この特定の問題に対する解決策がインターネット上に既にあります。
http://massey.dur.ac.uk/jdp/code.html
ただし、ニーズに対応するために、complex_ode の使用について話しましたが、これは問題ないと思いますが、ドキュメントによると、単純な scipy.integrate.ode だけでも問題なく機能すると思います。
from scipy import eye
from scipy.integrate import ode
y0, t0 = [1.0j, 2.0], 0
def f(t, y, arg1):
return [1j*arg1*y[0] + y[1], -arg1*y[1]**2]
def jac(t, y, arg1):
return [[1j*arg1, 1], [0, -arg1*2*y[1]]]
r = ode(f, jac).set_integrator('zvode', method='bdf', with_jacobian=True)
r.set_initial_value(y0, t0).set_f_params(2.0).set_jac_params(2.0)
t1 = 10
dt = 1
while r.successful() and r.t < t1:
r.integrate(r.t+dt)
print r.t, r.y
また、古いより確立された、より適切に文書化された関数の追加の利点もあります。ydot = f(t,y)
あなたが結合ODEを 9 つではなく 8 つ持っていることに驚きましたが、あなたは私よりもこれをよく理解しているに違いありませんdef derv()
。関数が のような少なくとも 2 つのパラメーターを取ることを確認してくださいderv(t,y)
。あなたy
がマトリックスにいるなら、問題ありません!derv(t,y)
次のように関数内で「形状を変更」するだけです。
Y = numpy.reshape(y,(num_rows,num_cols));
ODE の数が である限りnum_rows*num_cols = 8
、問題ありません。次に、計算で行列を使用します。すべて完了したら、次のような行列ではなく、必ずベクトルを返すようにしてください。
out = numpy.reshape(Y,(8,1));
ヤコビアンは必須ではありませんが、計算をより迅速に進めることができます。これを計算する方法がわからない場合は、ウィキペディアまたは微積分の教科書を参照してください。これは非常に単純ですが、時間がかかる場合があります。
初期条件に関しては、それが複雑であるか実際の値であるかに関係なく、それらがどうあるべきかをおそらくすでに知っているはずです。妥当な範囲内の値を選択する限り、それほど重要ではありません。