pythonで4次のルンゲクッタ法を用いて、二階の常微分方程式の数値解を得ようと試み、webからコードを探してきたのですが、最後のfor文で引っかかってしまいました。
以下のコードです。
python
1def rKN(x, fx, n, hs): 2 k1 = [] 3 k2 = [] 4 k3 = [] 5 k4 = [] 6 xk = [] 7 for i in range(n): 8 k1.append(fx[i](x)*hs) 9 for i in range(n): 10 xk.append(x[i] + k1[i]*0.5) 11 for i in range(n): 12 k2.append(fx[i](xk)*hs) 13 for i in range(n): 14 xk[i] = x[i] + k2[i]*0.5 15 for i in range(n): 16 k3.append(fx[i](xk)*hs) 17 for i in range(n): 18 xk[i] = x[i] + k3[i] 19 for i in range(n): 20 k4.append(fx[i](xk)*hs) 21 for i in range(n): 22 x[i] = x[i] + (k1[i] + 2*(k2[i] + k3[i]) + k4[i])/6 23 return x 24 25def fa1(x): 26 return 0.9*(1 - x[1]*x[1])*x[0] - x[1] + math.sin(x[2]) 27 28def fb1(x): 29 return x[0] 30 31def fc1(x): 32 return 0.5 33 34def VDP1(): 35 f = [fa1, fb1, fc1] 36 x = [1, 1, 0] 37 hs = 0.05 38 for i in range(20000): #ここのfor文です。 39 x = rKN(x, f, 3, hs)
※出典
https://www.codeproject.com/Tips/792927/Fourth-Order-Runge-Kutta-Method-in-Python
例で解かれている方程式は以下です。
y¨=μ(1−y2)y˙−y+Asin(ωt)
μ=0.9, A=1 ω=0.5
rNK関数の引数は x,fxはarrays, nは次元数と書いてあります。
最後二行のfor文で変数にはiを使っていますが、関数rNKの引数にはiは含まれておりません。
関数VDP1で関数rNKを複数回実行して、VDP1内の変数xが数値解になると解釈しているのですが、どうして最後の二行でrNKを繰り返し実行できるのかが理解出来ませんでした。
ご指導をよろしくお願いします。
質問内容で不十分な箇所がある場合にもご指摘を頂けたらと思います。
※質問できる程度の英語力がなかったため、こちらで質問させて頂きました。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/01/26 11:44
2018/01/26 12:21
2018/01/28 02:17