私は、少なくとも正しい方向を指すことができると思います。光学式 ブロッホ式は、科学者の コミュニティでよく理解されている問題ですが、私自身ではありませんが、この特定の問題についてはすでにインターネット上の解決策があります。
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
また、より確立古く、より良い 文書化機能の付加的な利点を有します。私はあなたがODEを8つ結合していないことに驚いていますが、私は よりもよく理解しています。 はの形式でなければなりません。これはdef derv()
ですが、 ですあなたの関数が少なくとものような2つのパラメータ を取ることを確認する必要があります。 y
が行列の場合は問題ありません。 num_rows*num_cols = 8
として
Y = numpy.reshape(y,(num_rows,num_cols));
限り、ODEのあなたの数は、あなたが問題ないはずです。ただ、そのような derv(t,y)
機能でそれを「再構築」。その後、 あなたの計算に行列を使用します。あなたがすべて完了したら、ちょうど ベクトルとないような行列を返すようにしてください:
out = numpy.reshape(Y,(8,1));
ヤコビアンは必須ではありませんが、それはおそらく計算がはるかに迅速 を続行することができます。これを計算する方法がわからない場合は、 wikipediaまたはcalculusテキストブックを参照してください。かなり単純ですが、時間がかかることがあります。
これまで複雑なものであれ、実数であれ、 のものは何かを知っているはずです。理由の中で の値を選択する限り、それはあまり重要ではありません。
本当にありがとうございました。素晴らしい答えですが、かなりの時間がかかります。あなたが提供するリンクは、私が探しているものだけで完璧です。はい、それは9時です。:)今日は時間がありました。もしどこかに苦しんでいたら、私は戻ってもらえますか?再度、感謝します。 – user1233157