第8回 Laplace方程式と境界値問題
(2/2)
今度は別の問題を考えてみましょう。 やはり変数分離できる場合を考えます。
|
|
c) 円柱座標系での Laplace方程式 | |
この問題では、円柱座標(r, θ, z)での Laplace方程式
の解を、以下の境界条件で解く事になります。
変数分離解 φ(r, θ, z) = R(r) Θ(θ) Z(z) の形で探します。 ただし、θ方向に関して電位分布は一定なので、Θ(θ)=1 (Constant) と置くことができるので、Laplace方程式は次の2つの常微分方程式
になります。ここでα、βは α2+β2=0を満たす任意の定数です。 1つめの常微分方程式をMathematica で DSolveで解いてみると、
となります。ここで、BesselJ や BesselY は Bessel関数と呼ばれる 特殊関数です。 これについて少し解説しておきます。 |
|
d) Bessel関数について | |
Bessel 関数は Bessel方程式と呼ばれる2階の常微分方程式
の解として定義され、その二つの独立解として Jn(r)、Yn(r) と書かれます。一般解は R(r) = C1 Jn(r) + C2 Yn(r)です。 Jn をn 次の第一種 Bessel 関数、 Yn をn 次の第二種 Bessel 関数(または n 次の Neumann 関数) と呼びます。 Yn(r) は時にNn(r)とも書かれます。 具体的な関数形は省略しますが、上の微分方程式が確定特異点を 持つことに 注意してその周りで級数解法で解けば、2つの独立解 Jn、J-n の形を求めることができます。ただし nが整数の場合は Jn、J-n の間に関係式が生じてしまうため独立ではなくなってしまいます。 そこで JnとJ-n の線型結合より Neumann関数 Yn を定義します。また以下の常微分方程式
を Modified Bessel 方程式と呼び、その独立解 In(r)、Kn(r) をそれぞれ n 次の第一種、第二種 Modified Bessel 関数と呼びます。 このとき Modified Bessel 方程式の一般解は R(r)=C1In(r)+C2Kn(r) となります。 また、In、Knは上の Jn や Ynとは独立ではなく Modified Bessel 方程式の解は R(r)=C'1Jn(I r)+C'2Kn(I r) とも書けます。 これらの Jn、Yn、In、Kn など(他にもその派生関数があります。)を総称して Bessel 関数と呼び、Mathematica ではそれぞれ BesselJ[n, x]、 BesselY[n, x]、 BesselI[n, x]、 BesselK[n, x] と書きます。どんな関数形をしているか、最初の数項(n=0,1,2,3) をプロットしてみると、それぞれ
となります。それぞれの x → 0 の振舞いなど、基本的な特性を よく覚えておいてください。 |
|
e) Laplace方程式を解く(円柱座標系) | |
さて、円柱座標(r, θ, z)での Laplace方程式は Bessel関数を使えば
となります。α、βについての重ね合わせは形式的に 和の記号を用いましたが一般的には積分になることもあります。 あとは先ほどと同様、任意係数A(α),B(α),C(β),D(β) を境界条件から決定してやるだけです。 まず円筒の内部では電位は至るところ正則だと考えられます。 そこで、円筒内部のz軸に相当する r=0,-L <= z <= L の範囲の電位を見てみます。すると、 J0(0) は上の グラフのように有限な値ですが、Y0(0) は発散して います。したがって未定係数B(α)=0 である必要があ ります。
次に第二、三の境界条件 φ(r, -L)=φ(r, L)=φ0, (0<r<a) を考えると、C(β)-D(β)=0 が分かります。
さらに第一の境界条件φ(a,z)=0, (-L<=z<=L)より
とならねばなりません。これは J0(- I α a) = 0 とならねばならない事を言っています。 実は Bessel 関数 J0(z), (z 複素数) のゼロ点は実軸上 にしかなく、飛び飛びに孤立しています。Mathematica で確かめて みます。ContourPlot を使って BesselJ[0, x + I y] の実部と虚部がともにゼロになるところを見てみます。
と打つと、以下の図が得られます。
青が実部がゼロとなる所で、赤が虚部がゼロとなるところです。 赤と青が重なっているところは確かに実軸上に飛び飛びにしかない ようです。実軸上でのBesselJ[0,x] の振舞いは上で見た ように振動しています。この x 軸を横切っている点の値 (J0(x)の根)を それぞれ、 ... p-3,p-2,p-1, p1,p2,p3,..., pn, と値の小さい方から名前をつけます(n 番目の根 = pn)。 そうすると、第一番目の境界条件から得られた J0(- I α a) = 0 から次の式が得られます。
(n=...-3,-2,-1,1,2,3,...、ゼロを除く)であるこ とが分かります。 またα2+β2=0 でしたので βn= + pn/a、または βn= - pn/aとなります。 またしても α、βは連続的な値を取れないようです。 これらをφ(x,y)に代入し、指数関数を双曲余弦関数に置 き換え、n についての和で負の整数の部分は正の整数 の和と同じである事などを用いて比例係数などを吸収するよう に未定係数を再定義すると、 (A(αn)C(βn)=an 等の置き換えを行った。)
となります。 最後に残る条件は φ(r,-L)=φ(r, L) = φ0, (0 <= r < a) です。これは、 以下の境界条件の式を満たす様にanを決めることです。
この式からan は以下のようにして求めることができます (Bessel 関数の直交性を用いる)。 まず、両辺に r J0(pkr/a) をかけて r で 0 から a まで積分します。 ---(*) となります。右辺の積分は k と n が等しい場合と異なる場合で評価します。 まず、p と k が異なる時を見てみましょう。 pn、pk をそれぞれpn、pkと 表して Mathematica に計算させると、
となります。pk、pnの定義より (それぞれ Bessel J0 関数の相異なるゼロ点)、 J0(pk)=0、 J0(pn)=0 であり、pk とpn が異なることからこれは ゼロです。 次に k=n の時は、あらわに pn=pk とおいて Mathematica で計算すると、
となり、pnの定義より
となります。 結局、式(*) の右辺の n についての和は n = k の所だけが残ります。 また左辺の積分も同様に Mathematica で実行すれば、
となります。従って an は(上の k を n と改めておき直して)、
となることが分かります。 ここではan をあらわに pn の関数としてan[pn] と定義しました。 これで全ての未定係数は求まりました。 |
|
f)視覚化 | |
どんな解が求まったのか、またお絵描きしましょう。 それにはまず、pn を具体的に求めなければなりません。それには先週やった FindRootが使えます。初期値としては原始的ですが、 グラフから読み取った大まかな数字を手で与えてやることにします。 グラフ
より、{x, 0, 50} の範囲にあるx軸との交点の座標をざっと読み取り、 それを Newton 法の初期値とします。すなわちグラフから読み取った xの大まかな値をリスト形式で与えておいて、それを使ってFindRoot します。
guess1[[i]] とするとリスト guess1 の i 番目の要素を参照できる ことを利用しています。 これは前出の Part[guess1, i] の短縮形に相当します。 しかし FindRoot を16回も行うのは大変なので、関数 Table[ ] を使用して楽をしています。 Table[hogehoge, {i, 1, 16} ] は、1 から 16まで i を1ずつ変えながら hogehoge を評価し、 その値のリストを出力する関数 です。これは前出の Do[ ] に似ていますが、結果をリスト形式 で出力してくれるところが相違点です。 このリストから例えば 1 番目の x の値を引き出すには、list1[[1]] でよさそうですが、やってみると
となって余計なものがたくさんついています。 この出力はよく見ると要素が1個のリストです。つまり List1 はリストのリスト、すなわち 16x1 の行列なのです。 したがって、1行1列目を出力させる、すなわち
とすれば、少し余計なものを減らすことができます。 ここからさらに→以降だけを取り出すには、 前出の関数 First[ ] に類似した(ある意味で逆の)、 Last[ ]という関数 を使います。まとめると pnは
になります。関数の定義でよく使う:= が登場しましたが、 := は正確には SetDelayed と言って、右辺が評価されるまで =(通常のSet)を保留するためのもの です。今の段階では n が特定の数に決まっていないので:= を使用しています。 あるいは同じことが
としても可能です。list1 の n行1列目の要素は x→hogehoge ですが、 →の前が list1[[n,1,1]] で、→の後が list1[[n,1,2]] です。 シンプルなので、慣れるとこちらのほうがわかりやすくなると思います。 これで pn の具体的な値がわかったので、プロットに移りましょう。 pn として 16 個しか用意できなかったので、無限項の和は16項目までの和 で近似します。
こんな図が描けたでしょうか? |
|
g) 視覚化の精度を上げる | |
今回も両端にギザギザが現れてしまいました。 これはやはり無限項の和を有限項の和で近似したことより発生しています。 これをよりスムーズにするには pn としてもっとたくさんの値を用意しな ければなりません。{x, 0, 50} のかわりに {x, 50, 100} にして上と同じことを繰り返します。 グラフの交点を読み取り、それをもとに Newton法で解を求めると
となります。全体のリストは
とすればよさそうですが、結果をよく見ると 2つのリストが並んで いるだけで、1つのリストとして融合してはいません。 こんなときは リストをフラットにする(融合する)関数 Flatten[ ] を用います。1段階だけフラットにすればよいので、
で、望ましい出力が得られます。これを使って
とすれば、
となります。 実は、Bessel関数 Jn(x) のゼロ点を与えてくれる コマンド BesselZeros があります。BesselJZeros[n, num] とすると Jn(x) のゼロ点を原点に近い順番にnum個 計算してリストにして返してくれます。あるいは、N[BesselJZero[n, num]] (最後に s がないことに注意)とすると、Jn(x) のゼロ点を原点に近い方から num 番目のゼロ点の近似値を返してくれます。 これらを使えば上で行ったFindRoot の部分をもっと簡単に出来ます。皆さんやってみて下さい。 |