数理指向

はじめに

有限要素法超入門

メッシュ生成有限要素空間を生成

弱形式

解く

FreeFem++数理指向プログラミング
大塚 厚二 ∗
∗ 広島国際学院大学 広島市安芸区中野 6-20-1

広島大学 9 月 24 日

• FreeFem++

http://www.freefem.org/ff++/• FreeFem++日本語

http://comfos.org/jp/ffempp/• 有限要素法で学ぶ現象と数理―FreeFem++数理思考プログラミング

http://comfos.org/jp/ffempp/book/

評価

数理指向

はじめに

有限要素法超入門

メッシュ生成有限要素空間を生成

弱形式

解く

数学をプログラミング言語に• 十数年前、コンピュータがあれば数学はいらない「数学よりプログラミングの方が修得が楽」と言われた．

• プログラミングが複雑に，プレハブ工法オブジェクト指向プ

ログラミングが登場• オブジェクト指向での重要なのは抽象化．
• 数学をプログラミング言語に使えれば良いのでは？
• なぜ駄目なのか？=⇒ 数学を修得するのが難しい• しかし，プログラミングの最先端は数学以上に難しく

評価

数理指向

はじめに

有限要素法超入門

メッシュ生成有限要素空間を生成

弱形式

解く

数理指向プログラミング• プログラミング言語 (数学) の知識は寿命が短い (長い)例) アセンブラ (機械優先) → C → Visual C(GUI) → C++• 数学を学ぶことは，抽象化の訓練に• ただし，抽象化によって下部構造が完全に隠蔽できた
ためしがない．数学以外にも知識が必要• 流れ制御 (分岐，繰り返し) や入出力
• 数理情報の可視化• FreeFem++ vs 数式処理 (Mathematica のような)• 矩形領域以外は，解を数式で記述するのは難しい．
• 数式処理で領域を分割するのは困難• もし，数式処理だけで有限要素法を記述すると膨大な計算• FreeFem++はホワイトボックス型問題解決環境 (PSE)• 計算方法を細かく指定できる．
• 計算 (途中) 結果を抽出できる．

評価

数理指向

はじめに

有限要素法超入門

メッシュ生成有限要素空間を生成

弱形式

解く

FreeFem++の歴史
1987 MacFem/PCFem：商用ソフト Pascal を使って
O.Pironneau が作成
1992 FreeFEM：C++で書き直し．単一メッシュ/P1,P0
要素，アダプティブメッシュ(bamg) O.Pironneau,
D.Bernardi, F.Hecht , C.Prudhomme
1996 FreeFem+：複数メッシュ/P1,P0 要素，関数の代数
処理，O.Pironneau, D.Bernardi, F.Hecht,
K.Ohtsuka
1998 FreeFem++：複数メッシュ/複数有限要素，拡張機能，F.Hecht, O.Pironneau, K.Ohtsuka
1999 FreeFem 3d：S.Del Pino2008 FreeFem++ V3：1d, 2d, 3d といったマルチ次元での有限要素計算を実現
2014 [http://comfos.org/jp/ffempp/book/] 有限要素法で学
ぶ現象と数理―FreeFem++数理思考プログラミング―(共立出版) 大塚厚二, 高石武史
(以下の p.〜は本の場所)

評価

数理指向

はじめに

有限要素法超入門

メッシュ生成有限要素空間を生成

弱形式

解く

開発メンバーFrédéric Hecht フランス・パリ第 6 大学
https://www.ljll.math.upmc.fr/J.L.Lions 研究
所 (LJLL)
プロジェクトのリーダー，アダプティブメッシュ，
有限要素空間など，元 INRIA 研究員
Olivier Pironneau LJLL，INRIA コンサルタント
元リーダー，計算アルゴリズム，流体解析，マニュ
アルの第３章など
Antoine Le Hyaric CNRS, LJLL
並列計算，数値可視化など
統合環境 FreeFem++-cs を開発
Jacques Morice LJLL(ポスドク), 3 次元メッシュと可視化ツール
medit の組込
Sylvian Auliac LJLL(大学院生)，非線形最適化ライブラリ(NLopt, IPOPT)，関数最適化計算アルゴリズム(CMA-ES) など
Kohji Ohtsuka 広島国際学院大学

評価

数理指向

はじめに

有限要素法超入門

メッシュ生成有限要素空間を生成

弱形式

解く

統合開発環境 FreeFem++-cs
開発サイト www.freefem.org/ff++/ に無く，下記から
http://www.ann.jussieu.fr/lehyaric/ffcs/
並列計算などもサポート，日本語は utf-8 のみで直接入力不可

評価

数理指向

はじめに

有限要素法超入門

メッシュ生成有限要素空間を生成

弱形式

誰のため，目的は
目的は (F.Hecht のスライドから)

1. 研究開発 (R&D)
2. 学術研究3. 有限要素法，偏微分方程式，弱解や変分形式の教育
4. アルゴリズムの実現性チェックに向けた試作
5. 数値実験
6. 計算科学や並列計算 (MPI)
誰のため：研究者，エンジニア，大学教員，学生…
メーリングリスト：Freefempp@ljll.math.upmc.fr
一日に 5〜20 通，377 人のメンバー

1000 人以上の実利用者 (月に 200 以上のダウンロード)

解く

評価

数理指向

はじめに

有限要素法超入門

メッシュ生成有限要素空間を生成

弱形式

解く

主な機能 (2d,3d) I
1. 多くの有限要素：連続 P1,P2 要素，不連続 P0, P1,
RT0,RT1,BDM1-要素，辺要素，MINI 要素など
2. メッシュ非依存性：メッシュT 1 で計算した有限要素関数 fを他のメッシュT 2 の有限要素関数や配列に補間する．
3. ベクトルや行列を使った弱形式による複素・実問題の定義
有限要素法のアルゴリズムの多くは，行列やベクトルで記述される．
4. 不連続 Galerkin による定式化 (現在 (2010) は二次元のみ)
5. 複数の行列解法： LU, Cholesky, Crout, CG, GMRES,UMFPack, SuperLU, MUMPS, HIPS , SUPERLU DIST,PASTIX. ... sparse linear
6. 固有値問題：ARPACK を使った解法
7. 統合環境：FreeFem++-cs
8. 境界の解析的表現

評価

数理指向

はじめに

有限要素法超入門

メッシュ生成有限要素空間を生成

弱形式

解く

主な機能 (2d,3d) II
9. 自動メッシュ分割：Delaunay-Voronoı̈分割 (2d,3d(tetgen))10. メッシュや有限要素解の保存・読み込み
11. アダプティブメッシュ： 解などの Hessian を使った距離に基づく
12. 動的リンク機能：parview, gmsh , vtk, medit, gnuplot といった外部のプログラムを追加することで機能を拡張できるような機構
13. 並列処理の MPI をフルにサポート
14. 非線形最適化ツール：CG, Ipopt, NLOpt, stochastic
15. 豊富なサンプル：Navier-Stokes (2d/3d), elasticity (2d/3d),
流体・構造連成問題, 固有値問題, Schwarz の領域分割法, 残差誤差指標「有限要素法で学ぶ現象と数理」には，形状最適化設計や反応拡
散問題の計算 (高石) がある．

評価

数理指向

はじめに

有限要素法超入門

メッシュ生成有限要素空間を生成

弱形式

解く

有限要素法とは有限要素法は偏微分方程式境界値問題の数値解法で，変分法に基づため数学理論が明確である．次の５つのステップから構成される.

1. メッシュTh (Ω) 自動生成 三角形分割 (2d)，四面体分割 (3d)2. 有限要素空間 Vh (Th (Ω), •) を生成
3. 弱形式から連立方程式の生成
強形式 −∆u = f(Ω上), u = 0

弱形式 a(u, v) − ℓ(v) = 0,∫a(u, v) =∇u · ∇v(∂Ω上)∫f v dxℓ(v) =ΩΩ

だたし u = 0(∂Ω上)()()
4. 連立方程式 Au = F を解く A = a(ϕ j , ϕi ) , F = ℓ(ϕi )5. 解の評価 (数値可視化, 解の改良など)

評価

数理指向

はじめに

有限要素法超入門

メッシュ生成有限要素空間を生成

弱形式

解く

ex01.edp (p.28) I
border C(t=0,2*pi){x=cos(t); y=sin(t);} //単位円周
mesh Th = buildmesh (C(50)); //1. メッシュ生成 Th//(図 3 参照)
3: fespace Vh(Th,P1); //2. 有限要素空間 Vh P1 要素
4: Vh u,v;//u, v∈Vh
5: func f = -1;//既知関数 f (x, y) = −1
6: func g = 0;//g(x, y) = 0
7: problem Poisson(u,v) = //3. 弱形式 弱形式 (2)8:int2d(Th)(dx(u)*dx(v)+dy(u)*dy(v))∫//a(u, v) = Ω ∇u·∇v∫
9:- int2d(Th)(f*v)//−ℓ(v) = Ω f v
10:+ on(C,u=g);//u = g (∂Ω 上)
11: Poisson;//4. 数値解を求める
12: plot(u);//5. 解の等高線表示 図 2 参照
1:
2:

評価

数理指向

はじめに

有限要素法超入門

メッシュ生成有限要素空間を生成

弱形式

ex01.edp (p.28) II

図: 三角形分割 Th(= Th (Ω))

図: plot(u) 等高線表示

解く

評価

数理指向

はじめに

有限要素法超入門

メッシュ生成有限要素空間を生成

弱形式

解く

2.2 メッシュ(p.32), 3.1 メッシュ分割 (p.69)
FreeFem++では三角形分割，四面体分割といったメッシュ生成について複数の方法を提供している．
1. 標準的な方法では，領域の境界 ∂Ω を複数の曲線
Γi , i = 1, · · · , L で構成し，Γi を次のようにパラメータ表示する．
Γi = {(φx (t), φ y (t)) : α ≤ t ≤ β}
2. 縦横の分割数を指定して長方形を分割する (square)．有限要素法のテスト，アルゴリズムの検証，そして計算精度をチェックする場合には便利である．
3. CAD ソフトなどで生成したメッシュファイル xxxxx.msh をmesh Th = readmesh("xxxxx.msh");で読み込む．以後，メッシュは Th を参照するだけで利用できる．(3.1,p.69)

4. 画像の境界を認識してメッシュを生成する．(3.1,p.72)

評価

数理指向

はじめに

有限要素法超入門

メッシュ生成有限要素空間を生成

弱形式

解く

1.1 境界を定義

1:
2:

border C(t=0,2*pi){x=cos(t); y=sin(t);} //単位円周
mesh Th = buildmesh (C(50)); //1. メッシュ生成 Th

領域 Ω を決め，メッシュ分割
Th (Ω) を生成．使われる予約語
は border, mesh, buildmesh．

図: 2: 三角形分割 Th(= Th (Ω))

評価

数理指向

はじめに

有限要素法超入門

メッシュ生成有限要素空間を生成

弱形式

解く

smileface.edp(p.37) IF
E1

三角形分割の例) 図 4 では，F,E1,E2,C0,C1,C2,C3,C4 と8 曲線が使われている．

E2

C0
C4

C1

C2

C3

図: 笑う顔 (smile face) 曲線

３次元領域 Ω の境界 ∪Γ j (曲面) は movemesh23 で生成し，内部への４面体分割は tetg()
で生成 (p.83)

評価

数理指向

はじめに

有限要素法超入門

メッシュ生成有限要素空間を生成

弱形式

解く

smileface.edp(p.37) II

図 5 のような領域になるには曲線の向きが重要になる．境界には buildmesh で指定した
順番で，F(1), E1(2), E2(3),C1(4), C2(5), C3(6), C4(7),C0(8) と番号が付く．

図: 笑う顔の三角形分割

評価

数理指向

はじめに

有限要素法超入門

メッシュ生成有限要素空間を生成

弱形式

解く

3 次元メッシュ(境界＝曲面の和)p.83
3 次元領域 Ω を境界面J

Γ = ∪ j=1 Γ j(曲面の和),

Γ j = Φ j (Π j )ここで，Π j は平面，Φ j (x, y) は写像．
jjjmesh3 Th (Γ j )=movemesh23(Th (Π j ),transfo=[Φ1 , Φ2 , Φ3 ]);として 3 次元曲面のメッシュTh (Γ j ) を作り，

mesh3 Th (Γ)=Th (Γ1 ) + · · · + Th (Γ J );で境界面の三角形分割が出来る．ただし，メッシュ曲面 Th (Γ j ) はJΓ j とはずれるため ∪ j=1 Γ j と一致しないだけでなく，閉曲面にならない場合もある．曲面から内部への分割は Tetgen を使って次のように内部に切っていく．
mesh3 Th=tetg(Th (Γ),switch="paAAQy",regionlist=domain);

評価

数理指向

はじめに

有限要素法超入門

メッシュ生成有限要素空間を生成

弱形式

解く

3 次元メッシュ(Buildlayers) p.84
平面領域 Π で定義された関数 zl (x, y) < zu (x, y) があるとき，空間Ω = {(x, y, z) : (x, y) ∈ Π, zl (x, y) < z < zu (x, y)}を４面体分割する命令として buildlayers()(p.84) があり，回転体生成にも使える．

mesh3 Th (Ω)=buildlayers(Th (Π), nz, zbound=[zl , zu ]);ここで nz は z 軸方向の分割数 (層の数)．
z 軸方向をパラメータにして平面 Π の回転体を次のように作ることができる．

mesh3 Th (Ω)=buildlayers(Th (Π), nz, zbound=[0,eπ],transfo=[y cos(z), y sin(z), x]);

評価

数理指向

はじめに

有限要素法超入門

メッシュ生成有限要素空間を生成

弱形式

解く

1.2 長方形 (square) p.33 I
正方形領域 Ω = (0, 1)2 を横４分割，縦５分割する場合はmesh Th = square(4,5);とする．長方形領域 Ω = (x0 , x1 ) × (y0 , y1 ) を n × m に分割する場
合は，

mesh Th = square(n, m, [x0 + (x1 − x0 ) ∗ x, y0 + (y1 − y0 ) ∗ y]);とする．たとえばプログラム

real x0=0.1,x1=1.5;
real y0=0.2,y1=0.8;
int n=5,m=10;
mesh Th=square(n,m,[x0+(x1-x0)*x,y0+(y1-y0)*y]);による四角形は図 6 のようになり，境界 (辺) には番号が付く．

評価

数理指向

はじめに

有限要素法超入門

メッシュ生成有限要素空間を生成

1.2 長方形 (square) p.33 II

図: square による三角形分割

弱形式

解く

評価

数理指向

はじめに

有限要素法超入門

メッシュ生成有限要素空間を生成

弱形式

解く

1.3 メッシュデータファイル

生成したメッシュを他のプログラムで再利用したい，CAD などで生成したメッシュを FreeFem++で利用したい．

savemesh 生成したメッシュを再利用するために外部記憶装置に保存 (p.70)
readmesh データ形式 (BAMG, 表 3.1(p.89)) のファイルを読み込んでメッシュを生成する．
mesh Th=readmesh("xxxxx.mesh"); //２次元
mesh3 Th=readmesh3("xxxxx.mesh"); //３次元
２次元の場合は，より単純なデータ形式 (msh, 図
3.1(p.71)) がある．

mesh Th=readmesh("xxxxx.msh");

評価

数理指向

はじめに

有限要素法超入門

メッシュ生成有限要素空間を生成

弱形式

解く

1.4 画像データからの生成

図: biwako2.edp(p.72) 元画像 (3 行目)，縁を抽出した画像 (15 行目)，
生成されたメッシュ(30 行目)

評価

数理指向

はじめに

有限要素法超入門

メッシュ生成有限要素空間を生成

弱形式

解く

2. 有限要素空間を生成 I
fespace{}Vh (Th , •) = v : v = v1 ϕ1 + · · · + vM ϕM , vi ∈ IR

型の指定 • は基底関数を選択することを表す．

Vh f=cos(pi(x-0.5))*sin(pi(y-0.5)); //Vh =Vh ( Th , •)

1.00

1.00

0.50

0.50

0.50
0.00
0.50

0.50

1.00

f (x, y) = cos(π(x − 12 )) cos(π(y − 21 ))• = P0

1.00

評価

数理指向

はじめに

有限要素法超入門

メッシュ生成有限要素空間を生成

弱形式

解く

2. 有限要素空間を生成 II
1.00

0.50

0.50

• =P1

1.00

0.50

1.00

• =P2

図: f (x, y) = cos(π(x − 12 )) cos(π(y − 12 )) のグラフと有限要素空間への射
影 (補間)

評価

数理指向

はじめに

有限要素法超入門

メッシュ生成有限要素空間を生成

弱形式

解く

2. 有限要素空間を生成 III•• =P1nc 1 次非適合要素=P1b 流 体：バ ブ ル 要

素,MINI 要素

図: f (x, y) = cos(π(x − 12 )) cos(π(y − 12 ))

評価

数理指向

はじめに

有限要素法超入門

メッシュ生成有限要素空間を生成

弱形式

解く

2. 有限要素空間を生成 IV

P0,P1,P2,P1b ３次元問題 (P03d,P13d,P23d,P1b3d) も O.K.
(p.89)
P3 ２次元問題のみ O.K.?
Raviart-Thomas 要素 三角形要素の各辺を通過する流束を使うベクトル値関数，３次元問題も O.K. (• =RT03d)(p.92) (p.92)
P1dc, P2dc 1 次・2 次不連続要素 (マニュアル)
Edge03d ベクトル値関数に対する 0 次エッジ要素 (マニュ
アル)

評価

数理指向

はじめに

有限要素法超入門

メッシュ生成有限要素空間を生成

弱形式

解く

3. 弱形式から連立方程式の生成 I
2 階偏微分方程式境界値問題を FreeFem++は，H1 (Ω) でしか解けない．そのため Dirichlet 境界条件をペナルティ法で解く．
− ∆u = fΩ内;

u = g Γ上 (Γ = ∂Ω)(1)

FreeFem++では，強形式 (1) をペナルティ法を使って双線形a(·, ·) 及び線形 ℓ(·) とに分け，a(u, v) = ℓ g (v)∀v ∈ Vhといった弱形式で解く．P1 要素のときは∫a(u, v) =∇u · ∇v dΩ + on(Γ, u = 0);∫Ωℓ g (v) =f v dΩ + {gϵi }Ω
gϵi = ϵ−1 g(qi )qi ∈ Γ; それ以外 gϵi = 0

(2)
(3)
(4)

評価

数理指向

はじめに

有限要素法超入門

メッシュ生成有限要素空間を生成

弱形式

解く

評価

3. 弱形式から連立方程式の生成 II
連立方程式 Au = F を解く∫
A = (aij ) =∇ϕ j · ∇ϕi dΩΩaii = ϵ−1

(節点 q ∈ ∂Ωのとき),i∫
F = {Fi },(i , j);Fi = ℓ(ϕi ) =

Ω

(5)
∫

aii =

(
f ϕi dΩ +ϵ−1 g(qi )Ω∇ϕi · ∇ϕi dΩqi < ∂Ω)
qi ∈ ∂Ωのとき【注意】剛性行列 A を生成するとき，数値計算法により要素の格
納法 (圧縮) が異なるため，solver=を使って数値計算法を指定できる．指定しない場合は，バージョンごとに異なる数値計算法
LU,Crout,Cholesky,UMFPACK,CG,GMRESが使われる (p.50)．

数理指向

はじめに

有限要素法超入門

メッシュ生成有限要素空間を生成

弱形式

解く

評価

弱形式による記述 I
境界を Γ = ∪Γ j としてで u = 0 (Γi 上) なら，境界値問題の名前をProb としてfunc f= f (x, y);func g=g(x, y);
Vh u,v: //u,v∈ Vh (Ω) とする．
problem Prob(u,v)=a(u,v) ∫˙//例えば, Ω ∇u∇v=int2d(Th)(dx(u)*dx(v)+dy(u)*dy(v))-ℓ(v) //例えば，ℓ(v)=int1d(f*v)+on(i,u=g);
連立方程式の解法を • に選択する場合は，problem Prob(u,v,solver=•)=a(u,v)

数理指向

はじめに

有限要素法超入門

メッシュ生成有限要素空間を生成

弱形式

4. 連立方程式を解く

3. 弱形式から連立方程式の生成における連立方程式
Au = F
は弱形式の名前を書くだけ．

Prob;plot(u); //数値解 u= uh の等高線を表示
弱形式を書いて，同時に連立方程式を解く次の命令がある．

solve Prob(u,v,solver=•)=a(u,v)

解く

評価

数理指向

はじめに

有限要素法超入門

メッシュ生成有限要素空間を生成

弱形式

解く

評価

algebra.edp (p.109)
border C(t=0,2*pi){x=cos(t); y=sin(t);}mesh Th = buildmesh (C(10));fespace Vh(Th,P1);
Vh u,v,F;//解 u，テスト関数 v
func f= -1000; 6: func g=10;//Step1, 3 での u,v はダミー
varf a(u,v) = int2d(Th)( dx(u)*dx(v) + dy(u)*dy(v))+ on(C,u=0) ;9: matrix A=a(Vh,Vh); //Step2
10: varf b(u,v) = int2d(Th)( f*v )+on(C,u=0 ); // Step3
11: F[] = b(0,Vh); //Step4
12: matrix B=b(Vh,Vh); //B = (bij ), bii = ϵ−1 qi ∈Γ 以外 0
13: Vh gh = g;
14: F[] += B*gh[]; //+ϵ−1 g(qi ), qˆi∈Γ
15: u[]=Aˆ-1*F[];//連立方程式 Au[] = F[] を解く
1:
2:
3:
4:
5:
7:
8:

数理指向

はじめに

有限要素法超入門

メッシュ生成有限要素空間を生成

弱形式

解く

メッシュ非依存性 I
数値計算結果 u= uh はメッシュTh= Th (Ω) 上の有限要素関数
uh ∈ Vh (Th (Ω), •)ua∈ aVh (Tha (Ω), •) such that ua(qi )=u(qi ), qi ∈ Ω(節点) を生成

aVh ua = u;//異なるメッシュへの補間【応用例】
1. 誤差評価 異なるメッシュサイズ h < h′ での uh ∈ Vh (Th (Ω), •), uh′ ∈ Vh′ (Th′ (Ω), •) を比較 (precision02.edp, p.99)∥uh − uh′ ∥L2 (Ω)

評価

数理指向

はじめに

有限要素法超入門

メッシュ生成有限要素空間を生成

メッシュ非依存性 II

2. 領域分割法 schwarz-overlap.edp (p.102)

図: schwarz の overlap 法

弱形式

解く

評価

数理指向

はじめに

有限要素法超入門

メッシュ生成有限要素空間を生成

弱形式

解く

メッシュ非依存性 III
3. ズーミング airfoil.edp (p.106)

図: 左側が全域で右側が翼周り．上から翼周りの流れ，下が揚力の等高線

評価

数理指向

はじめに

有限要素法超入門

メッシュ生成有限要素空間を生成

弱形式

解く

5. 解を評価する I
数値計算可視化: 膨大な数となる数値計算結果をコンピュータグ
ラフィックで表示してデータに含まれる科学的な特徴や意味を直感的に理解する．

plot(a(10)+b(10)+c(10)); //曲線 a∪b∪c を表示
plot(Th); //メッシュTh を表示
plot(u); //有限要素関数 u を表示
plot([u,v]); //ベクトル値 [u,v]= (u, v) のベクトル表示
データ抽出: FreeFem++にはホワイトボックス・テストができる
各種操作がある．

1. 付録 A.9(メッシュ分割での操作,p.227) メッシュ要素 (P0 要素)，節点，サイズなどを取り出せる．
2. 付録 A.10(有限要素空間での操作,p.228) 有限要素関数の基底数 (自由度)，第 k 要素の i 番目節点番号など

評価

数理指向

はじめに

有限要素法超入門

メッシュ生成有限要素空間を生成

弱形式

解く

5. 解を評価する II

数学評価: 厳密解と近似解とを L2 ノルムなどで評価する∥u − uh ∥L2 (Ω) ≤ Ch2(p.208)における係数 C を推定する (precision02.edp, p.99)．
統計処理: 計算結果をファイルに保存し，グラフにするなど統計処理を行う．

1. 冷却の問題での温度変化 (heatS.edp, p.64)
2. 熱方程式を空間有限要素・時間差分 θ 法で解くときの誤差評
価 (evolution.edp,p.214)
θ = 0 前進差分
θ = 12 Crank-Nicolson
θ = 1 後退差分

評価

数理指向

はじめに

有限要素法超入門

メッシュ生成有限要素空間を生成

弱形式

解く

5. 解を評価する III
0.40

0.35

0.30
0
0.1
0.2

0.25

0.3
0.4
0.20
0.5
0.6
0.7

0.15

0.8
0.9
0.10

1

0.05

0.00
0.05 0.15 0.25 0.35 0.45 0.55 0.65 0.75 0.85 0.95 1.05 1.15 1.25 1.35 1.45 1.55 1.65 1.75 1.85 1.95 2.05 2.15 2.25 2.35 2.45 2.55 2.65 2.75 2.85 2.95

図: n = 0, 1, · · · での相対誤差 ∥unh (θ) − uex (nτ)∥L2 (Ω) /∥uex (nτ)∥L2 (Ω) をプ
ロット

評価

数理指向

はじめに

有限要素法超入門

メッシュ生成有限要素空間を生成

弱形式

解く

5. 解を評価する IV
評価用プログラム: メッシュサイズを変えてみたり，アダプティ
ブメッシュを使うなど試行して，可視化・データ抽出などにより最適なメッシュを検討する．
【例】L 字領域で −∆u = −1,
u = 0 (∂Ω上)(p.36)
(0,1)

be
bd

(0.5,0.5)
bc

bf
bb

(0,0)

ba

図: 三角形分割 Th(1,0)

図: plot(u) による解の等高線表示

評価

数理指向

はじめに

有限要素法超入門

メッシュ生成有限要素空間を生成

5. 解を評価する V
Th = adaptmesh(Th,u); (p.61)

i=1

plot(u)i=2plot(u)

弱形式

解く

評価

数理指向

はじめに

有限要素法超入門

メッシュ生成有限要素空間を生成

弱形式

5. 解を評価する VI
Th = adaptmesh(Th,u,err=•); (p.62)

i=1

err=0.1i=2

err=0.06

図: オプション err=を制御したアダプティブメッシュ

解く

評価

数理指向

はじめに

有限要素法超入門

メッシュ生成有限要素空間を生成

弱形式

5. 解を評価する VII

i=3

err=0.04i=4

err=0.03

図: オプション err=を制御したアダプティブメッシュ

解く

評価

数理指向

はじめに

有限要素法超入門

メッシュ生成有限要素空間を生成

弱形式

解く

5. 解を評価する VIII
FreeFem++では行列 M を使った２点 P,Q 間の距離
√
(
)
−→
−→
−→
m11 m12∥ PQ ∥M = ⟨PQ, M PQ⟩
M=m12 m22の下に Delaunay-Voronoi アルゴリズムを適用することでアダプ
ティブメッシュTh = adaptmesh(Th, f , オプション);を実現している．

1
M = |H|,ϵ(∂2 f /∂x2 ∂2 f /∂x∂y
H = ∇∇ f = 2∂ f /∂x∂y ∂2 f /∂y2・通常は f = u (有限要素解)
解の漸近挙動 u ≃ uS を使い f = uS (p.79)
・オプション err=ϵ (p61))(6)

評価