移流方程式の時間微分を前進オイラー法で離散化すると, #ref(upwind.eq1.gif,nolink,70%) 1次元の場合を考える.グリッド&ref(upwind.eq2.gif,nolink,70%);(座標&ref(upwind.eq3.gif,nolink,70%);)について, #ref(upwind.eq4.gif,nolink,70%) ここで,&ref(upwind.eq5.gif,nolink,70%);.この&ref(upwind.eq6.gif,nolink,70%);を差分を使って求める. 風上差分ではその名の通り,風上側の値を使って差分を行う1次精度の離散化法である. 1次元の場合,&ref(upwind.eq7.gif,nolink,70%);では座標軸上の右から左に風が吹いているので,風上はi+1, &ref(upwind.eq8.gif,nolink,70%);では左から右に風が吹いているので,風上はi-1となる. #ref(upwind.eq9.gif,nolink,70%) 風上差分はCFL(Courant-Friedreichs-Lewy)条件を満たしていれば安定である. CFL条件によるタイムステップ幅の制限は, #ref(upwind.eq10.gif,nolink,70%) タイムステップ幅は通常これよりもさらに小さい数を用いた方がよい. 係数:CFL数(CFL number)を&ref(upwind.eq11.gif,nolink,70%);とすると, #ref(upwind.eq12.gif,nolink,70%) ここで,&ref(upwind.eq13.gif,nolink,70%);.よく使われるのは&ref(upwind.eq14.gif,nolink,70%);である. **振動と数値拡散 [#d26fa37f] ***振動と数値拡散 [#d26fa37f] 風上差分の離散式(&ref(upwind.eq8.gif,nolink,70%);の場合)を位置&ref(upwind.eq3.gif,nolink,70%);でテーラー展開してみる. #ref(upwind.eq15.gif,nolink,70%) &ref(upwind.eq16.gif,nolink,70%);は空間2階微分であり,これは拡散を表している. 拡散に関する項は,例えば,流体のナビエ・ストークス方程式にもある(&ref(upwind.eq17.gif,nolink,70%);). しかし,これはそれらの項とは異なり,離散化によって生まれた拡散であり,これを数値拡散(numerical diffusion)と呼ぶ. 下の矩形波の移流を見ると風上差分において数値拡散が発生しているのがよく分かる. さて,上式の微分を下で述べる中心差分で離散化してみる. #ref(upwind.eq18.gif,nolink,70%) 風上差分は中心差分に拡散項を加えたものであることが分かる. 中心差分では非常に大きな振動が発生する. その振動を拡散項により抑えているのが風上差分である. この振動を抑えるという考え方は重要である. より高次の関数を使って補間することで振動を抑えるのが,Lax-WendroffやQUICK,QUICKEST,河村・桑原スキームなどで, 2階,3階の微分を使って抑えるのがENOやWENOである. これらに対して,元の形状を保持するという考え方に基づき,異なるアプローチをとるのがCIP法,RCIP法などである. ちなみにRCIP法では数値拡散が発生してしまうので,これを抑えるためのSTAA手法では逆に数値拡散項を引くことで拡散を抑えている.