2次元以上の場の方程式に使える高速解法があります。場の方程式とは、振動や熱電動など、近接作用を前提に作った方程式のこと。
そうでない例は、光の輻射を、速度を無限大と考えてレンダリングする場合。これは場の方程式とは言えません。
場の方程式を数値的に解くのは、空間(や時間)に、等間隔などに代表点を置いて計算します。これは「差分法」と言うのかな?
点と点を繋ぐ間の空間や、それを隔てる面や辺に着目したのは「有限要素法(FEM)」と呼ばれますが。微分方程式を離散化したものとして、「差分方程式」という
言葉も使われるかも知れません。空間に対する方程式なら、「境界条件」という周囲の条件が決められ、時間も伴うものなら、これに加え「初期条件」が
与えられて、前進的に解を求めます。
その最も初歩的なものはポアソン方程式です。これは、場の「ラプラシアン」が課題として与えられている境界値問題です。「ラプラシアン」は、
そこがどれだけ見通しが悪い場所かを与える尺度です。盆地の底ならこれが正、山のてっぺんなら負、平地や峠ならほぼゼロとなります。
この「ラプラシアン」が全体にゼロというのが、非常に良く出会う課題で、これは特に「ラプラス方程式」と呼ばれるようです。
これは、境界の条件、例えば温度が固定された固体の中の拡散(例えば熱伝導=熱の拡散)が行きつく先と言えます。あとの拡張はごく容易なので、
ラプラス方程式で考えましょう。
また、2次元としましょう(3次元でもできるが、実は2次元がベストです)。
正方形の空間、周囲の条件が決められたラプラス方程式を、(N+1)×(N+1) の格子点を使って差分的に解きます。
点には横方向と、縦方向に、ゼロから N までのアドレスが振られ、点は、(i, j)という整数の組で識別されます(0≦i≦N, 0≦j≦N)。
この場の上で、例えば f といったスカラーの挙動を解きます。差分化して f_i,j としておきましょう。i=0,i=N,j=0,j=N の全ての場合は
与えられており、個々の点の従う式は、
です。上下左右の平均ということで、これに加えて斜めの関係も入れる定式化もありますが、深入りはしないでおきます。
さて、境界ではない未知の点は、(N-1)×(N-1) 個だけあるわけですから、これだけの次数の線形方程式を解くことになります。
例えば、N が 100 だとしましょう。L = 99×99 = 9801 次の行列を扱うことになります。先日の行列式の計算で、計算の安定性を考えると 2000 次が限界だったのですが、
この程度でもいかに大変かということです。これを解くには、O(L^3) = O(N^6) のステップが必要になると思われます。ところが意外にも、
計算順序の工夫をすることによって、O(N^3) 程度のステップでできてしまうのです。それはどうするか?
先の式を変形すると、次のようになります。
これを使います。まず、i=1 の一列 99 元をテキトウに「仮定」してしまいます。はい、テキトウでいいんです。乱数でも良いし、任意の1つだけ
1とし、あとはゼロとかでも良いです。ただし、条件によっては後の計算が発散しやすいので、一定のコツはあるのですが。
i=0 の全ては境界条件として得られているので、新たな式を使うと、i=2 の一列の各元は簡単に求まります。
i=1 と i=2 が得られたので、i=3 も求めます。こうして、i=100 まで求めてしまいます。ところで、i=100 の元は境界条件として
得られているのでしたが、結果は普通はずれているはずです。この 99個のずれをベクトルとして記録します。
ここまでが1つの流れで、99*99 ステップの計算をしました。
もとに戻って、最初の i=1 の「仮定」を、さっきとは違うようにやり直し、同じ流れを踏みます。
こうして、仮定から結果を記録するまでの一見無駄な流れを全部で 100 回まで繰り返します。99 回ではありません、100 回です。
ここで、流れにおいて求めてきた全ての数値は、もちろん最終の数値もそうですが、最初の「仮定」と線形関係にあり、2次以上の項はありません。
i=1 に設定した各回の値(99 元)の最後に1を追加し、(100 元の)ベクトル v とします。i=100 で求められた誤差の値(99 元)も、
最後に1を追加し、(100 元の)ベクトル w とします。その個数は v も w も 100 個ですから、集めると、100×100 の正方行列が2つできました。
w を集めた 100 次の正方行列は、v を集めた 100 次の正方行列と線形関係にあります。これらを繋ぐ未定の線形関係を 100 次の正方行列 A で表し、
v, w の個々は縦ベクトルとして束ねて表すと次のようになります。
V の各要素ベクトルはテキトウなものでしたが、正しいベクトル に対しては、
正しい が求まるはずです。ちなみに とは、
最初の 99 の数値がゼロ(誤差がない)で、最後だけ1のものです。
この計算の主要部は、W の逆行列を求めるところだけであり、これが N^3 の程度です。ベクトルのセットを用意するまでの計算も N^3 の程度だったので、
総じて N^3 の程度でポアソン方程式が解けます。
しかし、申し訳ないですが、これはお勧めの方法ではないです。一つには、数値型が許容する桁数にもよるのですが、大体 20 列位で発散したり、
精度面が厳しくなり、両側から攻めるといった工夫が必要になります。大きな領域では、駐車場のように区分けします。
また、ポアソン方程式ということに特化すれば、これは拡散方程式の極限ですから、そういうやり方で解いた方が良いです。拡散方程式を解く効果的かつ
超簡単な方法は SOR です。これは、またの機会にご説明しようと思います。