Poisson 方程式の境界値問題で説明します (有限要素法を自習したい場合には、 菊地文雄, 『有限要素法概説』, サイエンス社, という参考書がイチオシです)。
内の領域 (連結開集合) における Poisson 方程式の Dirichlet 問題
(PE) | ||
(DBC) |
Poisson 方程式に ( は、 内に compact な台を持つ 級の関数全体) をかけて、Green の積分公式 (多次元版部分積分) を用いると、 次式が得られます。
逆に (on ) を満たす滑らかな が、 この条件を満たせば、 は Poisson 方程式を満たすことも容易に分かります。
微分方程式を満たす を求める代りに、 (1) を満たす を見出すことを考えましょう。 解の存在を容易に保証できるようにするため、 関数空間を完備化するのが便利です (解を極限の論法で得よう、という解析学の常套手段)。 具体的には、 以下に定義する というソボレフ空間 (一般化された導関数を持つ関数からなる関数空間の一種) で を探すことにします。
(PE),(DBC) の弱解の定義 | |||
かつ
|
とは |
という関数の集合に
という内積を導入すると、 は Hilbert 空間 (完備な内積空間) になる。
とおく。 の要素は、 の要素のうちで、 ある意味で 上 0 となるものとみなすことができる。 |
を三角形の「整った」合併 で近似し、 で連続で、 各三角形上で1次関数であるような関数全体を とします。 は の有限次元部分空間とみなせ、 グラフが三角錐であるような関数 , , を 基底に取って、 各元をその基底の線型結合として表現することができます:
(PE),(DBC) の弱解の定義 (書き換え) | ||||||
かつ
|
有限要素解の定義 | ||||||
かつ
|
次のようなプログラム poisson.edp を用意します (例えば emacs を使って作成します)。
poisson.edp |
// 境界の定義 (単位円), いわゆる正の向き border Gamma(t=0,2*pi) { x=cos(t); y=sin(t); } // 三角形要素分割を生成 (境界を50に分割) mesh Th = buildmesh(Gamma(50)); plot(Th,wait=true); // 有限要素空間は P1 (区分的1次多項式) 要素 real [int] levels =-0.012:0.001:0.012; fespace Vh(Th,P1); Vh u,v; // Poisson 方程式 -△u=f の右辺 func f = x*y; // 現在時刻をメモ real start = clock(); // 問題を解く solve Poisson(u,v) = int2d(Th)(dx(u)*dx(v)+dy(u)*dy(v))-int2d(Th)(f*v) +on(Gamma,u=0); // 可視化 (等高線) plot(u,wait=true); //plot(u,viso=levels,fill=true,wait=true); // 可視化 (3次元) --- マウスで使って動かせる plot(u,dim=3,wait=true); //plot(u,dim=3,viso=levels,fill=true,wait=true); // 計算時間を表示 cout << " CPU time= " << clock() - start << endl; |
FreeFem++ で poisson.edp を実行 |
mymac% FreeFem++ poisson.edp |
キーボードからのコマンド | ||||||||||||||||||||||
|
plot(u); のところを plot(u,ps="graph.eps"); のように すると、画面に表示するだけでなく、 PostScript 形式でファイル出力できます (TEX 文書への取り込みが簡単です)。