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

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

ただいまの
回答率

90.32%

  • Python 3.x

    7414questions

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

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

解決済

回答 1

投稿

  • 評価
  • クリップ 0
  • VIEW 700

sshhoo

score 9

pythonで4次のルンゲクッタ法を用いて、二階の常微分方程式の数値解を得ようと試み、webからコードを探してきたのですが、最後のfor文で引っかかってしまいました。

以下のコードです。

def rKN(x, fx, n, hs):
    k1 = []
    k2 = []
    k3 = []
    k4 = []
    xk = []
    for i in range(n):
        k1.append(fx[i](x)*hs)
    for i in range(n):
        xk.append(x[i] + k1[i]*0.5)
    for i in range(n):
        k2.append(fx[i](xk)*hs)
    for i in range(n):
        xk[i] = x[i] + k2[i]*0.5
    for i in range(n):
        k3.append(fx[i](xk)*hs)
    for i in range(n):
        xk[i] = x[i] + k3[i]
    for i in range(n):
        k4.append(fx[i](xk)*hs)
    for i in range(n):
        x[i] = x[i] + (k1[i] + 2*(k2[i] + k3[i]) + k4[i])/6
    return x

def fa1(x):
    return 0.9*(1 - x[1]*x[1])*x[0] - x[1] + math.sin(x[2])

def fb1(x):
    return x[0]

def fc1(x):
    return 0.5

def VDP1():
    f = [fa1, fb1, fc1]
    x = [1, 1, 0]
    hs = 0.05
    for i in range(20000):      #ここのfor文です。
        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を繰り返し実行できるのかが理解出来ませんでした。

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

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

checkベストアンサー

0

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

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/01/26 20:44

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

    キャンセル

  • 2018/01/26 21:21

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

    キャンセル

  • 2018/01/28 11:17

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

    キャンセル

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

  • ただいまの回答率 90.32%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

同じタグがついた質問を見る

  • Python 3.x

    7414questions

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