こういう場合は、色々な に対して一斉に を計算するプログ ラムを作るのがいいでしょう。
* reidai5-2.f --- 常微分方程式の初期値問題を Euler 法で解く program rei52 * 開始時刻と終了時刻 real a,b parameter (a=0.0,b=1.0) * 初期値 real x0 * 変数と関数の宣言 real t,x,h,f,e integer N0,N1,N2,N,i * 自然対数の底 e (=2.7182818284..) e=exp(1.0) * 初期値の設定 x0=1.0 * どういう N について計算するか? * N0 から N1 まで、N2 刻みで増える N に write(*,*) ' FIRSTN,LASTN,STEPN=' read(*,*) N0,N1,N2 * 計算の開始 do N=N0,N1,N2 h=(b-a)/N * 開始時刻と初期値のセット t=a x=x0 * Euler 法による計算 do i=0,N-1 x=x+h*f(t,x) t=t+h end do write(*,*) N,abs(e-x) end do end ********************************************************************** * 微分方程式 x'=f(t,x) の右辺の関数 f の定義 -- 前と同じだから略
コンパイルして実行すると `` FIRSTN,LASTN,STEPN='' と尋ねてき ます。例えば ``100 1000 50'' と答えると から まで 刻みで増やして行った値 , , , , , , を として計算して、最終的に得られた誤差を出力します。 実行結果を見てみましょう。
waltz11% reidai5-2 FIRSTN,LASTN,STEPN= 100 1000 50 100 1.34680271e-02 150 9.00602341e-03 200 6.76608086e-03 .... (途中略) ... 900 1.50966644e-03 950 1.42812729e-03 1000 1.36137009e-03 waltz11%``mgraph''コマンドには、対数目盛によるグラフを描く機能(起 動時に -lx, -ly を指定します。ここで ``l'' は ``logarithmic''(=「対数の」) の頭文字です)があります。この場合は、例 えば次のようにしたりすると良いでしょう。
waltz11% reidai5-2 | mgraph -lx -ly | xplot 10,10000,100
このグラフから、誤差 であることが読み とれます。実はこれは Euler 法の持つ一般的な性質です。
実は Euler 法は収束があまり速くないので、実際には特殊な場合を除いて 使われていません。そこで、、、、