偏微分方程式 (ラプラス方程式)

山本昌志^{∗}

2005 年 2 月 8 日

1 はじめに

以前、常微分方程式の数値計算について学習した。独立変数が 1 個のものを常微分方程式、 2 個以上のものを偏微分方程式と言うのは数学の授業で学んだとおりである。実際、自然現象は常微分方程式よりも、偏微分方程式で記述されることが多い。常微分方程式が役に立たないと言っているのではなく、より広範囲には偏微分方程式が使われているということである。自然界が、 (x, y, z) の 3 次元と時間 t を合わせた 4 次元で成り立っているためである。

ここでは、偏微分方程式、特にラプラス方程式を差分法というテクニックで数値計算する方法を学習する。偏微分方程式は、いろいろなものがあるが、最初に学習する分には、意味がわかりやすい方程式と言うことで、これを教材に選んだ。実際には、図 1 の静電磁場や、図 2 の熱の問題に、この方程式は表れる。

• 図 1 は、紙面と垂直方向に無限に長い正方形の金属筒に、電線が 2 本通っている。正方形の筒は 0V にアースされており、 2 本の電線はそれぞれ、 30V と-20V である。この状態で、筒内部のポテンシャル (電圧) の分布を求めなさいという問題である。

• 図 2 は、紙面方向に非常に長い豆腐があり、その周りは 0 ℃の水で満たされている。そして、その豆腐に 30 ℃と-20 ℃の金属棒が突き刺さっている状況である。豆腐内部の温度分布を求めなさいというのが問題である。

これらは、物理的には異なる問題であるが、ポテンシャルや温度が満たす方程式は同じである。方程式が同じならば解は同じで、同じ計算手法が使えることを理解して欲しい。これらが満たすのはラプラス方程式

∇^{2}ϕ = 0  (1)

と言われるものである。 (x, y, z) の 3 変数の偏微分方程式である。ここでは、 3 次元の問題は大変なので、図 1 や 2 のように紙面の方向 (z 方向) には一様とする。そのため、 z 方向の微分はゼロとなるので、ラプラス方程式は、

\frac{∂^{2}ϕ}{∂x^{2}} + \frac{∂^{2}ϕ}{∂y^{2}} = 0  (2)

と 2 次元問題になる。ここではこの偏微分方程式の近似解を数値計算により求めるのが目的である。ここでの学習を通して、プログラムが完成すると、図 3 のような解のグラフを求めることができる。図 1: ポテンシャルを求める問題。図 2: 温度を求める問題。図 3: 差分法により計算された、ポテンシャルや温度のグラフ。

∗独立行政法人 秋田工業高等専門学校 電気工学科

2

2 差分法による偏微分方程式の数値計算

2.1 差分方程式

2 次元のラプラス方程式を数値計で解くことを考える。まずは、いつものように、解 ϕ(x, y) をテイラー展開する。 x および、 y 方向に微小変位 ±h があった場合、

ϕ(x + h, y) = ϕ(x, y) + \frac{∂ϕ}{∂x}h + \frac{1}{2!} \frac{∂^{2}ϕ}{∂x^{2}}h^{2} + \frac{1}{3!} \frac{∂^{3}ϕ}{∂x^{3}}h^{3} + \frac{1}{4!} \frac{∂^{4}ϕ}{∂x^{4}}h^{4} + ⋯  (3)
ϕ(x − h, y) = ϕ(x, y) − \frac{∂ϕ}{∂x}h + \frac{1}{2!} \frac{∂^{2}ϕ}{∂x^{2}}h^{2} − \frac{1}{3!} \frac{∂^{3}ϕ}{∂x^{3}}h^{3} + \frac{1}{4!} \frac{∂^{4}ϕ}{∂x^{4}}h^{4} − ⋯  (4)

となる。これらの式の辺々を足し合わせえると、

\frac{∂^{2}ϕ}{∂x^{2}} |_{x,y} = \frac{1}{h^{2}} [ϕ(x + h, y) − 2ϕ(x, y) + ϕ(x − h, y)] − O(h^{2})  (5)

が得られる。このことから、 2 階の偏導関数の値は微小変位 h の場所の関数の値を用いて、 h^{2} の精度で近似計算ができることが分かる。すなわち、式 (5) の右辺の第 1 項を計算すればよいのである。同じことを y 方向についても行うと

\frac{∂^{2}ϕ}{∂y^{2}} |_{x,y} = \frac{1}{h^{2}} [ϕ(x, y + h) − 2ϕ(x, y) + ϕ(x, y − h)] − O(h^{2})  (6)

が得られる。これらの式 (5) と (6) を元の 2 次元ラプラス方程式 (2) に代入すれば、

ϕ(x + h, y) + ϕ(x − h, y) + ϕ(x, y + h) + ϕ(x, y − h) − 4ϕ(x, y) = 0  (7)

となる。これが、 2 次元ラプラス方程式の差分の式である。この式を眺めると、座標 (x, y) のポテンシャルの値 ϕ(x, y) は、周りの値の平均であることがわかる。

実際にこの式を数値計算する場合、例えば図 1 のポテンシャルを求める時には、図 5 のように格子状^{1}に区切り、その交点での値を求めることになる。ここでは、 x および y 方向には等間隔 h で区切り計算を進めるが、等間隔である必要はない。多少、式 (7) は異なるが同じような計算は可能である。これまでの説明が理解できていれば、 x と y 方向の間隔が異なっても、式 (7) に対応する差分の式が作れるはずである。

数値計算をする場合、 ϕ(x, y) や ϕ(x + h, y) の形は不便なので、形式を改める。図 4 の左下の座標を (0,0) として、格子点でのポテンシャルを

\begin{aligned}ϕ(x, y) & = ϕ(ih, jh) \\ & = U_{i j} \end{aligned}  (8)

とする。このようにすると、式 (7) は

U_{i+1 j} + U_{i−1 j} + U_{i j+1} + U_{i,j−1} − 4U_{i j} = 0  (9)

となり、数値計算し易い形になる。このようにした場合の各格子点の様子を図 5 に示す。

次の節で述べる境界条件を考えないとすると、ラプラス方程式は式 (9) の連立方程式を解くだけである。格子に領域を分割することにより、難しげな偏微分方程式が連立方程式に還元されたわけである。図 4: 解くべき領域を格子に分割図 5: 差分の格子

1この格子のことをメッシュ(mesh) と言う事もある。

4

2.2 境界条件 (外周)

実際に、連立方程式 (9) を計算する場合、困った問題が生じる。このままだと、式の数と未知数の数が合わないのである。たとえば、図 6 に示す境界を考える。すると、境界が式 9 の (i, j) になる場合、式が作れないのである。すると、図 5 の中の電極が無い場合、可能な連立方程式の数は、 (N_{x} − 1) × (N_{y} − 1) 個である。未知数の数は、 (N_{x} + 1) × (N_{y} + 1) 個である。未知数の数の方が、 2(N_{x} + N_{y}) 個多いのである。そのため、予め、この余分の未知数となっている値を決めなくてはならない。実際これは、偏微分方程式の境界条件を決めることに相当する。

図 6: 境界付近の差分方程式の可能性

そこで、境界上の格子点 2(N_{x} + N_{y}) 個の値を予め決める。こうすれば、式の数を減らさないで、未知数の数を減らすことができる。要するに偏微分方程式を解くときの境界条件を決めるのと同じ。驚いたことに、外周部 (境界条件) の格子点の数が、ちょうど、不足している方程式の数と同じなのである。自然は、都合良くできているのである。

懸命な諸君であれば、予め決める値は外周の境界上の格子点でなくても良いと考えるだろう。しかし、内部の点の値を決めてしまうと、連立方程式が 1 個減ってしまうので、未知数と式の数の差は変わらない。これについては、良い説明が思い浮かばなかったので、そういうものだと思ってください。

2.3 境界条件 (内部の電極)

先ほどの説明通り内部の格子点のポテンシャルを決めてしまうと、その数だけ方程式が減少する。したがって、必要なだけ内部のポテンシャルを決めても、式と未知数の数は同じで、連立方程式は解ける。そのような理由で、図 5 の電極内部の格子点のポテンシャル U_{i j} は、問題で与えられたとおり、 30V と-20V と固定しても、連立方程式の数は変わらない。

3 実際の計算方法

3.1 ガウス・ザイデル法

境界条件、境界でのポテンシャルの値を決めることで、方程式と未知数の数が一致することは前に示したとおりである。したがって、連立方程式を解けば、格子点のポテンシャルは分かることになる。しかし、実際問題この方程式を作るのが大変である。未知数のポテンシャルは、分かりやすくするために U_{i j} と行列で表示したが、実際に連立方程式を解く場合、未知数としてベクトルになる。この式を書くのは大変厄介である。本当に大変かどうかは、諸君が実際に、係数行列と同次項を求めてみれば分かる。

そこで、次のお手軽な方法で連立方程式を解くことにする。この方法は、連立方程式の係数行列や同次項を求める必要がなく、プログラムは非常に簡単になる。

1. 外周の境界上の格子点のポテンシャルの値を U_{i j} に代入する。この値は、これ以降、ずっと一定とする。

2. 電極の内部の格子点のポテンシャルの値を U_{i j} を代入する。この値も、これ以降、ずっと一定とする。

3. 計算すべき内部の格子点のポテンシャルを、

U_{i j} = \frac{1}{4} [U_{i+1 j} + U_{i−1 j} + U_{i j+1} + U_{i j−1}]  (10)

に従い計算する。

4. U_{i j} が収束するまで、繰り返し、式 (10) を計算する。

実際、この方法で無限の回数ループ処理をすれば、真の解に収束するはずである。このように、反復により解に収束させる方法を反復法と言う。とくに、ここで示した方法をガウス・ザイデル法という。以前学習したように、 SOR 法の法が収束が早いが、ここではプログラムが簡単なガウス・ザイデル法で計算するのは良いであろう。

3.2 内部電極の決め方

格子点がポテンシャルが固定されている内部電極の内側にあるか否か判断しなくてはならない。内部にあるとそれは固定点で、先に示したガウス・ザイデル法で値を変えてはならない。一方、外部だと境界でない限り、ガウス・ザイデル方で計算しなくてはならない。そのようなことから、電極内部にあるか否かは予め判断する必要がある。その判断は簡単である。格子点と電極中心の距離と電極半径を比べれば良いのである。

3.3 固定及び境界点の計算を省く方法

固定電極内部の点や外部の境界の格子点では、ガウスザイデル方で計算する必要がない。それを計算しないようにプログラムを書かなくてはならない。境界の計算を省くのは簡単である。境界の格子点のポテンシャルは、 i = 0, i = N_{x}, j = 0, j = N_{y} の場合である。この場合、ガウス・ザイデル法で式 (10) の U_{i j} を計算しなければ良いのである。

次に、電極内部の点であるが、これは予め目印を付ければ良い。例えば、整数型の配列を用意して、その値が 1 の場合は、電極の内部と目印をしておく。 1 以外の時、式 (10) の U_{i j} を計算する。

以上をまとめると、連立方程式を解く場合には、次のようなループとすれば良いであろう。

   for(k=1; k<=ガウス・ザイデル法の計算回数;k++){
     for(j=1; j<= x 方向の分割数-1 ; j++){
       for(i=1; i<= y 方向の分割数-1 ;i++){
         if(フラグ [i][j] != 1){
           u[i][j]=0.25*(u[i][j-1]+u[i][j+1]+u[i-1][j]+u[i+1][j]);
         }
       }
     }
   }

このループを図 7 に示す。先のループがどのように計算されるか、よく考えよ。

図 7: 計算する格子点と順序

4 練習問題

4.1 ポテンシャルの計算

図 1 のポテンシャル分布を求めるプログラムを作成せよ。ただし、詳細な寸法は、図 8 の通りとする。

図 8: 練習問題の境界条件とポテンシャル

4.2 ヒント

途中まで作成したソースプログラムを/tmp/5e/laplace hint.c に置いておく。プログラム作成の手がかりがつかめない者は、これを完成させよ。

このヒントのプログラムの変数は、次のように使われている。 u[i][j] i,j 番目の格子点のポテンシャルを入れる配列

x[i][j],y[i][j]   i,j 番目の格子点の座標を入れる配列

flag[i][j] i,j 番目の格子点が、内部電極内ならば 1、それ以外 1 となるフラグ iteration ガウス・ザイデル法での最大計算回数。 nlat x 方向と y 方向の分割数。問題が正方形領域なので、同一としている。

また、使われている関数の動作は以下の通りである。 initialize ポテンシャルとフラグの値をゼロに初期化する。

set cordinate 格子点の座標を設定する。

set boundary wall pot 外部境界の格子点のポテンシャルを 0、フラグを 1 に設定する。 set circle 電極内部の格子点のポテンシャルを設定する。さらにそのフラグを 1 に設定する。 plot 3d 結果を 3 次元グラフに表示する。