#####要旨
Pythonでローレンツ方程式のような常微分方程式をscipy.integrate.odeintなどを用いて解く場合に、
関数の定義をcsvファイルなどを利用して簡便に行いたいです。
#####詳細1
・scipy.integrate.odeintの使い方まとめ:
https://qiita.com/Sunset_Yuhi/items/d938718ad277eeab746c
を参考にすると、
ローレンツ方程式
【式1】
を
引用テキスト
python
1def func_lorenz(var, t, p, r, b): 2 dxdt = -p*var[0] +p*var[1] 3 dydt = -var[0]*var[2] +r*var[0] -var[1] 4 dzdt = var[0]*var[1] -b*var[2] 5 6 return [dxdt, dydt, dzdt]
といった具合で直接記述しています。
この方法だと、方程式の項が多い場合は入力に時間がかかってしまい、不便を感じています。
そこで関数の定義をcsvファイルなどを利用して簡便に行いたいと考えたのですが、方法がわからず、この度質問いたしました。
例えば、ローレンツ方程式を
【式2】
のように行列表現にし、
Aの部分とX'の部分をcsvファイルか何かで用意して、
pd.read_csv()などで読み込ませれば、何かできますでしょうか。
引用しました
> dydt = -var[0]var[2] +rvar[0] -var[1]
の
>var[0]*var[2]
のような部分をcsvファイルなどを用いて、どのように記述すればよいか見当がつかず、
教授いただけると幸いです。
まずはパラメーターp,r,bを与えた、
例えば
【表1】
のようなcsvファイルで行列Aを定義することを考えています。
対応する変数X'は、どのようにcsvファイルで用意すればよいかわからず、、
例えば
【表2】
のように2列に分けて記述し、A列×B列という処理をpython側で行えば何かできますでしょうか。
舌足らずかもしれず大変恐縮ですが、よろしくお願いいたします.
#####詳細2
詳細1に記述した、
行列Aの一部のパラメーターを時間変動させる場合の関数の定義方法を知りたいです。
例えば
パラメーターpを
【表3】
といったようにcsvファイルで用意しておき、
行列Aを
【表4】
のようにcsvで用意しておき、
python側で図3と図4のpを関連付けるなど、できるのでしょうか。
何か良い方法がありましたら、ご教授いただけると幸いです。
よろしくお願いいたします。
#####追記
toast-uz様の回答を参考に、【詳細2】に対応するコードを考えてみました。
ベストアンサーはtoast-uz様につけさせていただいたので、こちらに追記することにしました。
詳細1の式1のAをmatとして
【表5】
のように行列で定義しました。
さらに、パラメーターpの時間変動分を
【表6】
のようにしました。
表6の列0はt、列1はpです。
行数 = 計算終了時間/計算間隔にしています。
関数部分は
Python
1def func_lorenz(var, t, mat, p_list): 2 x, y, z = tuple(var) 3 mat[0,0] = - p_list[p_list[:,0] == round(t,2), 1] 4 mat[0,1] = p_list[p_list[:,0] == round(t,2), 1] 5 dXdt = [0,0,0] 6 for i in range(len(dXdt)): 7 dXdt[i] = mat[i,0]*x + mat[i,1]*y + mat[i,2]*z + mat[i,3]*x*y + mat[i,4]*x*z 8 return dXdt
のように定義しました。
パラメーターpに対応するmat[0,0]とmat[0,1]を」関数内で書き換えるようにしました。
また、連立数が多い方程式を解く場合も想定し、for分を使って連立方程式を記述しました。
必要な基底関数のみ直接記述し、対応する係数をcsvなどで用意する方法をとりました。
一応計算はできましたが、効率の悪いコードになっていると思っております。
もし、改善するところがありましたらコメントいただけると大変助かります。
回答2件
あなたの回答
tips
プレビュー