3

投稿日

更新日

境界要素法(BEM)の基礎 理論編

0. 境界要素法の基礎

境界要素法(BEM)は有限差分法(FDM)・有限要素法(FEM)に並んでメジャーな解析手法である。
境界要素法の手法に関してはネット上にいくつか転がっているが、今回、自分のためにも定式化の流れをまとめたくなった。

この記事では、昔書いた有限差分法有限要素法の記事と同様にポアソン方程式を対象とする。
ラプラス方程式でもよかったが、簡単にググったところ意外とポアソン方程式の例がなかったのでせっかくなのでこっちにした。

境界要素法は有限差分法と比較して数学的操作が結構面倒だ。
この記事ではその面倒な定式化の部分を境界要素法のまとめようと思う。
本当はプログラムの実装まで含めて一つの記事にしたかったのだが、Advent Calendar 2022に間に合わなかった…。

1. 数学的準備

あまり見慣れない公式や関数が出てくるので、先にそちらを解説しよう。
前提知識としては、の意味とガウスの発散定理がわかれば問題ないと思う。

1.1 多次元の部分積分法

部分積分については今さら説明するまでもないと思うが、導出からやってみよう。
まず、関数の積の微分は以下のように分解できる

(p(x)q(x))=p(x)q(x)+p(x)q(x)

この両辺を[a,b]の範囲で積分すると、

(1)[p(x)q(x)]ab=ab(p(x)q(x)+p(x)q(x))dx

となり、あとは並び変えると、

abp(x)q(x)dx=[p(x)q(x)]ababp(x)q(x)dx

となる。簡単だ。

さて、この部分積分、一次元の関数ではなく高次元の場合に拡張するとどうなるだろうか。
ナブラの公式で、以下のようなものがある。

(pq)=pq+pq

次元は何次元でもいいのだが、理解しやすいように二次元か三次元としておこう。
これを領域Ωで積分する。Ωは任意1の領域だ。二次元なら円や三角形、三次元なら球や四面体などになる。
すると、

Ω(pq)dΩ=Ω(pq+pq)dΩ

ここで、左辺にガウスの発散定理を適用する。

Γ(pq)ndΓ=Ω(pq+pq)dΩ

この時、ΓΩの境界、例えば二次元の円なら円周、三次元の球なら表面を意味する。
nはその境界の外側に向かう単位法線ベクトルだ。
これを並び変えると、

(2)ΩpqdΩ=Γ(pq)ndΓΩpqdΩ

となる。

また、文字をp=qq=pと入れ替えて並び変えると、

(3)Ω(p)qdΩ=Γ(pq)ndΓΩpqdΩ

という式も得られる。

この二つが高次元の部分積分である。右辺第1項が部分的に積分した項だ。
……え? 積分できてないだろって? いやいや、領域全体の積分を境界のみにしたのだから、積分したといえるだろう。
……納得できないかもしれないが、境界要素法にはこの公式が必須なので、覚えておこう。

1.2 デルタ関数

わかるようでわからない、デルタ関数の解説もしておこう。
デルタ関数δ(x)は以下のように定義される超関数2だ。

(4)δ(x)={(x=0)0(x0)

グラフで表すとこんな感じ。
mojikyo45_640-2.gif

さらにデルタ関数は次の積分を満たすように定義される。

f(x)δ(x)dx=abf(x)δ(x)dx=f(0)

ただし、ここでa<0<bである。つまり、積分区間に0が含まれていることが条件だ。
デルタ関数についてはこれがすべてと考えてもらっていい。

この定義から、δ(xξ)とすると、

f(x)δ(xξ)dx=abf(x)δ(xξ)dx=f(ξ)

がえられる。このときは、a<ξ<bである。つまり積分区間にξが含まれていることが条件といえる。
これは変数変換を使えば簡単に証明できる。

次に、デルタ関数を多次元に拡張しよう。といっても、これも難しくない。

(5)δ(x,y)={(x=0y=0)0(x0y0)

は"かつ"、は"または"を意味する。
つまり、x=0かつy=0の時だけ無限大で、そのほかは0となる超関数だ。
そして、積分のほうも同様である。

Ωf(x,y)δ(x,y)dΩ=f(0,0)

下図のようにΩ(0,0)を含む任意の領域だ。もちろん、一次元と同様に無限に大きい領域でもよい。

path2338.png

同様に、f(xξ,yη)のとき、

Ωf(x,y)δ(xξ,yη)dΩ=f(ξ,η)

となる。Ωの条件は(ξ,η)を含む領域である。

xieta.png

……すこし話がそれるが、f(x,y)はベクトル表記を用いてf(x)と表すことが多い。
x=(x,y),ξ=(ξ,η)とすると、上式は次のように表せる。

(6-A)Ωf(x)δ(xξ)dΩ=f(ξ)

今後もこの表現で解説するので慣れておこう。

さて、上式においてξが領域Ωの外側のとき、当然、その答えは0となる。
なぜなら、δ(x)が0だからだ。

(6-B)Ωf(x)δ(xξ)dΩ=0

xieta_out.png

それでは、ξが境界上だったらどうなるだろうか。その答えは単純で次のようになる。

(6-C)Ωf(x)δ(xξ)dΩ=cf(ξ)

この右辺のc滑らかな境界上なら1/2になる。

nameraka.png

滑らかというのは簡単に言えば曲線や直線のこと、要は角ばってないということだ。領域外なら0, 領域内ならf(ξ)だから、境界上は12f(ξ)となるというのは直観的な気がする。

つぎに滑らかではない場所は、角の角度で計算できる。
例えば、Ωを長方形として、その頂点ならば、内角は90°である。
ここから、c=90/360=1/4と計算する。これもまた直観的だ。

no_nameraka.png

ξΩの外側ならc=0ξΩの内側ならc=1とすれば、式(6-A)-(6-C)はまとめるて次のように表すことができる。

(6)Ωf(x)δ(xξ)dΩ=cf(ξ)

境界要素法ではこの式をそのまま使うので、覚えておこう。

2. 境界要素法

定式化する前に、境界要素法の特徴を説明をしていこう。
有限差分法や有限要素法と違って、境界要素法は境界のみを分割する手法だ。
path164.png

よって、格子数がほかの手法と比較してとても少なくなる。これは計算時間やメモリの観点からいうとメリットに思える。
しかし、境界要素法は有限差分法・有限要素法と違って、連立方程式が密になるので、どちらが高速かといわれると難しい。

また、有限差分法や有限要素法は格子点上の値を求める手法だったが、境界要素法は関数をそのまま求める手法である。これもほかの手法にはない特徴だといえる。

それでは、そんな癖のある手法である境界要素法を定式化していこう。

2.1 問題設定

今回も簡単のため、u(x)=uが未知の関数、f(x)=fが既知の関数とした、以下の二次元ポアソン方程式を考える。

u=f  (in Ω)

また、Ωは計算領域を表す。

多くの記事では一部をノイマン境界条件、一部をディリクレ境界条件として同時に説明することが多いのだが、わかりやすくするために、以下のようなディリクレ境界条件のみの場合を考えよう。
ノイマン境界条件についての拡張ものちに話すので安心してほしい。

u=U  (in Γ)

ここで、ΓΩの境界である。

2.2 境界積分方程式の導出

まず、ポアソン方程式の両辺にu(x)=uという関数をかける。このuは後々ちゃんと定義するので、とりあえず今は何らかの関数ということだけ認識しておこう。

(u)u=fu  (in Ω)

さらに、これを領域Ωで積分する。

Ω(u)udΩ=ΩfudΩ  (on Γ)

そしてここで、先ほどの多次元の部分積分を使う。

式(3)のp=u, q=とすると、次のように変形できる。

Γ(u)undΓΩuudΩ=ΩfudΩ

さらに、この第二項をもう一回部分積分する。
式(2)のp=u, q=uとすると、次のように変形できる。

Γ(u)undΓΓuundΓ+ΩuudΩ=ΩfudΩ

2.3 グリーン関数の導入

ここで、一旦放置していたuを次のように定義しよう。

(7)u=δ(xξ)

すると、先ほどの式は次のように変形できる。

Γ(u)undΓΓuundΓ+Ωuδ(xξ)dΩ=ΩfudΩ

この左辺第3項はデルタ関数の項で話した式(6)から、

Γ(u)undΓΓuundΓ+cu(ξ)=ΩfudΩ

と表せる。
最後にこれを並び変えると、

(8)cu(ξ)=ΓuundΓΓ(u)undΓ+ΩfudΩ

という式が得られる。

ここで一旦整理しよう。
左辺がxからξになったのでちょっと混乱したかもしれないが、ξを変数とみなして、右辺を何とかして求めることができれば、uという関数がどういう形をしているのかがわかる。
今のところ上の中で既知のものは、第一項のuと第三項のfのみだ。第一項のuは境界上のみで、ディリクレ境界条件で定義されている。

手がかりを増やすためにも、次はuについて考えよう。

uは式(7)のように定義されており、このような関数はグリーン関数という名前がある。
実はこのグリーン関数がどんな形をしているかは偉大な先人たちが計算してくれている。
ここで導出まで書くと少し冗長になるので省略する。今回はありがたくそのまま使わせていただくことにしよう3

二次元の場合、uは以下のような関数になる。

(9)u=12πln|xξ|

これでuの具体的な形がわかったため、uも簡単に計算できる。
つまり、式(8)の第一項と第三項が計算できることになる。
あとはuさえわかれば、uの形が分かることになるのだ! ゴールが見えてきた!

2.4 境界積分方程式の離散化

前述の通り、境界要素法は計算領域の境界を離散化する手法であり、離散化によりこの境界上のuを求める。
まず、式(8)の右辺を全部左にもってこよう。

(10)cu(ξ)ΓuundΓ+Γ(u)undΓΩfudΩ=0

そして図のようにΓΓ1,,ΓNと分割する。
分割.png

すると、それぞれの積分は次のように分割した境界上の積分の和に分解できる。

(11)cu(ξ)i=1NΓiuundΓ+i=1NΓi(u)undΓΩfudΩ=0

この時、各Γ1,,ΓNの中心を代表点として、その座標をx1,xNとしよう。

ここで、up, unqという関数であると近似をする。
pqは各Γiに渡って一定であり、その値はpi, qiとする。
すると、上式はさらに次のように変形できる。

cu(ξ)i=1NΓipiundΓ+i=1NΓiqiudΓΩfudΩ=0cu(ξ)i=1NpiΓiundΓ+i=1NqiΓiudΓΩfudΩ=0

つぎに、u=p, un=qとする。こちらは近似ではなく単純にわかりやすいように文字を置き換えただけだ。
pqはどちらもxξの関数である。
そこで、ξ=xjのとき、それぞれpj, qjとする。
これを使って、上式をさらに書き換えよう。ついでに、第一項もu(ξ)=pjと置き換えておく。すると、

cpji=1NpiΓiqjdΓ+i=1NqiΓipjdΓΩfudΩ=0

となる。
さらに、見やすくするために、以下のようにPi,j, Qi,jを定義する。

Pi,j=ΓipjdΓQi,j=ΓiqjdΓ

すると、次のようになる。

(12)cjpji=1NpiQi,j+i=1NqiPi,jΩfudΩ=0

よし、これで、j=1,,Nとすれば連立方程式にできる!! 
少し混乱してるかもしれないので、整理しよう。

  • pi=u(xi): 既知の値。ディリクレ境界条件で与えられている。
  • qi=un(xi): 未知数
  • Pi,j=Γiu(ξ=xj)dΓ: xに関する既知の関数の積分値。式(9)から計算できる。
  • Qi,j=Γiun(ξ=xj)dΓ: xに関する既知の関数の積分値。式(9)から計算できる。
  • Ωfu,dΩ: 既知の関数fと既知の関数uの積の積分値

つまり、式(12)はqiに関する連立方程式なのだ。連立方程式っぽく書き換えよう。

{P1,1q1+P2,1q2++PN,1qN=c1p1+i=1NpiQi,1+ΩfudΩP1,2q1+P2,2q2++PN,2qN=c2p2+i=1NpiQi,2+ΩfudΩP1,Nq1+P2,Nq2++PN,NqN=cNpN+i=1NpiQi,N+ΩfudΩ

この連立方程式を解けば、めでたくqi=u(xi)nの値が解けたことになる。

あとは、式(8)に代入すれば全領域のuの値を求めることができる。

それでは、先延ばしにしていたノイマン境界条件の場合はどうすればいいだろうか。
これは特に難しいことじゃない。上記はディリクレ境界条件だからpiが既知でqiが未知だった。
ノイマン境界条件は単純にqiが既知でpiが既知になるだけだ。

同様に、境界の一部がディリクレ境界条件、一部がノイマン境界条件の場合は、ディリクレ境界条件が与えられている場所はpiを既知、ノイマン境界条件が与えられている場所はqiを既知として連立方程式を立てればいいだけである。

2.5 積分の計算

上記のPi,j, Qi,j, そしてΩfudΩはそれぞれ実際に計算する必要がある。
この積分は解析的に求めることができない場合もあり、その場合は数値積分が必須になる。

実際にPi,jを計算してみよう。

Pi,j=ΓipjdΓ=Γi12πln|xxj|dΓ=12πΓiln(xxj)2+(yyj)2dΓ

ここで、Γi(xi,yi)から(xi+1,yi+1)までの直線としよう。
もちろん、境界が曲線の場合は曲線で計算するほういいと思うが、計算の都合上、直線として計算することも多い。
分割数を増やしていけば曲線による影響を徐々に無視できるようになるからだ。

ということで、直線で線積分する。線積分の計算法は忘れやすいので実際にやっていこう。
(xi,yi)から(xi+1,yi+1)までの経路は次のように表せる。

(xy)=(xi+(xi+1xi)tyi+(yi+1yi)t)=(xi+tΔxiyi+tΔyi)  (0t1)

ここで、Δxi=xi+1xi, Δyi=yi+1yiである。

そして、これをtで微分すると、

ddt(xy)=(ΔxiΔyi)

となる。
よって、元の線積分は次のように変換できる。

12πΓiln(xxj)2+(yyj)2dΓ=12π01ln(tΔxi+xixj)2+(tΔyi+yiyj)2|ΔxiΔyi|dt=12π(Δxi2+Δyi2)01ln(tΔxi+xixj)2+(tΔyi+yiyj)2dt

あとは積分計算するだけ…だが、あまりにも面倒なので、Wolfram Alphaで計算した。
Δxi=a, xixj=b, Δyi=c, yiyj=dとして計算を投げると次のようになった。

数式.png
Wolfram Alphaの計算結果へ

同様にして、Qi,jも頑張れば計算できる。
ただ、複雑な式になることが目に見えているので、今回は省略する。

このように、計算結果はかなり複雑になる。
プログラムにするときはそのまま打ち込めば問題ない……とはいえ、めんどうなら、数値積分した法がいいと思う。
数値積分のモジュールはたくさんあるし、格子分割を細かくしてしまえば、数値積分のほうも精度が高くなっていくからだ。

3. まとめ

この記事では境界要素法の定式化について解説してきた。

二次元ポアソン方程式の場合、最終的な流れは次の通りだ。

まず、以下の連立方程式を解く。

{P0,0q0+P1,0q1++PN,0qN=c0p0+i=0NpiQi,0+ΩfudΩP0,1q0+P1,1q1++PN,1qN=c1p1+i=0NpiQi,1+ΩfudΩP0,Nq0+P1,Nq1++PN,NqN=c1pN+i=0NpiQi,N+ΩfudΩ

ここで、それぞれの文字の定義は次のようになっている。

  • pi=u(xi): ディリクレ境界条件で与えられている場合、既知の値。違う場合未知数
  • qi=un(xi): ノイマン境界条件で与えられている場合、既知の値。違う場合未知数
  • Pi,j=Γiu(ξ=xj)dΓ: xに関する既知の関数の積分値。式(9)から計算できる。
  • Qi,j=Γiun(ξ=xj)dΓ: xに関する既知の関数の積分値。式(9)から計算できる。
  • Ωfu,dΩ: 既知の関数fと既知の関数uの積の積分値

そして、uは次のような関数である。

u=12πln|xξ|

これを用いて、すべてのpi=u(xi), qi=un(xi)を求めれば、

cu(ξ)=ΓuundΓΓ(u)undΓ+ΩfudΩ

に代入して、計算領域全域のuを求めることができる。

今回は理論だけになってしまったが、近いうちに実装のほうも書いていきたい。

  1. 本当は「区分的に滑らか」というめんどくさい指定があるのだが、普通に領域を作る分には問題ないので無視しよう。

  2. 超関数については複雑な話になるので今回は普通の関数として扱っていこう。

  3. グリーン関数の具体的な形は微分方程式によって違うので、色々と工夫して頑張って求めるしかない。ポアソン(ラプラス)方程式のグリーン関数はいろいろなサイトに導出が乗っているので気になる人は調べてみよう。

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

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

コメント

この記事にコメントはありません。
あなたもコメントしてみませんか :)
新規登録
すでにアカウントを持っている方はログイン
3