プログラムな日常>理数学習このままでイイン会?>
お勧めではないですが、
(though not perfectly recommendable)

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 です。これは、またの機会にご説明しようと思います。