2.1.0.1 脱線

実際、文法のほとんどは C, C++ のそれに近いので、 簡単な C 言語の計算プログラムは比較的簡単に FreeFem++ に書き換えられる (と感じている)。論より証拠。差分法のプログラムを書いてみよう。

heat1d-e-freefem.edp -- 1次元熱方程式に対する差分法プログラム

// heat1d-e-freefem.edp
// 実行: FreeFem++ heat1d-e-freefem.edp
// N, x が大域的な識別子を隠すと警告が出る (つまり名前が衝突する)。

int i, N=50, n, nMax;
real h = 1.0 / N, lambda = 0.5, Tmax = 1.0;
real tau = lambda * h^2;
real[int] x(N+1);
real[int] u(N+1);
real[int] newu(N+1);

cout << "h= " << h << endl;
cout << "lambda= " << lambda << endl;
cout << "tau= " << tau << endl;

func real f(real x) {
  if (x < 0.5)
    return x;
  else
    return 1 - x;
}

for (i = 0; i <= N; i++) {
  x[i] = i * h;
  u[i] = f(x[i]);
}
plot([x,u], bb=[[-0.1,-0.1],[1.1,1.1]],aspectratio=true, wait=true);

nMax = rint(Tmax / tau);
cout << "nMax =" << nMax << endl;
for (n = 1; n <= nMax; n++) {
  for (i = 1; i < N; i++)
    newu[i] = (1.0 - 2.0 * lambda) * u[i] + lambda * (u[i+1] + u[i-1]);
  // cout << newu << endl;
  newu[0] = newu[N] = 0;
  u = newu;
  plot([x, u], bb=[[-0.1,-0.1],[1.1,1.1]],aspectratio=true);
}

なお、C++ ライクな cin も使うことが出来るので、 N の値をキーボード入力することも可能である。
int i, N, n, nMax;
cout << "input N: ";
cin >> N;
real h = 1.0 / N, lambda = 0.5, Tmax = 1.0;



桂田 祐史