質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Q&A

解決済

1回答

2571閲覧

runge-kutta 2階の常微分方程式 python for文

sshhoo

総合スコア15

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

0グッド

0クリップ

投稿2018/01/26 09:04

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を繰り返し実行できるのかが理解出来ませんでした。

ご指導をよろしくお願いします。
質問内容で不十分な箇所がある場合にもご指摘を頂けたらと思います。
※質問できる程度の英語力がなかったため、こちらで質問させて頂きました。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

引っかかったの意味が理解でということなのかエラーでということなのか分からないのですが。

rKNの第3引数が3となっていて、これはxをスタート地点として、1ステップ進めるに対応しています。
なのでfor文が1回進むたびに1ステップ進めるのを20000回行うというものです。
iはダミー変数です。

投稿2018/01/26 10:05

mkgrei

総合スコア8560

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

sshhoo

2018/01/26 11:44

for文の理解が不十分でした。 回答して頂きありがとうございました。
mkgrei

2018/01/26 12:21

一応ですが、今のケースではiがダミー変数として考えることができるという話で、中身は入っています。 このような場合のテクニックとして、 for _ in range(20000): とアンダーバーを使うことによって、for文を回す際の変数は使っていないということを明示することができます。
sshhoo

2018/01/28 02:17

今後使っていきたいと思います。 アドバイスまで頂き、お心遣いありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問