常微分方程式の数値解法:ルンゲ・クッタ法
一階の微分方程式
$$\frac{dy}{dx} = f(x, y)$$
において、 $x$ が $x_0$ から $h$ だけ増加した点 $x_1 = x_0 + h$ における値 $y_1$ の計算を、以下の手順に基づいて行ないます。
- 点 $(x_0, y_0)$ から、傾き $f(x_0, y_0)$ で $h$ だけ進み、 $k_1$ を得ます。
$$k_1 = h f(x_0, y_0)$$
- この線上の点 $(x_0 + \frac{h}{2}, y_0 + \frac{k_1}{2})$ で傾きを求め、点 $(x_0, y_0)$ から $h$ だけ進み、$k_2$ を得ます。
$$k_2 = h f(x_0 + \frac{h}{2}, y_0 + \frac{k_1}{2})$$
- 同様に、傾き $f(x_0 + \frac{h}{2}, y_0 + \frac{k_2}{2})$ で $(x_0, y_0)$ から $h$ だけ進み、$k_3$ を得ます。
$$k_3 = h f(x_0 + \frac{h}{2}, y_0 + \frac{k_2}{2})$$
- 同様に、傾き $f(x_0 + h, y_0 + k_3)$ で $(x_0, y_0)$ から $h$ だけ進み、$k_4$ を得ます。
$$k_4 = h f(x_0 + h, y_0 + k_3)$$
- 以上の加重平均として、点 $(x_1, y_1)$ を得ます。
$$k = \frac{1}{6}(k_1 + 2 k_2 + 2 k_3 + k_4)$$
$$y_1 = y_0 + k$$
課題55:ルンゲ・クッタ法
$x_0 = 1$ で $y_0 = 2$ となる初期条件で微分方程式
$$\frac{dy}{d x} = 2 - \frac{y}{x}$$
を満足する関数 $y$ の $x = 2$ における値をRunge-Kutta法で求めるためのプログラムをPythonで作成してください。刻み幅を変えた時にどうなるかも考察してください。
ただし Sympy
や Scipy.integrate.odeint
を使わないこと(答え合わせには使っても良い)。インターネットで検索して得たプログラムをそのまま使ったり改変して使っても構いませんが、そのときは取得元のURLを明記してください。
課題提出方法
-
基本的にGoogle Colaboratoryを用いてプログラミングしてください。どうしても Google Colaboratory を用いることができない場合のみ、Jupyter Notebook または Jupyter Lab を用いてください。
-
課題1つごとに、ノートブックを新規作成してください。1つのノートブックで複数の課題を解かないでください。
-
ノートブックを新規作成すると「Untitled.ipynb」のような名前になりますが、それを「学籍番号・氏名・課題番号」のような名前に変更してください。
-
質問・感想・要望などございましたらぜひ書き込んでください。
-
もし課題を解くにあたって参考になったウェブサイトがあれば、それについても触れてください。
-
課題を計算し終わった ipynb ファイルを提出するときは、指定したメールアドレスに Google Drive で共有する形で授業担当者に提出してください。