もう少しこみいった繰り返しの例として,放射性物質が崩壊する割合の計算を考えてみよう. テクネチウム99mは,原子1個あたり 1 秒間に .0000320362394891 個の割合で崩壊する.つまり,この割合をrとすると,N個のテクネチウム99mは1秒後で Nr 個が崩壊して N(1-r) 個に減り,2秒後には N(1-r)^2 個に,3秒後には N(1-r)^3 個に減っている.
そこで,x秒後に残っているテクネチウム99mの割合を求める関数 tc99m を定義してみよう.(ただしxは整数とする.)まず,1秒間に崩壊する割合を変数 disintegration_per_sec として定義しておく.
# let disintegration_per_sec = 0.0000320362394891;; val disintegration_per_sec : float = 3.20362394891e-05
例えば100秒後の割合は次のように考えることができます.
100までの和と同じように,最後を除いて同じ形をしているので,これを次のように書くことができます.
ここまでくれば,あとは「n秒後の割合」をtc99m(n)という関数として定義することができます.
# let rec tc99m x = if x=0 then 1.0 else (1.0-.disintegration_per_sec)*.(tc99m (x-1)) ;; val tc99m : int -> float = <fun>
割合は小数点数であり,秒数は整数であることに注意しましょう.前に見たようにOcamlでは小数の計算には *. や -. のようにピリオドの付いた演算子を使い,整数の計算と区別しなければなりません.また,整数の 1 と 小数の 1.0 も区別が必要です.
さあ,これでテクネチウムの残る割合が計算できます.1時間後,つまり 60*60 秒後の割合はいくらでしょうか.
# tc99m (60*60) ;; - : float = 0.891069983611
17.4.23 実行の追跡 | 17.4.24 原子の崩壊 | 17.4.25 別の形の繰り返し | ||
2009年度版に向けて現在作業中です.
このページに関してお気づきの点がありましたら
コメント投稿システムまでお願いします.
|
Tue, 05 Jul 2005 07:33:27 JST (1487d) |