内部で熱が発生する (or 熱が吸収される) 場合の熱方程式の初期値境界値問題
変数
については(後退)差分近似する。すなわち
,
とおいて、
弱形式は
既に
が “分かっている” とき、
これは
についての Poisson 方程式もどきに対する弱形式であり、
これまでとほぼ同様にして解くことが出来る。
| heatB.edp |
// heatB.edp --- 熱方程式を後退Euler法 (陰解法) で解く
// https://m-katsurada.sakura.ne.jp/program/fem/heatB.edp
// 菊地文雄, 有限要素法概説, サイエンス社のPoisson方程式の問題の非定常版
int i,m=10;
real Tmax=1, tau=0.01, t;
// 次の2行の行頭の // を削除すると、m, tau, theta が実行時に変更できる
// cout << "m dt theta: "; cin >> m >> tau >> theta;
// cout << "m=" << m << ", tau=" << tau << ", theta=" << theta << endl;
mesh Th=square(m,m);
plot(Th,wait=true);
fespace Vh(Th,P1);
func f=1; func g1=0; func g2=0;
func u0=sin(pi*x)*sin(pi*y);
Vh u=u0, uold, v;
plot(u,cmm="t=0",wait=1);
problem heat(u,v,init=i)=
int2d(Th)(u*v+tau*(dx(u)*dx(v)+dy(u)*dy(v)))-int2d(Th)(uold*v)
-int2d(Th)(tau*f*v)-int1d(Th,2,3)(tau*g2*v)
+on(1,4,u=g1);
for (i=0;i<Tmax/tau;i++) {
uold=u;
t=(i+1)*tau;
heat;
plot(u,cmm="t="+t,wait=0); // ps="heat"+i+".ps" として保存することも可能
}
plot(u,wait=1);
|
curl -O https://m-katsurada.sakura.ne.jp/program/fem/heatB.edp FreeFem++ heatB.edp |
ループの制御変数を i という変数にして、
problem に ,init=i と書き足すのがミソ。
最初は i が 0 であるので、init が False であるが、
それ以降は
であるので、init が True である、
つまり LU 分解済みだ、と指示するわけである。
時間が経過すると、 定常解に収束する(Poisson方程式の解に近く)様子が見える。