Lax-Wendorff法

波動方程式の初期値問題を解くときに一番ましな方法らしい。色々とあって、誤差の増幅の度合とかを調べられるんだけど、まあそこはスルー。要するに、Fourier級数的な解があるとして、そのスペクトルの大きさを調べる的なことをやるとできる。
多分蛙跳び法と、Lax-Wendorff法が一番まし。
Lax-Wendorff法は、二次精度で、数値的な散逸が出てくるから安定らしい。
実際には、波動方程式が、
  \frac{\partial u}{\partial t} = \frac{\partial v}{\partial x}, \\ \frac{\partial v}{\partial t} = \frac{\partial u}{\partial x},
であたえられてて、未知数u、vが、
  \vec{w}=(u,v), \vec{F}=(v,u)
で与えられてたとすると、支配方程式が、保存形で、
  \frac{\partial\vec{w}}{\partial t} = \frac{\partial\vec{F}}{\partial x}
になる。
一般的に、未知数wの時間について次のステップの値を求める場合は、フラックスの項Fの空間についてのメッシュの中点を取った方が精度がいいらしい。何でかは知らね。時間についても中点を取った方が精度よくねっていう風にしてできたのがLax-Wendorff法らしい。定性的な理解は置いといて、増幅率を計算するとそういうことになるらしい。
ここで、時間について、t=nΔt、空間について、x=mΔxとかして離散化する。同時に、離散化された空間での未知変数とフラックスを、wlmn、Flmnとする。ここで、l=1でw=u、F=v、l=2でw=v、F=uとかしとく。要するに、wとFの行列の中の要素を示す添字みたいな感じ。
そして、一番バカな離散化は、
  \frac{\partial w}{\partial t} \to \frac{w_{m+1}-w_m}{\Delta x}
で、これに則って、時間についてn+1ステップ目の値を手に入れようとすると、
  w^{l}_{m}^{n+1}=w^{l}_{m}^{n}-\frac{\Delta t}{\Delta x}(F^{l}_{m+1}^{n}-F^{l}_{m}^{n})
になる。
けど、これは増幅率を計算すると、何があっても値が発散してくので良くない。ので、空間についてm+1/2とm-1/2をとったものを使ってみる。と、ちょっとマシになる。
つまり、場所を示す添字mでの値をm-1での値とm+1の値の平均値を取って求める。何でこんなのでよくなるかって、そりゃ解にξ^neikm&Delta xを入れると分かる。
そこで時間について1/2ステップ進めたときの値を、
  w^l_{m+\frac{1}{2}}^{n+\frac{1}{2}}=\frac{1}{2}(w^l_{m+1}^n+w^l_m^n) - \frac{\Delta t}{2\Delta x}(F^l_{m+1}^n-F^l_m^n)
とかして、これからFを求めて、
  w^l_m^{n+1} = w^l_m^n - s(F^l_{m+\frac{1}{2}}^n-F^l_{m-\frac{1}{2}}^n)
っていう差分式に入れる。と、これがLax-Wendorff法。らしい。
実際に、上の式を波動方程式だとして、バラしてみると、
  w^l_m^{n+1}=w^l_m^n - s(F^l_{m+1}^n-F^l_{m-1}^n) + \frac{s^2}{s}(w^l_{m+1}^n-2w^l_m^n+w^l_{m-1}^n
になって、最後の項が二階の微分形式になってて、これが散逸項であることが分かる。これで誤差が丸められるらしい。あと、sはCourant数で、s=Δt/Δx。実際これで簡単な初期値問題を解くと、それなりに精度が良い。一番よかった。