Numerov法は一階微分方程式を含まない二階微分方程式を解くのに便利な方法である。
この方法を適用するには、等間隔の変数刻み(メッシュ or グリッド)が必要である。
しかし、変化が穏やかなところでは粗いメッシュで十分だが、一方で変化が急なところでは細かなメッシュを用いなければ誤差が大きくなってしまうため、等間隔メッシュの使用は無駄が多い。
そこで、「細かいところは細かく、そうでないところは粗い、理想的なメッシュ」と対応する「等間隔なメッシュ」に変数変換し、変換後の方程式をNumerov法で解くことを考える。
変換前と後のメッシュをとして、という関係で結ばれているとする。
は等間隔なので、最初の点をとして、
と与えられる。はそれぞれのメッシュと点数である。
ここから、
と逆変換したいところだが、関数系が複雑だと、解析的に書けない。
そこで、ととして、を与えるを数値的に求めて、それをとして保存しておけば良い。
を解くための数値計算法として、Newton法が簡便であるが、ここでは立ち入らない。
ニュートン法とは何か??ニュートン法で解く方程式の近似解 - Qiita
次に、二階の微分演算子を変数変換する。
数値計算をするのはに対してだから、での二階微分から出発して、の二階微分とどう繋がるのかを見る。
とすると、
重要なポイントとして、一次微分が残っているとNumerov法が使えない。
そのため、として、上手いことの項を消すようなを考える
(を欲しい関数とすると上手く行かないから、本当に欲しい関数をとして、そこにを掛けた仮の関数をと置き直すという流れ)。
準備として、
したがって、
よって、を残さないためには、
両辺を積分すれば、
という形でが分かっているから、その微分は容易である。
今、欲しい関数はに置き直していて、の二階微分方程式がで与えられているとすれば、
は元の微分方程式にあった係数が修正されたもので、一方は変数変換によって新たに付け足された項となる。
これをNumrov法で解けば良い。
具体例として、linear-log mesh を使ってみる。
係数を手計算するのは面倒くさいので、pythonのsympyにやらせることにする。
from sympy import * r, alpha, beta = symbols( "r α β" ) rho = alpha * r + beta * log( r ) rhop = Derivative( rho, r ).doit() rhopp = Derivative( rhop, r ).doit() a = sqrt( rhop ) ap = Derivative( a, r ).doit() app = Derivative( ap, r ).doit() c = simplify( - rhopp / (rhop**3) * ap / a + 1/(rhop**2) * app / a )
結果
sympyをもっと有効活用して行きたい。