kajibo.com

2023年12月20日

今日の活動

寝不足の気配を感じる

今日のわんこ

毛をとかしてる間、ひたすらキバむき出しで耐えてた。

Advent Calendar 20日目

微分も積分もできた。じゃあ最後は微分方程式だ。

\(y'(x) = y\)となる微分方程式を考える。また初期値は\(y(0)=1\)とする。

ここではとりあえず、\(x=1\)の結果がわかれば十分としよう。解析的な考えだと実数全体で知りたいとかあるのだろうが、数値的にわかれば十分というケースも多い。そりゃ解析的な答えが分かるに越したことはないが、分からんのだ。

先にいうと答えはモチロン\(y(x)=e^x\)なので、\(y(1)=e\)が知りたい答えである。つまり、2.718ぐらい。


オイラー法だとこうか。

\(y(0+\Delta x) = y(0) + y'(0)\Delta x\)となる。ここで、\(\Delta x = 1\)とすると

\(y(0+1) = y(0) + y'(0)\)

\(y(1) = y(0) + y(0)\)

\(y(1) = 2\)

整数は合ってるが、流石に2.7と比較すると小さい気がする。\(\Delta x = 1\)とした時点でこんな精度だろう。せめて0.5にする。

\(y(0.5) = y(0) + y'(0)\times 0.5\)より

\(y(0.5) = 1.5\)となる。

\(y(0.5 + \Delta x) = 1.5 + y'(0.5)\Delta x\)

\(y(1) = 1.5 + 1.5\times 0.5\)

\(y(1) = 1.5 + 0.75 = 2.25\)

うーん、4回にわけるか。

\(y(0.25) = y(0) + y(0)/4 = 1.25\)

\(y(0.5) = y(0.25) + y(0.25)/4 = 1.25 + 1.25/4 = 1.5625\)

\(y(0.75) = y(0.5) + y(0.5)/4 = 1.5625 \times 5/4 = 1.953125\)

\(y(1) = 1.953125 \times 5/4 = 2.44140625\)

知りたい答えは2.718ぐらいなのだが、100回にわけてもまだ2.704ぐらいで2.71には遠い。数値解を求めるのも大変である。


4次のルンゲクッタ法だとこうか。\(dy/dx = f(x, y)\)とした場合、今回は\(f(x, y) = y\)となるので、

\(k_1 = f(0, y(0)) = y(0) = 1\)

\(k_2 = f(0+\Delta x/2, y(0)+\Delta x /2 \cdot k_1) = y(0)+ k_1 / 2 = 1.5\)

\(k_3 = f(0+\Delta x/2, y(0)+\Delta x /2 \cdot k_2) = 1.75\)

\(k_4 = f(0+\Delta x, y(0)+\Delta x \cdot k_3) = 2.75\)

\(y(1) = y(0) + \Delta x \cdot (1+2 \cdot 1.5+2 \cdot 1.75+2.75)/6 = 2.708\)

あってる?てか一発でこんなに精度いいの?むしろ僕のオイラー法があってる?

ちなみにscipy使っていいならこう。僕の手計算より2.718に近い。確かデフォルトのメソッドがRK45でorderが5(4)だからその差か?

alt属性


本当に申し訳ないが、ゲームをしないといけない時間になった。オイラー法とルンゲクッタ法の手計算と検算に1時間かかるのは予想してなかった。

明日はMyClassを使って解く様子を紹介して大団円で終わろう。

コメントを投稿

注意事項
  • 承認を受けるまでコメントは公開されません。
  • 非公開を希望した場合、コメントは公開されません。

プロフィール

カテゴリ

未実装