テスラノートテスラノート物理シミュレーションとAIとその応用。空間の離散化はやったが、時間項の離散化はまだだったので、解説していきます。簡単の為に、1次元熱拡散方程式で考えていきます。1次元は下のようになるのでした。\label{eq:scale-factor-1}\end{align}$$空間微分の方は離散化すればいいです。\label{eq:scale-factor-2}\end{align}$$時間項はどうしたらいいのでしょうか?とりあえず\eqref{eq:scale-factor-1}の右辺をFと置いて積分を試してみます。\label{eq:scale-factor-3}\end{align}$$左辺はいいとして、右辺は無理ゲーです。Fは時間的に変化するに決まってるので、時間の関数にもなっていることは確実ですが、その形が全然わからないので、積分しようがありません。そこで、時間に対しても離散化を試みます。方法としては、単純に考えると上の3通りの方法が考えられます。空間ではi点での値を\(T_i\)と表したように、n時点での値を\(T^n\)と表します。n乘ではないので注意してください。左の近似を考えると、\eqref{eq:scale-factor-3}式は以下のように近似できることになります。\label{eq:scale-factor-4}\end{align}$$このようなn時点での値を使ってn+1時点の値を求めるような、近似の仕方を「陽解法」と言います。陽解法では、前の値を代入してやればそのまま解けるシンプルな方法ですが、どんどん誤差が大きくなってしまったり、適切に時間幅等を決めないと発散してしまったりします。次に真ん中の考え方でやると以下のようにも近似することができます。\label{eq:scale-factor-5}\end{align}$$この方法を「陰解法」と言います。この式を満たすように、連立方程式を解いて値を決めてやると言うイメージです。発散の心配がなく、こっちの方法を採用することがほとんどです。一つ、右の考え方でやると以下のようになります。\label{eq:scale-factor-6}\end{align}$$この近似方法は陰解法に分類されるのですが、この場合を「クランク・ニコルソン法」と言います。陰解法の解き方の前にまず、どのようなものを解くのかを把握していきます。それぞれi、Iとして陰解法で離散化していくと、次のようになります。\\\\&(i=1,2,...,I)\end{align}$$この式にi=1,2...,Iまで入れていくと、I個の連立方程式ができるのが分かるでしょうか?それを行列にしてやります。i=1,Iは境界条件にあたり表現がめんどくさいので省いて行列でかくと、下のようになります。本来は、I=1,Iも入れてやって、そこに当たる行列の成分には境界条件から導くものが入ります。\right]\end{align}$$と、このようになります。この連立方程式を解いてやればいいです。これはこれで難しいのですが。逆行列が求まるなりすれば、これは解けます。1次元はこれでできました。1次元ならできることがわかりますが、3次元になったらどのようにすればいいのでしょうか?以外と1次元で分かった気になって、3次元の場合が分からなくなったりします。3次元だから、3つ行列を解くのかな?みたいな勘違いをしたり。3次元の場合も同じだが、ちゃんと1つの連立方程式にします。でかいけど、行列を求めてみます。3次元の場合の離散化式はx,y,z方向の格子番号をそれぞれi,j,kとして次のようになります。x_3\)だと書きにくいので、x,y,zを使うことにします。k=1,2,...,K)\end{align}$$メッシュに振られた番号としては、このようになっているはずです。K\)の行列を作ってやるしかないです。上の図のような順番で行列に入れてやります。I,J,1まで行ったら、i,j,k=1,1,2としてと繰り返して、超巨大な行列にするのです。でかすぎるが、行列にするとこんな感じです。横スクロールできるはずなので見てください。イメージがつかめると思います。1+2X+2Y+2Z=Wと置いてあります。\right]\end{align}$$この行列は、(I-1)(J-1)(K-1)行、(I-1)(J-1)(K-1)列の行列です。境界条件もぶっこむ場合は、I*J*K行I*J*K列の行列を作ることになります。WとYは、I-1分離れていて、WとZは、(I-1)(J-1)分離れています。このイメージを頭に入れておくといいと思います。先ほど、行列を出しましたが、陰解法で時間ステップを進めるとは、先ほどの逆行列を解くという行為に他なりません。コンピュータを使ったとしても、あんな行列の逆行列を求められるでしょうか?まあ一応、できます。法と呼ばれ、完全LU分解とかが代表例ですかね。非常に計算時間がかかります。そこで、反復法というものを使用します。反復法の思想自体は非常に簡単です。\eqref{eq:scale-factor-5}式で考えてみます。簡単な考え方としては、こうです。\(T_{n+1}\)に\(T_{n}\)の値を入れてとりあえず計算してみます。して出てきた\(T_{n+1}\)を\({}^{2}T^{n+1}\)として、再び代入します。左上の添字は反復回数です。\)となったら、この方程式を解けたと言えないでしょうか?反復法の原理自体はこんな感じです。これと同じ作業を行列でやります。こんな単純なプログラムでは多分収束するがすごく遅いです。}\)として、これを掛けて収束を早くしたりします。このアイデアが使われているアルゴリズムは、共役勾配法と呼ばれます。シンプルな方法は、ヤコビの反復法や、ガウス-ザイデル法とかがあります。収束を早くするには不完全LU分解等の前処理が必須で、前処理付き共役勾配法をPCGと言って流体計算だけ出なくいろんな行列計算に広く使われるものとなっています。プログラムを実装する時に、ちゃんとやりますが、東京大学さんの資料が割とわかりやすいので読んでみるといいと思います。流体力学の重要な定理にベルヌーイの定理というものがあります。運動量保存則が完成しました。プログラムは、以下の書籍の内容やプログラムを参考にして作ってます。コメントをキャンセルメールアドレスが公開されることはありません。