常微分方程式を近似計算するプログラムをしばらく書いていなかったので、復習がてらまとめてみました。
近似計算の方法はいくつかありますが、基本的にテイラー展開した式の何番目の項まで使うかという問題だと思います。
それなりの精度を必要とするシミュレーションの場合は、ルンゲクッタ法を使うことがほとんどだと思いますが、大雑把な挙動だけ分かればいいという場合にはオイラー法などを用いることもあるようです。
今回は神経科学の研究者には馴染みのある、Hodgkin-Huxley方程式の数値計算を、オイラー法、修正オイラー法、ルンゲクッタ法を用いて行ってみました。
自作のGUIに結果を表示しており、軸が表示されていませんが、横軸は時間で全体が100msec、縦軸が電位で上限が150mV、下限が100mV(ただし細胞外の電位ではなく細胞内の静止電位を0Vとしています)です。
印加電流を10μAにすると規則的に発火することが知られているため、その条件で数値計算を行いました。
まずは刻み幅(dt)を0.1msecにした場合の、オイラー法の計算結果。
途中で電圧の値が発散してしまいました。
次に刻み幅(dt)を0.1msecにした場合の、修正オイラー法の計算結果。
こちらもオイラー法とほぼ同様の結果に。
次に刻み幅(dt)を0.1msecにした場合の、ルンゲクッタ法の計算結果。
こちらでは実験データの即した規則的な発火が起きています。
刻み幅が同じであれば、やはりオイラー法(修正オイラー法)よりもルンゲクッタ法の方が精度のよい結果が得られることが分かります。
最後に刻み幅を(dt)を0.01msecにした場合の、オイラー法、修正オイラー法、ルンゲクッタ法の計算結果。
刻み幅を小さくすれば、Hodgkin-Huxley方程式の場合には、オイラー法でも実験結果を再現することができるようです。
〈参考資料〉
【C言語で数値計算】 常微分方程式の近似計算(オイラー法) - Qiita
ほかに修正オイラー法やルンゲクッタ法の記事も。
http://sstweb.ee.ous.ac.jp/lecture/ee/NumericalCalculations/ncd20061211.pdf
常微分方程式の数値解法
http://www.sit.ac.jp/user/konishi/JPN/L_Support/SupportPDF/Runge-KuttaMethod.pdf
ルンゲクッタ法による常微分方程式の数値解法
CiNii 論文 - Hodgkin-Huxleyモデルの数値シミュレーション : 脳機能の解明に向けて
ODE: from Euler to Runge-Kutta
Euler法とその改良
https://www.nips.ac.jp/huinfo/documents/lecture_10feb2006j.pdf
講義参考資料 井本 敬二
ニューメリカルレシピ・イン・シー 日本語版―C言語による数値計算のレシピ