第6-1回 時間二次精度化(ルンゲクッタ法、有限体積法)[python]
第5回では、有限体積法を用いてSod shock tubeに対する数値解析を行い、次の結果を得ました。
青:厳密解 赤:解析解
定性的に特徴は捉えられていますが、時間、空間ともに一次精度であるため、急峻な変化をとらえることができていません。(x=0.7,0.85付近)
そこで、第6回を通して時間、空間の高次精度化を行いたいと思います。
まず、ルンゲクッタ法を用いて時間の二次精度化を行います。
この方法は、時間一次精度の数値流束をnステップとn+1ステップにおいて求め平均化し、n+1/2ステップの数値流束を用いて時間を進めるという方法になります。
式としては次のようになります。*は結果として用いる値でなく、計算途中で出てきた値と思ってください。
一次精度で次の時間の保存量を求めます。
$$(Q^*_i)^{n+1}=Q^n_i-\frac{\Delta t}{\Delta x}(\tilde{f}_{i+1/2}^n- \tilde{f}_{i-1/2}^n)$$
一次精度で次の時間のフラックスを求めます。(FVSなど、右辺の取り方は様々)
$$ (\tilde{f}^*_{i+1/2})^{n+1}=F((Q^*)^{n+1} ) $$
nとn+1のフラックスの平均を取り、二次精度のフラックスを作ります。
$$\tilde{f}^{n+1/2}_{i+1/2}=\frac{1}{2}( \tilde{f}^*_{i+1/2})^{n+1} + \tilde{f}_{i+1/2})^{n} )$$
上記のフラックスを用いて、時間を進めます。
$$Q^{n+1}_i=Q^n_i-\frac{\Delta t}{\Delta x}(\tilde{f}_{i+1/2}^{n+1/2}- \tilde{f}_{i-1/2}^{n+1/2}) $$
この方法は時間項に対して何もしていませんが、フラックスの時間項が変化しており、全体として時間二次精度になっています。
方法としては終わりですが、プログラミングの際にフラックスの枠を一つで済ませるように、プログラミング用の式を書いておきます。
一次精度で次の時間の保存量を求めます。
$$(Q^*_i)^{n+1}=Q^n_i-\frac{\Delta t}{\Delta x}(\tilde{f}_{i+1/2}^n- \tilde{f}_{i-1/2}^n)$$
一次精度で次の時間のフラックスを求めます。(FVSなど、右辺の取り方は様々)
$$ (\tilde{f}^*_{i+1/2})^{n+1}=F((Q^*)^{n+1} ) $$
上記の値を用いて、時間を進めます。
$$Q^{n+1}_i=\frac{1}{2}(Q^n_i+(Q^*_i)^{n+1}-\frac{\Delta t}{\Delta x}(
(\tilde{f}^*_{i+1/2})^{n+1} –
(\tilde{f}^*_{i+1/2})^{n+1} ))$$
次回は空間高次精度化を行いたいと思います。
*第6-5回にコードは書いてあります。
by hide
コメントを残す