19

投稿日

更新日

電場の数値解析:有限差分法(FDM) -基礎編-

きっかけ

電場(電界)の数値解析について研究しているが、授業など真面目に聞かず遊んでばかりいたため、基礎知識が不足していると感じた。
電場計算の基礎的な知識を得るために、『数値電界計算の基礎と応用』という本を買った。
普通、電磁気系の数値解析の本といえば、電場計算、磁場計算、電磁波計算などが合わせて一つの本となっているのだが、この本は電場計算のみに特化した素晴らしい本である。

ただ、買っても読まないと意味ないので今回自分用のアウトプットのためにも、学んだことをここに書き留めたいと思う。
また、この本には数式の記述や、理論的な話はあっても、サンプルプログラムなどはない。
ただ書いていることを自分なりに解釈して記事にするだけでは面白くないので、pythonで自分で簡単にサンプルプログラムを実装していく。

なお、上記の本は電界と称されているが、本記事では電場に統一する。

電磁気学の理論・公式

当然だが電磁気学の理論をある程度知っていなければ、電界計算をできるわけない。
といっても、今回主眼に置くのは数値解析の方のため、超簡単に、必要なものだけ話していく。

今更だが、数学的な知識レベルとしては大学一年生~二年生レベルで話していこうと思う。
といっても、の記号テイラー展開、あとは行列をなんとなく知っていれば多分大丈夫だ。

物理的な話なんてどうでもいい!って人はポアソン方程式まで飛ばして欲しい。

クーロンの法則

電磁気学の教科書で最初に出てくるのはたいていクーロンの法則だ。
高校の教科書では次のように書かれていると思う。

(1)F=kq1q2r2

ご存知の通り、Fは力、q1, q2は2つの粒子の電荷、そしてrは距離である。

(高校でも習うと思うが)大学になると、この比例定数kは真空の誘電率ε0を利用してk=1/(4πε0)と表現するのが普通になる。
さらに、ベクトル演算に慣れてくると、力Fに方向の意味を持たせるためにも、次のように両辺ともベクトルで書くのが簡潔だ。

念の為行っておくが、ボールド体はベクトルを意味している。

F=14πε0q1q2|r|2r^(2)=14πε0q1q2|r|3r

rは2つの粒子を結ぶベクトルで、r^rと同じ向きで、長さ1のベクトルである。

一つ目は式(1)にただ2つの粒子を結ぶベクトルを加えただけで、最初はこっちのほうが見やすいと思う。
二つ目はr^を、r^=r/|r|と置き直しただけである。
個人的には、こっちのほうが文字の種類が少なくなって好きだ。プログラム的にもこっちのほうが実装しやすそう。
今後もこっちの書き方で書いていくと思う。

上記の話は現実世界と同じ三次元の話であり、二次元だと少し違う。
どうしてこうなるか、という話はせず、公式だけ上げておこう。

F=12πε0q1q2|r|2r

重要なのは、2πになっているところ、そして分母の乗数が一つ減っているところだ。
球の表面積が4πなのに対して円の周の長さが2πであること、三次元から二次元に次元が一つ減ったことからなんとなくわかってほしい。

電場と電束密度

クーロンの法則は2つの電荷間に働く力の関係を表す式である。
このことから、電荷を1つ置くことで、この世界に何らかのができて、もう1つの電荷を置いたときにその場によって力が働くと考えることができる。
……何言っているかわからないかもしれないので、式をを利用して説明する。

クーロンの法則をF=q2Eのように書き直したとき、

E=14πε0r|r|3q1

が電荷q1が作る電場Eである。

二次元のときは、クーロンの法則と同様に次のように表わされることも一応書いておこう。

E=12πε0r|r|2q1

ちょっと話が飛躍するが、微小領域での電荷qの値、電荷密度ρを利用してうまいこと変形すると次式が得られる。
(この式の導出、当初はもう少し詳しく書こうと思ったのだが、いろいろな前提知識を説明しなければならないため省く。気になる人は自分で調べてみてね)

E=ρε0

なお、二次元のときも上式は変わらない。

ところで、電束密度Dというものがある。
この電束密度Dと電場Eは、真空中では真空の誘電率ε0を利用して、次のような比例関係が得られる。

D=ε0E

とても簡単な式だが、このDEの定義の物理的な意味は全く違うことには注意しよう。
電束密度は電荷が作る電気力線の密度、電場は電荷に力を及ぼす場である。

ポアソン方程式

電位ϕは、次のように定義される。

(3)ϕ=E

この式は、電場Eという3次元ベクトルを1つのスカラー値に直すとても便利な式である。
このような値をスカラーポテンシャルと言う。

E=ρ/ε0に上式を代入すると、次式を求めることができる。

ϕ=ρε0

この式を解けば、電位を求められるし、それを微分することで電場も求めることができる。

右辺のε0などは定数なので、わざわざこれから書くのも面倒なので、もう少し一般的に書こう。
左辺をuに、右辺をfに置き直すと、次のように書き直すことができる。

u=f

このような式をポアソン方程式と呼ぶ。右辺のマイナスはとらないこともあるが、今回は書くのが面倒なので、とることにした。

長々と書いてきたが、結局、電場を求めるには、このポアソン方程式を解いて、電位を求めてから式(3)から電場を求めればOKだ。

境界条件(Boundary Condition, B.C.)

最後に、境界条件についてちょっとだけ話そう

無限遠点を電位の基準点とする(無限遠点での電位を0とする)と言う話はよく聞くと思う。
これは、境界条件を「無限遠点で0とする」として、上記のポアソン方程式を解く、と言う意味である。

数値解析では、ある計算領域内の値を求めるため、無限遠点を0と置くことは少ない(数値解析は無限遠点を境界条件とする問題は苦手であることが多い)。
そのため、境界条件の電位を基準値として解くことになる。

境界条件は主に以下の2つがある。

  • ディリクレ境界条件(第一境界条件):計算領域の境界上において、u=gである。
  • ノイマン境界条件(第二境界条件):計算領域の境界上において、un=g(nは境界の法線方向の微分)

上のgは何らかの関数である。多分、定数のことが多いと思う。
他にも、周期境界条件ロビン条件(第三境界条件)などがあるが、今回説明は省く。

ポアソン方程式は、計算領域がディリクレあるいはノイマン境界条件で囲まれていれば解が存在することが証明されている。
注意すべき点として、ノイマン境界条件のみで囲まれている場合は基準値が指定されていないため、どこか任意の場所を基準値として指定する必要がある。

有限差分法(FDM)

ここまで来てついに数値解析の話に入っていく。長かった……。

上で述べたように、解くべき問題はポアソン方程式であり、計算領域はディリクレ/ノイマン境界条件に囲まれている。
これを、数式で表してまとめてみよう。

計算領域をΩ、その境界をΓとしたとき、

u=f  ( in Ω)u=g1(x,y)  ( on Γ1)un=g2(x,y)  ( on Γ2)

ただし、Γ1Γ2=Γ, Γ1Γ2=である。

ちょっと抽象的な書き方なので、具体的な例で話す。
計算領域Ωを長方形とする。そして、境界Γ1は上下の辺、Γ2は左右の辺とすると、次の図のようになる。

図1:計算領域
domain.png

ところで、Γ1Γ2=Γ, Γ1Γ2=の部分は流し読みせずちょっと立ち止まって考えて見てほしい。そんなに難しくないはずだ。
Γ1Γ2の領域は被らず、その和集合がΓとなるということも認識しておこう。わからない人はこちら「数式を読めるエンジニアになるために」(宣伝)。

このように、境界条件を与えられた偏微分問題を解くことを、境界値問題という。

この境界値問題を数値解析するに当たって、大抵最も最初に取り扱われあるのがこの有限差分法(Finite Difference Method: FDM) である。

なお、これ以降、二次元ポアソン方程式について考えていくことにする。
というのも、三次元だと図示するのが面倒だったりするからである。まあ、二次元さえわかれば三次元への拡張は容易だ。
即ち、次の偏微分方程式を解くことを考える。

2ux2+2uy2=f

テイラー展開

まず、テイラー展開について話しておこう。
FDMはこれが全てであり、これさえわかれば極めたも同然だ。

一次元のテイラー展開

Δxを極めて小さい値として、一次元のテイラー展開は次のように表される。

u(x+Δx)=u(x)+Δxdu(x)dx+Δx22!d2u(x)dx2+Δx33!d3u(x)dx3+=p=0Δxpp!dpu(x)dxp

本当は、収束条件などがあるのが、今回は面倒なので無視しよう。

Δxが小さい値なので、Δx3以降の項を無視してもまあ大体大丈夫だと考えよう。

u(x+Δx)u(x)+Δxdu(x)dx+Δx22!d2u(x)dx2

これは、Δx3程度の誤差があると言うことで、次のように表記する。
(4)u(x+Δx)=u(x)+Δxdu(x)dx+Δx22!d2u(x)dx2+O(Δx3)

これを、Δ3の誤差オーダーと言ったりもする。

また、同様に、次の式も得られる。

(5)u(xΔx)=u(x)Δxdu(x)dx+Δx22!d2u(x)dx2+O(Δx3)

式(4)と式(5)の二つを足すと、次のような式が得られる。
u(x+Δx)+u(xΔx)=2u(x)+Δx2d2u(x)dx2+O(Δx4)

このとき、Δxの項と同様に、Δx3のような奇数項全て打ち消してくれるため、誤差オーダーはO(Δx4)となる。

移行して整理すると、次の式が得られる。

(6)d2u(x)dx2=u(x+Δx)2u(x)+u(xΔx)Δx2+O(Δx2)

即ち、uの二階微分は、右辺を計算することで(Δx2オーダーの誤差を持つ値を)求めることができる。
このようにΔx2オーダーの誤差の精度を持つ(つまり、Δxを半分にすると、その二乗分誤差が小さくなる)ことを二次精度と言う。

二次元テイラー展開

一次元のテイラー展開は有名だが、多次元のテイラー展開は知らない人も多いかもしれない。
これは、次式で表される。

u(x+Δx,y+Δy)=p=01p!(Δxx+Δyy)pu(x,y)

ただし、このとき、
(x)2u=2ux2

のように定義することにする。

例えばΔx=Δy=Δとすると、次のように展開できる。

u(x+Δ,y+Δ)=u(x,y)+Δ(u(x,y)x+u(x,y)y)(7)+Δ22(2u(x,y)x2+22u(x,y)xy+2u(x,y)y2)+O(Δ3)

x方向またはy方向にが一定の場合は一次元の式と同じになる。

u(x+Δx,y)=p=0Δxpp!pu(x,y)xp(8)u(x,y+Δy)=p=0Δypp!pu(x,y)yp

よし、準備はできた。
二次元ポアソン方程式のFDMを定式化していこう。

二次精度FDM

離散化

一応、もう一度ポアソン方程式をここに記す。

2ux2+2uy2=f

式(8)を利用すれば、一次元の二階微分を求めたときのように、次のような式が得られる。

2u(x+Δx,y)x2=u(x+Δx,y)2u(x,y)+u(xΔx,y)Δx2+O(Δx2)2u(x,y+Δy)y2=u(x,y+Δy)2u(x,y)+u(x,yΔy)Δy2+O(Δy2)

これをポアソン方程式に代入すると、次のような離散式が得られる。

u(x+Δx,y)2u(x,y)+u(xΔx,y)Δx2+u(x,y+Δy)2u(x,y)+u(x,yΔy)Δy2=f+O(Δx,y2)

ここで、O(Δx,y2)=O(Δx2)+O(Δy2)である。

ここまではなんとなく理解できただろうか。ちょっと式が多いが、言っていることはそんな難しくはないと思うので、ちょっと混乱したらもう一度読み直しておこう。

次に、次の図のように計算領域を格子分割する。

図2:格子分割
図2

各格子点におけるuの値を、um,n=u(mΔx,nΔy)というように定義して、上の離散式に代入して整理すると、次のような式が得られる。

um1,n2um,n+um+1,nΔx2+um,n12um,n+um,n+1Δy2=fm,n+O(Δx,y2)

ここでΔx=Δy=Δとすれば、次のように簡単になる。
um1,n+um+1,n+um,n1+um,n+14um,nΔ2=fm,n+O(Δ2)

このm, nを整数とすれば、um,nを未知数とした連立方程式を立てることができることに気づける。
この連立方程式を解くことで、uの値を求めることができる。

説明のために、gif動画を作った。
以下のように、それぞれの点に注目して式を立てていく。

図3:定式化(思ったより大きくなってしまった……)
FDM.gif

ここで、上式の未知数が12個(u1,0,u2,0,u0,1,u1,1,u2,1,u3,1,u0,2,u1,2,u1,3,u2,1,u2,2)なのに対して、式はたった4つだ。これでは解けるわけがない。
ちょっと考えてみればわかるが、上のような2×2だけでなく、どんだけ大きくしても、式の数よりも未知数のほうが多くなってしまう。

そこで、境界条件の出番だ。

境界条件

図2のように計算領域をみると、境界上に格子点があることがわかる。
ここもいろいろなやり方があるが、このように格子点を置くのが最も簡単なのでこれで説明しよう。

ディリクレ境界条件

ディリクレ境界条件は次のように表されるのであった。

u=g1(x,y) (on Γ1 )

これはそのまま代入すればいい。

ノイマン境界条件

ノイマン境界条件は、一階偏微分だった。

un=g (on Γ1 )

これも、(長方形領域の場合)とても簡単で、テイラー展開で一階微分の近似を行えばいい。
以下のような感じだ。

um+1,num,nΔx=g2(x,y)um,n+1um,nΔy=g2(x,y)

なお、長方形領域のように、x座標もしくはy座標と平行なら上式で簡単に求められるが、実際の計算領域は斜めになることが多い。この場合は、次回の実践編で説明する。

境界条件の右辺をg1(x,y)=0, g2(x,y)=0として、簡単な図を作ってみた。

図4:境界条件
BoundaryCondition.png

領域の上下の辺をディリクレ境界条件、左右をノイマン境界条件にしたものである。

これによって、連立方程式の式の数=未知数の数となり、あとはその連立方程式を頑張って解くだけだ。

連立方程式

連立方程式の解き方は……、これはめちゃめちゃいろいろな手法があるのでここで説明はしない。
一応軽く触れておくと、連立方程式は行列を利用して次のように表すことができる。

Ax=b

このAの逆行列A1を求めて、bにかける直接法と、ガウス=ザイデル法など何度も代入などを繰り返して解に近づけていく反復法がある。
直接法は時間がかかるが安定しており、反復法は発散する可能性があるが高速と、それぞれ一長一短がある。
ちなみにnumpyのnumpy.linalg.solveは直接法のLU分解という方法で解いている。

他の物理量への変換

最初に説明したように、ポアソン方程式から求まる解uは電位ϕに値する。
この電位ϕから電場Eを求めるにはどうすればいいだろうか?

これも上のようにテイラー展開を利用しよう。
電位と電場は次のような関係があったのだった。

ϕ=E

x成分は次のようになる。
ϕx=Ex

そして、テイラー展開による近似を行う。
ϕm+1,nϕm,nΔx=Ex(mΔx,nΔy)

これは一次精度だが、求める電場を2つの格子点の中心とすれば、二次精度になる。
ϕm+1,nϕm,nΔx=Ex((m+12)Δx,nΔy)

図5:電場
field.png

上図のように、電場を求める際は格子点の間の値を求めるのが一般的である。

まとめ

電界解析はポアソン方程式さえ解ければいいということを説明した。

その解析方法として、今回は有限差分法(FDM)について説明した。
この有限差分法はテイラー展開に基づいており、これさえ理解できれば、あとは連立方程式を立てて、それを解けば解を求めることができる。

次回は、実践編と称して、この差分法を利用して実際にポアソン方程式を解くプログラムを作ってみよう。

新規登録して、もっと便利にQiitaを使ってみよう

  1. あなたにマッチした記事をお届けします
  2. 便利な情報をあとで効率的に読み返せます
ログインすると使える機能について
19