TI-Nspire & Lua / 常微分方程式の数値解法のまとめ (『パソコンで見る天体の動き』) / クロージャを利用する

パソコンで見る天体の動き』に解説してある常微分方程式の数値解法を Euler 法以外全部 Lua で実装したのでここにまとめておく。全部クロージャを利用している。

  • ここで言う「特殊な方程式」とは独立変数も 1 次微分の項も含まない 2 階微分方程式のことである。
  • ここで函数化した数値解法はいずれも、h 後の更新された初期値を返す函数を返す函数である。更新された初期値はそれぞれのインスタンスに保持される。
  • h および (h/numOfDiv) は、有限の2進数で表現できる値にすることが望ましい。
引数 説明
{funcs} 方程式リスト
t0 独立変数初期値
{inits} 従属変数 (未知函数) 初期値リスト
{initsDot} 従属変数 (未知函数) の 1 次微分の初期値リスト
{pairsOfInits} 段数に応じた従属変数 (未知函数) 初期値ペア
h 刻み幅
numOfDiv 1 刻みの内部分割数 (デフォルト値は 1)
tol 1 刻み後の許容差 (デフォルト値は 0.001)

 
 
1. 古典的 Runge-Kutta 法
 構文: rkClassic({funcs}, t0, {inits}, h [, numOfDiv])
 返値: h 後の t0, {h 後の inits}  (を返す函数)

 
2. Shanks による 12 段 8 次の Runge-Kutta 法
 構文: rkShanks8({funcs}, t0, {inits}, h [, numOfDiv])
 返値: h 後の t0, {h 後の inits}  (を返す函数) 
3. 特殊な方程式に対する Nyström 法 (5 次)
 構文: nystroem({funcs}, t0, {inits}, {initsDot}, h [, numOfDiv])
 返値: h 後の t0, {h 後の inits}, {h 後の initsDot}  (を返す函数) 
4. Fehlberg 法 (6 段 5 次 & 4 次)
 構文: fehlberg({funcs}, t0, {inits}, h [, tol])
 返値: h 後の t0, {h 後の inits}, 分割数  (を返す函数) 
5. 特殊な方程式に対する 4 段の Cowell 法
 構文: cowell4({funcs}, t0, {pairsOfInits}, h)
 返値: h 後の t0, {h 後の pairsOfInits の先頭の inits}, 近似回数  (を返す函数) 
6. 特殊な方程式に対する 7 段の Cowell 法
 構文: cowell7({funcs}, t0, {pairsOfInits}, h)
 返値: h 後の t0, {h 後の pairsOfInits の先頭の inits}, 近似回数  (を返す函数) 
7. 補外法
 構文: extrapolation({funcs}, t0, {inits}, h [, numOfDiv])
 返値: h 後の t0, {h 後の inits}  (を返す函数) 
8. 特殊な方程式に対する補外法
 構文: gragg({funcs}, t0, {inits}, {initsDot}, h [, numOfDiv])
 返値: h 後の t0, {h 後の inits}, {h 後の initsDot}  (を返す函数) 
9. Nspire の組込函数である rk23() も同じような形で使えるようにする。
 構文: 未
 返値: 未 
参考:
パソコンで見る天体の動き

パソコンで見る天体の動き