桂田 [4] の該当箇所
https://m-katsurada.sakura.ne.jp/labo/text/welcome-to-freefem/node11.html
領域の内部で熱が発生する (or 熱が吸収される) 場合の熱方程式の初期値境界値問題を解いてみよう。
つまり
は正方形領域、
は左と下の辺を合わせたもの、
は右と上の辺を合わせたものである。
以下のプログラムでは
| heatB.edp |
1 // heatB.edp --- 熱方程式を後退Euler法 (陰解法) で解く
2 // https://m-katsurada.sakura.ne.jp/program/fem/heatB.edp
3 // 菊地文雄, 有限要素法概説, サイエンス社のPoisson方程式の問題の非定常版
4 int i,m=10;
5 real Tmax=1, tau=0.01, t;
6 // 次の2行の行頭の // を削除すると、m, tau, theta が実行時に入力できる
7 // cout << "m dt theta: "; cin >> m >> tau >> theta;
8 // cout << "m=" << m << ", tau=" << tau << ", theta=" << theta << endl;
9 mesh Th=square(m,m);
10 plot(Th,wait=true);
11 fespace Vh(Th,P1);
12 func f=1; func g1=0; func g2=0;
13 func u0=sin(pi*x)*sin(pi*y);
14 Vh u=u0, uold, v;
15 plot(u,cmm="t=0",wait=1);
16 problem heat(u,v,init=i)=
17 int2d(Th)(u*v)+int2d(Th)(tau*(dx(u)*dx(v)+dy(u)*dy(v)))-int2d(Th)(uold*v)
18 -int2d(Th)(tau*f*v)-int1d(Th,2,3)(tau*g2*v)
19 +on(1,4,u=g1);
20 for (i=0;i<Tmax/tau;i++) {
21 uold=u;
22 t=(i+1)*tau;
23 heat;
24 plot(u,cmm="t="+t,wait=0); // ps="heat"+i+".ps" として保存することも可能
25 }
26 plot(u,wait=1);
|
| ターミナルでこうすれば実行できる |
curl -O https://m-katsurada.sakura.ne.jp/program/fem/heatB.edp FreeFem++ heatB.edp |
時間発展する系なので、動画で見るのが分かりやすいであろう。
https://m-katsurada.sakura.ne.jp/ana2026/heat.mp4
定常解
に収束することが分かるが、
実は、Poisson 方程式の境界値問題
(on