pubDate: 2024-03-18
author: sakakibara
電磁界解析
マクスウェル方程式を手で解く人はいない。
解析的に解けないケースがほとんどだからだ。
実際に電磁界解析を行おうと思うとコンピュータによる数値解析が必須になってくる。
だが、電磁界解析を行うソフトは非常に高価で数100万~数1000万程度の金かかる。
それにカスタマイズ性も低く、使いこなすのに練度が必要となる。
そこで、自前の電磁界解析プログラムを作成して、様々な実験を行う。
以下ではどのようにしてマクスウェル方程式を数値解析に落とし込むか。
より具体的に言えばどのようにして微分方程式を行列計算に落とし込むかについて説明する。
重み付き残差法
内積
内積という概念が広いことを知っている人は多いだろう。
⟨⋅⟩:V×V→R
a,b,c∈V, α∈Rについて以下が成り立つなら演算子⟨⋅⟩を内積という。
(正値性)(対称性)(多重線形性) ⟨a⋅a⟩≥0 ∧ ⟨a⋅a⟩=0⟹a=0 ⟨a⋅b⟩=⟨b⋅a⟩ α⟨a⋅b⟩=⟨αa⋅b⟩ ⟨a+b⋅c⟩=⟨a⋅c⟩+⟨b⋅c⟩
複素数を前提とした定義もあるが、あまり使用しないので今回は以上を満たす演算⟨⋅⟩を内積とする。
内積という概念は距離の概念を拡張したものと取られられている。
これは関数としての距離が内積の定義に含まれるからである。
残差を求める方法
ベクトル空間V、f:V→Vとする。
a,b∈Vにたいして
f(a)=b
以上のような関数を考える。ここでf,bを既知としてaを求めたいがどのようにすればよいだろうか。
最初に考得られる手段が最小二乗法である。
a′をaの近似解とする。以下で定義するRを残差という。
R=b−f(a′)
最小二乗法は残差の二乗和(内積)を最小にするような近似解a′をaとする手法である。
a=a′min(⟨R(a′)⋅R(a′)⟩)
残差の二乗を最小にするベクトルが解であるというのは非常に直感的だが、この他にこれに近い考えとして重み付き残差法というのものがある。
0=⟨w⋅R(a′)⟩
ここでwは重み関数と呼ばれる関数で、この種類によって様々なバリエーションが生まれる。
ガラーキン法
ベクトル空間Vが基底⟨N1,N2,…,NE⟩によって生成されているとする。
a∈Vについて以下が成り立つ。
a=∑aeNe
そこで、重み付き残差法におけるwをNeとすると、
0=⟨Ne⋅R(a′)⟩
が得られる。
NeがE個あるため方程式がE個得られる。
これによりE個のaeを変数とする方程式が得られるため、行列で計算できる。
ガラーキン法の特徴として残差が基底により生成する空間の直交空間となることである。
有限要素法
有限要素法とは対象(これをMとする。)を複数の要素(または有限要素)と呼ばれる領域に分割して、各領域で物理量を補間することにより実際の現象をシミュレーションする手法のことだ。
分割された要素は2次元であれば三角形や四角形であったり、3次元であれば四面体、六面体、プリズム、などに分割される。基本的に分割が細ければ細かいほどシミュレーションとしての精度は向上するが、計算コストが増大する。
また、要素内における物理量の補間に関しても1次補間、2次補間、…といった分類やラグランジュ補間、ルジャンドル補間などの補間手法による分類などががある。
今回は最も単純な四面体要素、1次ラグランジュ補間について解説する。
A-ϕ法
よく知られたようにマクスウェル方程式は以下の4つの式で表される。
divDdivBrotErotH=ρ=0=−∂t∂B=J+∂t∂D
ただし、適当なテンソルϵ,μ,σを用いて
D=ϵEB=μHJ=σE+Jsource
のような関係がある。
磁束密度Bはベクトル・ポテンシャルにより表現することもできる。
ベクトル・ポテンシャルをAとすると。
B=rot(A+gradχ)
のように表現できる。実質的にBの値を決定しているのはAであるが、
rotの演算はgradを0にするためにgradχの分だけ自由度が残る。
これをゲージ自由度という。
これを3つめの式に代入すると
rotE=−∂t∂B=−∂t∂rot(A+gradχ)=−rot(∂t∂A+∂t∂χ)
より
rot(E+∂t∂A+∂t∂χ)=0
これにより(ヘルムホルツの原理)、
E+∂t∂A+∂t∂χ=gradχ′
E=−∂t∂A−∂t∂χ+gradχ′
ここでもχ,χ′の分だけ不定となる。
この不定を決定することによりさまざまなパターンのベクトル・ポテンシャルが定義できる。
不定の値を様々にチューニングしてベクトル・ポテンシャル間を変換することをゲージ変換という。
逆にマクスウェル方程式はゲージ変換の元で普遍な理論という見方もできる。
(実用上、計算がしやすくなる以上の意味は見いだせない。)
以降の有限要素法ではχ=0, χ′=∂t∂ϕとする。つまり
BE=rotA=−∂t∂A+grad∂t∂ϕ
を選択する。
したがって。
J=σE+Jsource=−σ∂t∂A−gradσ∂t∂ϕ+Jsource
少しだけ注意すべきはEの第二項が∂t∂ϕとなっていることである。
多くの参考資料ではこの代わりにE=−∂t∂A+ϕとなっていることがおおいだろう。
さて、これまでのA,∂t∂ϕの導入から式3を満たすことは自明である。
式4について考える。
rotHrotμ−1Brotμ−1rotA=J+∂t∂D=J+ϵ∂t∂E=J−ϵ∂t2∂2A+ϵgrad∂t2∂2ϕ
これ以上の式変形は不要に複雑になるのでここで留めておこう。
有限要素法では右辺第二項以降を無視することが多い。
これは準静的過程(quasi-static)と呼ばれる。英語名が不思議なので検索に意外と引っかからない。
第二項を無視できる条件は周波数と誘電率と伝導率が関わるが、大体無視できるのでよい。
rotμ−1rotArotμ−1rotA=J=−σ∂t∂A−σgrad∂t∂ϕ+Jsource
少し整理して
rotμ−1rotA+σ∂t∂A+σgrad∂t∂ϕ=Jsource(eq:A−ϕ)
有限要素法ではこの式(eq:A−ϕ)を解く。
補間と形状関数
位置次元R上で定義された実数値関数f(x)について, f(x1),f(x2),…,f(xn)が与えれているとする。この元の関数f(x)はどのような関数だろうか?
単純な考えとして、実数値関数f(x)を多項式pn−1(x)で近似する方法だ。
pn−1(x)=a0+a1x+a2x2+a3x3⋯+an−1xn−1≃f(x)
このような関数を補間する多項式のことを補間多項式と呼ぶ。
のように表現して連立方程式を解く方法が考えられる。
f(x1)f(x2)⋮f(xn)=111x1x2xn−1x12x22xn−12⋯⋯⋮⋯x1n−1x2n−1xn−1n−1a0a1⋮an−1
この真ん中の行列はヴァンデルモンドの行列として行列式が非常にきれいに求められることが知られている。(可逆である。)
この解法に見られる特徴として、f(xi)=p(xi)となっている点である。これは補間という考えで非常に重要な性質である。
実際にこれは最もシンプルな方法であり、計算もうまくことが知られている。
ただし、これは計算コストが高いことが知られている。(LU分解ができない)
もっとうまいやり方がある。
それは以下のような補間多項式を用いる方法だ。
p2(x)=f(x1)L1(x)+f(x2)L2(x)+f(x3)L3(x)
ただし、Liは2次の多項式であり以下を満たす。
Li(xj)={10if (i=j)if (i=j)
補間多項式は3つの項で表されているが、実際には2次の多項式となる。
この関数ϕiを用いる補間をラグランジュ補間と呼ぶ。
これをヴァンデルモンドを用いる方法で再び示してみよう。
p(x1)p(x2)⋮p(xn)=L1(x1)0⋮00L0(x0)0⋯⋯⋯00⋮Ln(xn)f(x1)f(x2)⋮f(xn)
このようにヴァンデルモンドを使用していた部分が単位行列になる。
このラグランジュ補間はn個の標本点に対してn−1次の多項式を構成する。
最終的に得られる補間多項式は形式的には(展開すれば)、上で挙げたヴァンデルモンドの方程式と変わらない。
Li(xj)のように標本点で1となるようなn−1次の多項式を基底関数に用いた補間多項式は一意に定まる。
つまり、ヴァンデルモンドの行列を計算して導出しても、ラグランジュ補間を用いて導出した補間多項式しても、結果的に得られる補間多項式は同じである。
今回の場合は、これらは具体的に以下のように書き下せる。
L1(x)=(x1−x2)(x1−x3)(x−x2)(x−x3)L2(x)=(x2−x1)(x2−x3)(x−x1)(x−x3)L3(x)=(x3−x1)(x3−x2)(x−x1)(x−x2)
また、これらの関数は互いに直交することがわかる。(部分積分をしてみればすぐに気づく。どのみちxiを代入すれば0になるため)
まとめる。
一般にn−1次の多項式は
pn−1(x)=f(x1)L1(x)+f(x2)L2(x)+⋯+f(xn)Ln(x)
ただし、Li(xj)は以下を満たすn−1次多項式である。
Li(xj)={10if (i=j)if (i=j)
標本点を多く取れば取るほど精度が高くなると考えられる。しかし、ラグランジュ補間は急峻な関数を近似する際、標本点を多く取ると多項式補間が振動する現象(ルンゲ現象)を引き起こすことが知られている。
(なんと、この関数は1779年に考え出されたものらしい。しかも発案者はラグランジュではなく、エドワード・ワーリングという人らしい。)
要素内補間
対象Mのある3次元四面体要素をmとする。
m内の物理量ϕを補間する方法について考える。予め名前をつけておくが、要素内の点における物理量はたいていある関数の線形和で表される。その関数を形状関数とか基底関数などと呼ばれる。
mは4つの頂点と6つの辺と4つの面を持つ。
4つの頂点にϕ(x0),ϕ(x1),ϕ(x2),ϕ(x3)が割てられているとする。この定数をそれぞれϕ0,ϕ1,ϕ2,ϕ3とする。
四面体全体の体積をVとし、頂点iを除く頂点と要素m内の点xで構成される四面体の体積Vi(x)を考える。
Li(x)=VVi(x)
とする。
このようにLi(x)を定義することで
Li(xj)={10if (xi=xj)if (xi=xj)
を実現できる。
ϕ(x)=ϕ0L0(x)+ϕ1L1(x)+ϕ2L2(x)+ϕ3L3(x)
を考える。
ここで4つの標本点(x0,ϕ0),(x1,ϕ1),(x2,ϕ2),(x3,ϕ3)があるなら3次の多項式が得られるのではないか?という疑問が浮上する。
実際に、最初の考えに立ち返ってみる。
ϕ(x)=a0+ax+by+cz
ここでa0,a,b,cの4つを変数とするために4つの式が必要となる。
そしてそれは4つの標本点によって構成できる。
そう。つまり単純にn個の標本点があればn−1次補完多項式を定義できるというわけではない。
多次元の空間を考える場合には少し複雑になる。
以上によって1次式で表されるLi(x)を用いてϕ(x)をラグランジュ補間することができる。
頂点iに標本点をもつ補間の基底関数を節点形状関数ωiという。
この他にも辺eに標本点をもつ補間の基底関数を辺形状関数Ne、面fに標本点をもつ補間の基底関数を面形状関数Mfという。
そしてこれら形状関数は以下を要請する。
ωi(xj)∫eNedle′∬fMfdSf′=δij=δee′=δff′
なぜ辺形状関数などを使うのかというと連続に関する制限を締め付けないためにある。
頂点形状関数のみだと要素の節点での値が連続であることを要請する。
しかし辺形状関数だとその辺の対角にある面(その辺を含まない面)でのみ接線方向で連続となる。
この性質は媒質の境界面で物性が階段的に変化するような対象をシミュレーションする際に有効となる。
たとえば、空気と鉄を有限要素にりシミュレーションする際、空気の要素と鉄の要素が面をまたいで要素分割されるのであれば、面の垂直方向(面の法線方向)での連続性は考慮しなくて済む。
(さすがに文字だけではイメージできないので図を載せたい。)
面形状関数についてはよく知らない。
ともかく以上のような理由から電磁ベクトル・ポテンシャルの解析には辺形状関数を用いることが多い。
そこで要素m内におけるベクトルポテンシャルAを次のように辺形状関数Neを用いて補間したい。
A(x)=e∈Edge∑AeNe(x)
ベクトル・ポテンシャルはその法線方向(垂直方向)には一般には不連続性を要求するからである。
(これは異なる透磁率をもつ物体において磁束密度Bが境界面に垂直方向で連続であり、接線方向では一般に不連続であることからくる。B=rotAとして表されるのでベクトルAは境界面の垂直方向には不連続であり、境界面の接線方向には連続である。(ストークスの定理より))
電磁ポテンシャル(まぁ、電位)は節点形状関数Liを用いて補間する。
ϕ(x)=n∈Node∑ϕiLi(x)
ここで何食わぬ顔でωiをテクニカルに微分しよう。
∇ωi=∇ωi∑ωj−ωi∇∑ωj=j∑(ωj∇ωi−ωi∇ωj)
ここで勾配・回転・発散の資料を参考にしてほしいのだが、勾配行列Gを用いると
∇ωi=∑GkiNk
が得られる。
そこで頂点iから頂点jへ向かう辺kの辺形状関数Nkを
次のように定義する。
Nk=ωi∇ωj−ωj∇ωi
このように定義すると
∇ωi=∇ωi∑ωj−ωi∇∑ωj=j∑−(ωi∇ωj−ωj∇ωi)=k∑GkiNk
第二項は辺kが頂点iから出ていって、頂点jへ入っているのでこのようになる。
そしてこれは勾配行列と頂点形状関数の関係を充たす。
(辺形状関数の導出がテクニカルすぎるって?
俺もそーおもう)
辺形状関数のrotについては辺形状関数を以上のように定義したことにより非常に計算しやすくなる。
rotNk=rot(ωi∇ωj−ωj∇ωi)=∇×(ωi∇ωj−ωj∇ωi)=∇ωi×∇ωj+ωi∇×∇ωj−(∇ωj×∇ωi+ωj∇×∇ωi)=∇ωi×∇ωj+ωirot(grad(ωj))−(∇ωj×∇ωi+ωjrot(grad(ωi))=2∇ωi×∇ωj
rotgrad=0となることに気をつけると良い。
結果的に
rotNk=2∇ωi×∇ωj
座標の変換と全体行列
有限要素法では必ず座標の変換が必要になる。
∂ξ1∂∂ξ2∂∂ξ3∂=∂ξ1∂ξ2∂ξ3,∂x∂∂y∂∂z∂=∂x∂y∂z
とする。
∂ξ1∂ξ2∂ξ3=∂ξ1∂x∂ξ2∂x∂ξ3∂x∂ξ1∂y∂ξ2∂y∂ξ3∂y∂ξ1∂z∂ξ2∂z∂ξ3∂z∂x∂y∂z
ここで、行列
J=∂ξ1∂x∂ξ2∂x∂ξ3∂x∂ξ1∂y∂ξ2∂y∂ξ3∂y∂ξ1∂z∂ξ2∂z∂ξ3∂z
とする。
全体行列
有限要素法では以下のような行列を計算することがある。
rotNe⋅rotNe′Ne⋅Ne′∇ωi⋅Ne∇ωi⋅∇ωj
ただし、以上でのrot,∇は全て(x,y,z)においての微分である。
これを予め計算しやすくしておこう。
そのためには座標変換に注意する必要がある。
先に結果を示すと、
rotNe⋅rotNe′Nex⋅Ne′x∇ωi⋅Ne∇ωi⋅∇ωj=4{⟨∇ξωi⋅∇ξωi′⟩⟨∇ξωj⋅∇ξωj′⟩−⟨∇ξωi⋅∇ξωj′⟩⟨∇ξωj⋅∇ξωi′⟩}=⟨Neξ⋅Ne′ξ⟩=⟨∇ξωi⋅Neξ⟩=⟨∇ξωi⋅∇ξωj⟩
となる。
rotNe⋅rotNe′
rotNe=2∇ωi×∇ωj
のように書けることは既に述べた。
ここで、ベクトル4重積を紹介する。
(A×B)⋅(C×D)=(A⋅C)(B⋅D)−(A⋅D)(B⋅C)
これを用いて、rotNe⋅rotNe′を計算する。
rotNe⋅rotNe′=2(∇ωi×∇ωj)⋅2(∇ωi′×∇ωj′)=4(∇ωi×∇ωj)⋅(∇ωi′×∇ωj′)=4{(∇ωi⋅∇ωi′)(∇ωj⋅∇ωj′)−(∇ωi⋅∇ωj′)(∇ωj⋅∇ωi′)}=4{(∇ωi⋅∇ωi′)(∇ωj⋅∇ωj′)−(∇ωi⋅∇ωj′)(∇ωj⋅∇ωi′)}
ここで、係数を無視した以下を考える。また、∇=J−1∇ξであり、
∇ωi⋅∇ωj=(∇ωi)T(∇ωj)=(J−1∇ξωi)T(J−1∇ξωj)=(∇ξωi)T(J−TJ−1)∇ξωj=(∇ξωi)T(JJT)−1∇ξωj=(∇ξωi)Tg−1∇ξωj
ここで、g=JJTとする。
である。
また、⟨a⋅b⟩=aTg−1bとする。
(∇ωi×∇ωj)⋅(∇ωi′×∇ωj′)=(∇ωi⋅∇ωi′)(∇ωj⋅∇ωj′)−(∇ωi⋅∇ωj′)(∇ωj⋅∇ωi′)=⟨∇ξωi⋅∇ξωi′⟩⟨∇ξωj⋅∇ξωj′⟩−⟨∇ξωi⋅∇ξωj′⟩⟨∇ξωj⋅∇ξωi′⟩
よって、
rotNe⋅rotNe′=4{⟨∇ξωi⋅∇ξωi′⟩⟨∇ξωj⋅∇ξωj′⟩−⟨∇ξωi⋅∇ξωj′⟩⟨∇ξωj⋅∇ξωi′⟩}
となる。
Ne⋅Ne′
NxNξNx=ωi∇ωj−ωj∇ωi=ωi∇ξωj−ωj∇ξωi=J−1Nξ
であるとする。
Nex⋅Ne′x=(Nex)TNe′x=(J−1Neξ)TJ−1Ne′ξ=(Neξ)TJ−TJ−1Ne′ξ=(Neξ)T(JJT)−1Ne′ξ=(Neξ)Tg−1Ne′ξ=⟨Neξ⋅Ne′ξ⟩
となる。
∇ωi⋅Ne
∇ωi⋅Ne=J−1∇ξωi⋅J−1Neξ=(J−1∇ξωi)TJ−1Neξ=(∇ξωi)TJ−TJ−1Neξ=(∇ξωi)T(JJT)−1Neξ=(∇ξωi)Tg−1Neξ=⟨∇ξωi⋅Neξ⟩
∇ωi⋅∇ωj
∇ωi⋅∇ωj=J−1∇ξωi⋅J−1∇ξωj=(J−1∇ξωi)TJ−1∇ξωj=(∇ξωi)TJ−TJ−1∇ξωj=(∇ξωi)T(JJT)−1∇ξωj=(∇ξωi)Tg−1∇ξωj=⟨∇ξωi⋅∇ξωj⟩
有限要素行列
式(eq:A−ϕ)を行列にする。
物理法則はあらゆる空間のすべての点で成立する法則であるのでこの法則は要素m内の任意の点xでも成り立つ。
rotμ−1rotA+σ∂t∂A+σgrad∂t∂ϕ=Jsource
A(x)=e∈Edge∑AeNe(x)
ϕ(x)=n∈Node∑ϕiLi(x)
Nk=ωi∇ωj−ωj∇ωi
この式にガラーキン法を適用する。
重みは辺Ne′だ。
ベクトル公式を一つ紹介する。
なお、時間による偏微分をみやすくするために∂t∂A=A˙とする。
div(a×b)=b⋅rota−a⋅rotb
それじゃlet’s go
とりあえず両辺にNe′との内積を取る。
Ne′⋅(rotμ−1rotA+σA˙+σgradϕ˙)=Ne′⋅Jsource
右辺から計算していこう
(LHS)=μ−1rotA⋅rotNe′+div(μ−1rotA×Ne′)+σ(Ne′⋅A˙+gradϕ˙)
これを要素m内のxについて積分(要素m内、体積分)する。
これを解析対象Mについて積分(体積分)する。解析対象Mが占める三次元空間をΩとする。
∫ΩNe′⋅(rotμ−1rotA+σA˙+σgradϕ˙)dV=∫ΩNe′⋅JsourcedV
先程計算したものを使用して右辺を計算する。
(LHS)=∫Ωμ−1rotA⋅rotNe′+div(μ−1rotA×Ne′)+σ(Ne′⋅A˙+Ne′⋅gradϕ˙)dV=∫Ωμ−1rotA⋅rotNe′dV+∫Ωdiv(μ−1rotA×Ne′)dV+∫Ωσ(Ne′⋅A˙+Ne′⋅gradϕ˙)dV=∫Ωμ−1rotA⋅rotNe′dV+∫∂Ωμ−1rotA×Ne′⋅dS+∫Ωσ(Ne′⋅A˙+Ne′⋅gradϕ˙)dV
ここで二段目の式変形の第二項ではガウスの法則を使った。
境界では磁束密度B=rotAは面に対して垂直であり特別に∂ΩにおいてB∥nつまりB×n=0 という条件をつける。
これにより、
(LHS)=∫Ωμ−1rotA⋅rotNe′dV+∫Ωσ(Ne′⋅A˙+Ne′⋅gradϕ˙)dV
さて、積分の前提として積分対象は非交叉な積分対象に分割できる。
Ω=m∑Vm
とする。
ここで分割した積分対象 要素mについて考える。
ここでA,ϕなどを形状関数で表現したものを代入する。なお、第二項と第三項を入れ替えている。
(LHS)m=∫Vmμ−1rotA⋅rotNe′dV+∫Vmσ(Ne′⋅A˙+Ne′⋅gradϕ˙)dV=e∈mE∑Ae∫Vmμ−1rotNe⋅rotNe′dV+e∈mE∑A˙e∫VmσNe′⋅NedV+n∈mN∑ϕ˙n∫VmσNe′⋅gradLndV
そこで
Kee′KnnKe′n=Kne′Ce′e=Cee′Ce′n=∫Vmμ−1rotNe⋅rotNe′dV=0=0=∫VmσNe′⋅NedV=∫VmσNe′⋅gradLndV
これを用いると
(LHS)(LHS)m=m∑(LHS)m=e∑AeKee′+e∑A˙eCe′e+n∑ϕ˙nCe′n
また、Kee′,Ke′n,Knn,Cee′,Ce′n,Cnnなどを成分にもつ行列を考え、
A=(A0,…,Ae,…,AE−1,ϕ0,…,ϕn…ϕN−1)
とし、
(RHS)=∫ΩNe′⋅JsourcedV=Fe′
とする。
KA+CA˙=F
が得られる。
不完全コレスキー分解前処理共役勾配法
ゲージ変換と電流の発散条件
さて、先程導出した式だが実はうまく解けない。
時間変化をしないC=Oの状態でも解けない。
これはKが必ず特異行列になることに由来する。
これは四面体を考えてみればわかる。
対象から四面体要素mを一つ取り出して磁束密度B=rotAを計算することを考えてみよう。
辺形状関数の標本点は辺に割当てられ、磁束密度は面に割り当てれられる。
磁束密度がベクトルポテンシャルの標本点の線形和で表されるとする。
四面体の面は4つに対して辺は6本だ。つまり、各面に割り当てられる磁束密度を求めるにあたって辺の数が多すぎるため方程式は不定となる。(自由度が多すぎて解が一意に定まらない。)
四面体のある面でループを作る際、それは補木と木に分割することができる。木(または補木)を一意に決定するとループが決まるため、Kのrankは補木の辺の数e−n+1と等しくなる。
これは図形の根本的な問題をはらんでいる。
そこで以下ではどのようにすればこの方程式が解けるのかを見ていく。
クランク・ニコルソン法
共役勾配法
不完全コレスキー分解