\label{eq:scale-factor-3}\end{align}$$次に、微分方程式\eqref{eq:scale-factor-1}を差分近似します。\label{eq:scale-factor-4}\end{align}$$となります。ここまではいいでしょう。\right]\end{align}$$できました!あとは、この連立方程式を解けば終わりです。行列を書くとき、境界条件も入れてもいいですが、プログラム上では境界条件は別に書くことが多いので、基本的に行列でも書かないことが多いです。境界条件を満たすように行列の中に入れて別に書いても大丈夫です。今回の連立方程式は3項方程式と呼ばれるもので、トーマス法と呼ばれる方法で解くことができます。3項方程式を一般的に書いてみます。\label{eq:scale-factor-5}\end{align}$$\(x_1\)と\(u_1\)対応していて、あとは同じものだとわかります。それを、こんな感じに順番に消去していって最後まで行きついてから、また逆に辿っていくという解法で解けます。こんな感じで\(x_1\)を消去します。s_2}{g_2}\end{align}$$置き換えで常に同じ形にするのがポイントです。s_{i-1}}{g_{i-1}}\end{align}$$となります。この式はi=2,...Mで成り立ち、i=Mの時は、\(C_M\)がない為、\(C_M\)の部分を0とし、ここで\(x_M\)が求まります。\label{eq:scale-factor-10}\end{align}$$これで\(x_M\)求まり、\eqref{eq:scale-factor-9}式から、i=M-1の時を考え、\(x_{M-1}\)が求まります。このようにして順々に求めていくことができます。プログラムではプログラムを実装しましょう。僕の好きな数値解析ソフトOpenFOAMがC++なのと、地味に好きな数値解析専用言語freefem++という言語もC++ベースなので、C++で書きますが、githubの方にはCとfortranとpythonで書いたものを上げようかと思います。元々のCからC++仕様に書き換えているので、確実にCはあると思います。以下のプログラムは、冒頭でも紹介した「流体解析の基礎」から少しデバッグ・改変して使っています。要素数nで、0.0に初期化した配列を作成するが、なぜか2から始めるため一個多く確保する。s=dなのでそのまま使用。要素数nで、0.0に初期化した配列を作成するが、なぜか2から始めるため一個多く確保する。s=dなのでそのまま使用。sを算出}d[iu]=d[iu]/b[iu];for(i=ip;i<=iu;i++){j=iu-i+il;d[j]=(d[j]-a[j]*d[j+1])/b[j];}return;}解説です。解説ファイルが付いているので、それを読みます。このプログラムは常微分方程式の境界値問題を解くプログラムである。トーマス法の関数を呼んでいる。次のループは結果の表示のためのものであり、厳密解と比較している。差分方程式の右辺の値を記憶する配列、サブルーチンTHOMASを呼んだあとでは近似解が記憶される。厳密解との相対誤差(%)といった感じです。一応C++をあまり書いたことのない人向けに少しだけ解説を入れます。vectorは配列のクラスです。動的に配列を確保できますが、最初に要素数を定義してしまっています。これは初期化のためで、最初から配列の要素にアクセスできるようにするためです。mx+1個にしているのは、C言語の配列は0から始まるため、u[0]が一個目の値で、u[mx+1]がmx個目の値なのですが、分かりやすくするためこうしてます。慣れたら、0から始めます。C++書いたことない人は、まずはC言語の苦しんで覚えるC言語でも軽くみて、一週間で身につくC++言語の基本でも流し読みすれば十分です。BVP.cppというファイルに保存して、実行してみます。BVP.cpp./a.outこれでoutput.datというファイルが書き出されると思います。コード置いときますgnuplotで可視化するために、output.gpというファイルを作ります。"anime.plt"これでgnuplotで可視化してみます。output.gpグラフが書かれるかと思います。この微分方程式が本質的にどのようなものかというと、まず時間項がありません。定常解析と呼ばれるものです。実際に、流体でも定常解析をする時は時間項を無くしてときます。すると、ある解に落ち着くはずです。対象が熱であれば、熱が広がり切って安定した状態の空間的な分布を求めている、といった状況になります。...非圧縮性流体の計算アルゴリズム-格子について前回、MAC法で方程式を導きました。流体を学ぶ前に、流体とは何かから行きましょう。コメントをキャンセルメールアドレスが公開されることはありません。