Week3

課題1:コイン投げ

n枚のコインを投げて表の出た枚数を記録する.この試行をm回おこない,結果を表示するスクリプトを書け. n, mは最終的に10, 1000とせよ.

ヒント
前週のサイコロ投げを少し改良すればよい.

課題2:数値積分(矩形近似)

関数

f(x)=4.0/(1.0+x*x)

をx=0から1まで数値積分せよ.分割数(100,1000,10000等)を変えて計算し,精度を確認せよ.

ヒント
下記の解説を読み,初期値(iter, a,b, 関数f)を適切に書き加えればよい.関数の定義は「たのしいRuby」の第7章メソッドを参照せよ.

数値積分の解説

積分,

eq1r.png

を数値的に求めよう.数値積分法では関数を下図のように連続した細かい短冊に分けて,それぞれの面積を足し算する.分割点の数をNとすると,各点は,

eq2.png

ここで,

eq3.png

ととれる.そうすると,もっとも単純には,

eq4.png

となる.

integral3.gif

これをそのままRubyでコーディングすると次のようになる.

dh=(b-a)/iter
sum =0.0

x=a
(iter-1).times do
  sum+=f(x)*dh
  x+=dh
end
puts sum

課題3 数値積分(台形則,Trapezoidal rule)

単純な短冊よりも,短冊の上端をななめにした台形にすれば精度が上がりそうに思う.台形の短冊一枚の面積は,

eq5.png

で求まる.これを単純に足せばよい.さらに計算時間を短縮するためには,端から端まであらかじめ足しあわせたときに得られる式

eq6.png

を使えばよい.こうすれば先ほどのもっとも単純な短冊による数値積分と計算時間は変わらない.課題2のプログラムを書き換えて台形則による数値計算を実行するようにせよ.分割数を変えて計算し(100,1000,10000等),単純な短冊の場合と比較せよ.

課題4 二分法(bisection)による方程式の解

関数

f(x) = x*x-4.0*x+1.0

が零となる点を数値的に求めよう.もっとも単純には解をまたぐx1,x2を初期値として,その関数値f(x1), f(x2)を求め,さらに2分点での値を次々に計算して,解を囲い込んでいく方法である.下の表をうめてみよ.これを実行するRubyスクリプトを書け.

x1  x2   f(x1)  f(x2) 
0.0  1.0  
   
   
ヒント
解をまたぐとは値の符号が変わることを意味する.あらたな両端を求めるときの条件分岐はf1*f2<0となる,
fig2.jpg
Last modified:2007/07/31 08:45:31
Keyword(s):
References:[LinuxEx]