数値計算の結果をプロットする(3)
数値計算の結果をプロットする(1)で計算した関数
を差分方程式で表して解いてみましょう(差分方程式って何?って方はこちら)。 まず,この関数の増減を調べるために両辺を微分すると,次のようになります。
これはxにおける曲線 f(x) の増減(正確には傾き)を表した方程式ですが, 1次微分が含まれている方程式なのでこれを1階の微分方程式と呼びます。
次に,この微分方程式を前進オイラー法で差分方程式に変換します。 微分の定義より,lim dx->0 を極小な値のdxで近似して,
この式を元の式に代入すると,
となります。 現在のxからdx進んだ f(x) の値(左辺)が,現在のf(x)の値+その点からの増減(右辺)で表されています。 これが f(x) の差分方程式です。
では前々回と同じように,xの範囲を -10 <= x < 10,dxを0.1としてプログラムを作ってみましょう。
/* Numeral Computing with gnuplot: 3 */ #include <stdio.h> int main(void); int main(void) { int n; /* ステップ数 */ double x; /* ステップ n における x の値 */ double y; /* x における y の値 */ double dx = 0.1; /* ステップ毎のxの増減*/ /* 最初の値 f(-10) を求める */ x = -10.0; y = (x*x*x)/2 - x*x + 20*x; printf("%f %f\n", x, y); for (n=1; n<=200; n++) { y = y + (3*dx*x*x)/2 - 2*dx*x + 20*dx; x = x + dx; printf("%f %f\n", x, y); } return 0; }
このCソースコードをコンパイルして,実行結果をnc3.pltに出力します。
% cc -o nc3 nc3.c % ./nc3 > nc3.plt
そしてgnuplotでプロットします。
# 結果 gnuplot> plot 'nc3.plt' w l, 'nc1.plt' w l # nc1.pltも同時にプロット
nc1.pltとは値が少しずれていることが分かります。 dxを変更して,値のずれがどう変化するかを調べてみてください。
$Id: numeric_computing3.shtml 1289 2007-02-04 13:22:39Z SYSTEM $