パラメータ設定
方程式タイプ
指数減衰: dy/dt = -ky
ロジスティック成長: dy/dt = ry(1-y/K)
調和振動子: d²y/dt² = -ω²y
Van der Pol: ẍ - μ(1-x²)ẋ + x = 0
リセット
精度の次数
大域誤差(Global Error):
Euler: $\mathcal{O}(h)$ | RK2: $\mathcal{O}(h^2)$ | RK4: $\mathcal{O}(h^4)$
Euler法 (1次精度):
$$y_{n+1}= y_n + h\,f(t_n,\,y_n)$$
ホイン法 RK2 (2次精度):
$$k_1 = f(t_n,y_n),\quad k_2 = f(t_n+h,\,y_n+hk_1)$$
$$y_{n+1}= y_n + \tfrac{h}{2}(k_1+k_2)$$
Runge-Kutta 4次 (4次精度):
$$k_1=f(t_n,y_n),\; k_2=f\!\left(t_n+\tfrac{h}{2},y_n+\tfrac{h}{2}k_1\right)$$
$$k_3=f\!\left(t_n+\tfrac{h}{2},y_n+\tfrac{h}{2}k_2\right),\; k_4=f(t_n+h,y_n+hk_3)$$
$$y_{n+1}=y_n+\tfrac{h}{6}(k_1+2k_2+2k_3+k_4)$$
計算結果
大域誤差 |y_num − y_exact| vs t
理論・主要公式
$$y_{n+1} = y_n + h f(t_n, y_n)$$
Euler法(1次精度):\(h\) 刻み幅、\(f\) 右辺関数。局所打ち切り誤差 \(O(h^2)\)
$$k_1 = hf(t_n,y_n),\quad k_2 = hf\!\left(t_n+\frac{h}{2}, y_n+\frac{k_1}{2}\right)$$
Runge-Kutta 2次(RK2):ミッドポイント法、誤差 \(O(h^3)\)
$$y_{n+1} = y_n + \frac{1}{6}(k_1 + 2k_2 + 2k_3 + k_4)$$
古典的 RK4(4次精度):精度と計算コストのバランスが最良、誤差 \(O(h^5)\)
常微分方程式の数値解法とは
🙋
「常微分方程式の数値解法」って何ですか? 教科書に書いてある解き方と何が違うんですか?
🎓
大まかに言うと、コンピュータで微分方程式を解くための「レシピ」だね。例えばバネの振動や化学反応の濃度変化など、時間とともに変化する現象をシミュレーションするんだ。このツールでは、代表的な3つのレシピ(Euler法、RK2、RK4)を並べて比較できるよ。上の「ステップ幅 h」のスライダーを動かすと、計算の粗さが変わって誤差がどう変わるか、一目でわかるようになってる。
🙋
え、ステップ幅を大きくすると誤差が増えるんですか? それぞれの方法でどれくらい違うんですか?
🎓
そう、ステップ幅が大きい(計算が粗い)ほど誤差は大きくなる。でも、その増え方が方法によって大きく異なるんだ。例えば、ステップ幅hを0.1から0.2に倍にしてみて。Euler法(青)の誤差はだいたい倍になるけど、RK4(緑)の誤差は16倍くらいに跳ね上がる理論だ。逆にhを小さくすれば、RK4の精度が圧倒的に良くなるのがグラフで確認できるよ。この「誤差の増え方の度合い」を「精度の次数」って呼ぶんだ。
🙋
なるほど!でも、一番精度の高いRK4をいつも使えばいいのではないですか? なんでEuler法みたいな精度の低い方法があるんですか?
🎓
良い質問だね。実務では計算コストと精度のトレードオフを考えるんだ。RK4は1ステップ進めるのに4回も関数計算が必要で重い。一方、Euler法は1回で済むから速い。例えば、ゲームの簡単な物理演算や、制御システムの超高速なループではEuler法が使われることもあるよ。このシミュレーターで「Van der Pol方程式」を選んで、非線形係数μを大きく(例えば5以上)してみて。RK4でも発散しそうになるけど、Euler法はもっと早く破綻するのがわかる。こういう「硬い」問題では、また別の解法が必要になってくるんだ。
よくある質問
ステップ幅hを小さくすると必ず精度は上がりますか?
はい、一般的にはhを小さくするほど各解法の誤差は減少します。ただし、hを極端に小さくすると計算回数が増え、丸め誤差が蓄積する場合があります。また、Euler法はhを小さくしても収束が遅いため、実用的にはRK4など高次解法と適切なhの組み合わせが推奨されます。
Euler法、ホイン法、RK4の違いは何ですか?
Euler法は1次精度で勾配を1回だけ評価する最も単純な方法です。ホイン法(RK2)は2次精度で2回の中間評価を行い、RK4は4次精度で4回評価します。精度が高いほど同じhでの誤差が小さくなりますが、1ステップあたりの計算コストは増加します。
厳密解がわからない場合でも誤差を確認できますか?
直接的な誤差は測定できませんが、hを半分にしたときの解の変化量を確認することで精度を推定できます。例えば、RK4ならhを半分にすると誤差が約1/16に減少するため、変化が小さければ信頼性が高いと判断できます。本ツールでは厳密解が既知のモデルで比較しているため、直感的に理解できます。
このツールで解ける微分方程式の種類に制限はありますか?
本ツールは一階常微分方程式の初期値問題を対象としています。高階の方程式は連立一階系に変換すれば解けますが、現在のインターフェースではf(t,y)を直接入力する形式です。非線形な方程式や剛性問題も扱えますが、剛性が強い場合はEuler法では安定性に注意が必要です。
実世界での応用
CAE・構造解析: 自動車の衝突シミュレーションや建物の地震応答解析では、運動方程式(二階のODE)を時間積分して変位や応力を求めます。陽解法の代表格である中央差分法は、本質的に速度と加速度に関するEuler法の一種です。RK4のような高次手法は、精密な軌道計算などで用いられます。
制御システム: ロボットアームの軌道制御や航空機の自動操縦では、センサーからのフィードバックに基づき、ミリ秒単位で制御指令を計算します。計算リソースとリアルタイム性が厳しいため、Euler法などの軽量な数値積分が使われることがあります。
化学プロセス・バイオリアクター: 化学プラントでの反応器内の物質濃度や、バイオリアクターでの細胞増殖(ロジスティック成長)の予測にODEが使われます。複雑な連立方程式を解くため、安定性の高い数値解法の選択が重要になります。
電気回路・非線形振動: Van der Pol方程式は、トランジスタ発振回路などの非線形電子回路のモデルとして現れます。このような自励振動系の安定な周期解(極限サイクル)を求めるには、数値解法が不可欠です。
よくある誤解と注意点
まず、「高次=常に正義」という考えは危険です。確かにRK4は精度が高い ですが、計算コストも4倍。例えば、リアルタイム性が求められるロボットの制御ループ(1kHz=1msごとに計算)では、Euler法が選ばれることも珍しくありません。このツールで「調和振動子」を選び、ステップ幅h を0.01程度まで小さくしてみてください。RK4とEuler法のグラフがほぼ重なり、誤差も視認できなくなるはずです。この場合、計算速度が速いEuler法の方が実用的です。
次に、「ステップ幅を小さくしすぎる」 ことによる弊害を見落としがちです。h を極端に小さくすると、計算ステップ数が膨大になり、丸め誤差が蓄積してかえって精度が悪化する場合があります(「刻み幅地獄」と呼ばれることも)。また、Van der Pol方程式で非線形係数μを大きくすると、現象の時間スケールに急激な変化が生じます。このような「硬い方程式」では、RK4のような陽的解法ではh を非常に小さくしないと発散し、現実的な計算時間で解けません。このケースでは、陰的解法や stiff専用ソルバーの必要性を実感できます。
最後に、初期値とパラメータの感度 を軽視しないでください。ロジスティック成長モデルで、成長率r や環境収容力K を少し変えるだけで、解の挙動は大きく変わります。数値解法は「与えられた微分方程式を解く」だけなので、モデル自体やそのパラメータが現実を正しく反映しているか、常に疑う姿勢がエンジニアには求められます。