1 イントロダクション
数値計算とは、解析学上の各種問題をコンピュータ等を利用して数値的に近似する事を言います。 大まかには、(1)解析の対象となる現象を数学的に表現し、(2)それを解く(近似する)ためのプログラムを作成し、(3)そのプログラムの実行で得られる結果を、現象の再現や予測といった形で役立てる 、といった工程から構成されます。本資料はこのうち(2)に関してFortran言語を用いてこれを行う事に関する資料です。
1.1 数値計算の例
ここでは以下のウサギのつがいの問題を考えます。「生まれたばかりのウサギが1対いる。ウサギは生後2ヶ月から毎月一対の子供を生む。 どのウサギも死なないと仮定した場合、1年後には何対のウサギがいるか。」
この問題の参考図を以下に示します。
開始時及び1か月目は最初の1対のうさぎ(青)のみが存在します。 2か月目に1対の子供(赤)が生まれ、合計で2対のウサギが存在するようになります。 3か月目は最初の一対(青)が再度1対の子供(オレンジ)を生み、合計で3対となります。 4か月目は青及び赤がそれぞれ子供を1対づつ生み、合計で5対のウサギとなります。
このように計算を行い、1年後(12か月目)に何対のウサギがいるかを求める問題です。
上記から、現在の数字は1つ前の数字と2つ前の数字の和であることがわかります。 漸化式で以下のように表現できます。
例えば3ヵ月目のウサギのつがい数(=3)は2ヵ月目の数(=2)と1ヶ月目の数(=1)の和となります。
プログラムでこのような計算を行う場合、下記のように初期値(U0=1及びU1=1)を与えた上で、繰り返し計算で答えを求める事になります。
program usagi implicit none integer :: u0 = 1 integer :: u1 = 1 integer i, num_usagi_pairs do i=2, 12 num_usagi_pairs = u0 + u1 print *, "Month =", i, " num_usagi_pairs =", num_usagi_pairs u0 = u1 u1 = num_usagi_pairs end do end program usagi 実行例: Month = 2 num_usagi_pairs = 2 Month = 3 num_usagi_pairs = 3 Month = 4 num_usagi_pairs = 5 Month = 5 num_usagi_pairs = 8 Month = 6 num_usagi_pairs = 13 Month = 7 num_usagi_pairs = 21 Month = 8 num_usagi_pairs = 34 Month = 9 num_usagi_pairs = 55 Month = 10 num_usagi_pairs = 89 Month = 11 num_usagi_pairs = 144 Month = 12 num_usagi_pairs = 233[ usagi.f90 ] - ウサギのつがい数の問題のプログラム例
※この問題により生成される数列は実はフィボナッチ数列と呼ばれるものです。
今回のウサギのつがい数の問題では繰り返し計算を行って12ヶ月後の値を得ることができましたが、 実はこの問題は以下のような解が見つかっていて、繰り返し計算しなくても答えを得ることができます。
※ここでGは黄金比を表しています。 【12ヶ月後のつがい数を計算する例】 G≒1.618 1.618 (12+1) ÷ sqrt(5) + 0.5 = 233.4355 floor(233.4355) = 233
このような式(解析的な答え)は、実際にはわかっていない場合の方が多く、 上記で行ったように、繰り返し計算を行い近似値を求める事が必要となってきます。
大まかに言えばこのように何らかの初期条件を与えて時間的や空間的にステップ毎の計算を繰り返し、近似値を求める事が「数値計算」と言えます。
前へ 上へ 次へ