3
4

1 に答える 1

6

少なくとも正しい方向に向けることができると思います。光学ブロッホ方程式は、科学界ではよく理解されている問題ですが、私はそうではありません :-)、この特定の問題に対する解決策がインターネット上に既にあります。

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

ヤコビアンは必須ではありませんが、計算をより迅速に進めることができます。これを計算する方法がわからない場合は、ウィキペディアまたは微積分の教科書を参照してください。これは非常に単純ですが、時間がかかる場合があります。

初期条件に関しては、それが複雑であるか実際の値であるかに関係なく、それらがどうあるべきかをおそらくすでに知っているはずです。妥当な範囲内の値を選択する限り、それほど重要ではありません。

于 2012-02-26T03:23:43.733 に答える