テスラノートテスラノート物理シミュレーションとAIとその応用。前回、の続きでRunge-Kutta法という天才的なアルゴリズムをみていきます。\label{eq:scale-factor-1}\end{align}$$とします。一階の常微分方程式とします。流体の支配方程式は偏微分方程式として記述されるのですが、時間項の扱い時は常微分方程式として考えます。別に時間の偏微分のままで考えても全く変わらないのですが、空間が入ってない方が考えやすいのでそうして考えます。していい理由を説明します。ここで、1次移流拡散方程式を考えます。と独立変数xの双方に依存するので、uは偏微分方程式として記述せざるを得ません。f=f(t,x)\)として、これらの係数も時間と空間依存するとします。ここで、空間についてだけ中心差分で離散化します。\)となり、xの依存はなくなり、偏微分方程式から、常微分方程式になります。\nu_i(t)\)となって時間のみです。このように、流体の支配方程式を空間離散化した後は、時間の常微分方程式になります。\)に直しただけのことで時間の偏微分と空間を離散化して時間の常微分にすることは全くの同値なのですが、Runge-Kuttaの場合は手順的にもこうしますし、分かりやすいのでこうします。Runge-Kutta法Runge-Kutta法だけはまた毛色が違うアルゴリズムになっています。一応、Runge-Kutta法は陽解法と書きましたが、陰解法のRunge-Kutta法もあります。一般にRunge-Kuttaと言えば陽的Runge-Kuttaを指しますが、同じ発送で陰的Runge-Kuttaを作ることもできます。t)の安定幅が高次になるに比例して広がっていくこと、比較的少ない計算で高い精度が得られるからです。係数が簡単なこと、4次までは比例して精度が伸びていくことから、4次のRunge-Kutta法は頻繁に使われます。陽解法の一般的に指すRunge-Kutta法をやっていきます。冒頭にあった、陽解法や陰解法の基本的な考えがあったと思いますが、Runge-Kuttaの考え方はこうです。細かく途中で刻んでいくイメージです。本当は途中の点などの重み付け平均なので違いますが、あくまでイメージです。それをうまく使って、精度を上げます。f(t,u)\end{align}$$となっているとします。fは当然、uの関数でもあり、tの関数でもあります。Adoms-Bashforthの時のように、uをtについて、n周りで展開します。意味は同じですが、Runge-Kuttaはこう書かないとやりずらい時もあるので説明のために一旦こうします。別にどっちでやっても書き方が違うだけですが、最初の導入はこっちの方が僕は好きなだけです。\label{eq:scale-factor-4}\end{align}$$この時、\eqref{eq:scale-factor-4}式の第3項以下を誤差項にすればオイラー陽解法になります。t\)で割るので、精度は1です。\label{eq:scale-factor-6}\end{align}$$とする方法が考えられます。あとはこれをうまく閉じていきます。ここで、uはtの関数であるので、f(t,u)をtで微分する際には、tによって変化するuの変化分も考えなければなりません。\label{eq:scale-factor-7}\end{align}$$ここでは、各変数の偏微分を(f_t)などとして表しています。これは、そのままtの偏微分で書いても、uはtの関数なので、偏微分でも成り立つと思うのですが、ちょっと微妙なので、厳密性のために常微分にしておきました。\label{eq:scale-factor-8}\end{align}$$になります。u)だけ進んだ点の2変数のTaylor展開を考えていきます。係数がちょっと変なのは後に一般化するためです。f(t,u))と近似できます。Taylor展開をさらにやるので、2次以下のものはなくなると考え、気にしません。2変数のTaylor展開を使うと、こうなります。\label{eq:scale-factor-10}\end{align}$$なんとなく見えてきたでしょうか?このTaylor展開で算出した式と、\eqref{eq:scale-factor-8}式の括弧の中は変数を合わせれば一致しそうです。a_{21}=1/2\)だと思ってやると、修正オイラー法という方法になります。\label{eq:scale-factor-11}\end{align}$$このままじゃ少し足りないので、もう一工夫加えます。\(f(t,u)\)も使うことを考えます。a_{21}=1/2\)を満たせば、\eqref{eq:scale-factor-8}式の括弧の中と一致します。これが、2次のRunge-Kutta法の条件式です。先ほどのは修正オイラー法はRunge-Kutta法の一種ではありますが、一般には修正オイラー法と呼ばれる解法です。このように、Runge-Kutta法では2次では変数4つに対して、条件式が3つと解が無数にある状況になっています。亜種がたくさんあります。簡単なのが正義なので、簡単になる解を決めていきます。c_2=a_{21}=1\)とします。\label{eq:scale-factor-13}\end{align}$$となります。これが一般的に指す2次のRunge-Kuttaです。\label{eq:scale-factor-14}\end{align}$$という式で使われます。これは、まず\(s_1\)を出してから、\(s_2\)を出すというアルゴリズムのため、このように記述されることが多いです。\label{eq:scale-factor-16}\end{align}$$と書くべきでしょう。tはややこしいので、Tの値を\(T_i^n\)などとして、t時点であることを表現します。\label{eq:scale-factor-17}\end{align}$$という形になります。空間が離散化されているものに対して考えるので少しややこしいですね。s_1\)の部分で、tの時点はうまく表現されているので、tのところはあまり気にしないことです。\)を先に全部求めてから、\(s_{2.i}\)を算出しにいきます。これを一般化していきます。2段2次の陽的Runge-Kutta法は以下の式で与えられます。s_2\)などのように、何個算出するかを段と呼び、その時の精度と組み合わせて、2段2次陽的Runge-Kutta法と表現します。s段の陽的Runge-Kutta法の到達可能精度p(s)は以下になることが知られています。s-2\)精度と計算量の兼ね合いから、4段4次精度公式がもっとも効率がいいことがわかると思います。4段4次精度のものを求めて行こうかと思います。2段の時と発想は同じです。\label{eq:scale-factor-19}\end{align}$$とおきます。a_{21}\)を使って置いたものと全く同じです。a_{33}\)などがないのは陽的だからです。ここで、こういった項が入ると、陰的または半陰的のRunge-Kutta法になります。後は、元のTaylor展開の式に4次の項まで一致させます。u(t))\)の時間微分を求めていきます。\label{eq:scale-factor-20}\end{align}$$と書けます。\label{eq:scale-factor-21}\end{align}$$とします。このまま、u(t)のTaylor展開の高次の項まで求めていきます。t^4)までの係数を比較すると、13個の未知数に対する、11個の方程式が得られます。\label{eq:scale-factor-23}\end{align}$$そして、一番簡単で有名解として、1/6公式というものがあり、次式で与えられます。\label{eq:scale-factor-24}\end{align}$$覚えやすくていいですね。他にも1/8公式なんてのもあります。ここで、より一般化していきます。\label{eq:scale-factor-26}\end{align}$$という条件が付きます。これは今までも実は暗に満たされていたのですが、係数を比較すると必ず出てくる条件です。係数の表現方法として便利なので、ブッチャー配列を導入します。\end{array}\end{align}$$ブッチャー行列だと、先ほどのcの条件がわかりやすくて便利ですね。横にみて、cとaの合計が一致してないとだめという形です。\)に対して\(a_{ij}=0\)、つまりaの上三角成分を0にしたものです。\end{array}\end{align}$$となっているものです。これが陽的になる理由はなんとなく分かるでしょうか?陽的とは逆行列(連立方程式)を解くというステップが必要のないそのままの計算でできる方法をさします。先ほどの4段4次のRunge-Kuttaの1/6公式はブッチャー行列で表現するとこうなります。\end{array}\end{align}$$そんで、1/8公式と呼ばれるものはこんな感じです。\end{array}\end{align}$$最後に、\eqref{eq:scale-factor-25}式のような形で表現してきましたが、もう一つ表現方法があります。\eqref{eq:scale-factor-25}式もう一度書いておきます。\label{eq:scale-factor-28}\end{align}$$という式も構築できます。関数の部分を出しただけです。導出が簡単なのと、最初が理解しやすいので前者の方を使っていましたが、後者の方がアルゴリズム的に書きやすい人も多いので、どちらも知っておくといいと思います。陰的Runge-Kutta法では次に、陰的Runge-Kutta法を見ていきます。陰的になった式で連立方程式を解いていくことになります。\)に対して、\(a_{ij}=0\)とするものに対して半陰的Runge=Kutta法と呼びます。s+1\)になることが知られています。\label{eq:scale-factor-30}\end{align}$$となり、\(s_1\)と\(s_2\)の連立方程式、もしくは\(u^{(1)}\)と\(u^{(2)}\)の連立方程式を解いた後に\(u^{n+1}\)を計算します。これ計算量が半端ないの分かるでしょうか?1つの式に対しても陰的になっているので空間のいろんな点が入った行列の連立方程式をときますが、それが2つあってさらにそれ同士の連立方程式なんで、半端ないっす。