情報基礎実習I第八回目

Report
情報基礎実習I
(第8回)
木曜4・5限
担当:北川 晃
プログラミング演習
‘least_square_data.csv’より,データの点数nと,(xi,yi) (i=1,…,n)
を読み込んで,最小二乗法よりその回帰直線y=ax+bを求めよ.
n
x
x
n
i
xy
i
i 1
xy 
n
n
y
n
yi
i 1
x 
2
n

2
xi
i 1
n
配列a(i)と,要素数nを引数として,
平均値’ave’を返す関数を用いる
a
xy  x  y
x x
2
2
least_square_data.csv
i 1
n

i
b  y  ax
5
1.2,
2.1,
3.3,
4.1,
5.0,
2.2
3.8
5.6
7.1
8.8
最小二乗法による回帰直線:出力例
データには有効数字
二桁分しか信頼性がない
最小二乗法による回帰直線:プログラム例
Sub Main()
Dim n As Integer, s, items(10) As String, a, b As Single
Dim x(10), x2(10), y(10), xy(10), x_a, y_a, x2_a, xy_a As Single
Dim ReadText As New IO.StreamReader( _
"D:\…\least_square_data.csv", System.Text.Encoding.Default)
n = ReadText.ReadLine()
For i As Integer = 1 To n
s = ReadText.ReadLine()
items = Split(s, ",")
x(i) = CSng(items(0))
y(i) = CSng(items(1))
x2(i) = x(i) ^ 2
xy(i) = x(i) * y(i)
Next
ReadText.Close()
• xi2
• xiyi
の計算
最小二乗法による回帰直線:プログラム例
x_a = average(n, x)
y_a = average(n, y)
xy_a = average(n, xy)
x2_a = average(n, x2)
それぞれの
平均値の計算
a = (xy_a - x_a * y_a) / (x2_a - x_a ^ 2)
傾き,切片の計算
b = y_a - a * x_a
Console.WriteLine("回帰直線は,y={0}x+{1}", a, b)
End Sub
Function average(n, a)
Dim s As Single = 0, ave As Single
For i As Integer = 1 To n
s = s + a(i)
Next
ave = s / n
Return ave
End Function
乱数とは?
サイコロを振って出る目の数のように,予測はできないが,
ある確率法則に従うでたらめな数.
 一様乱数
 正規乱数
 ポアッソン乱数
乱数の利用:
1. 自然科学および社会科学の問題のシミュレーション
2. 暗号の秘密鍵生成
乱数の発生方法
1. サイコロを振る.
例: 6
4
6
4
3
4
3
2
3
5
4
3
1
2
2
2
4
6
2
1
5
6
3
5
3
4
4
1
2
6
1
6
2. 自然現象を利用する(電子管のノイズ,放射性崩壊など)
3. 一つ前の値から次の値を計算する乱数列を生成する
(擬似乱数).
混合型合同法(擬似一様乱数列の生成法)
(μを法として合同)
疑似乱数列の特徴
•生来の乱数ではないので(初期値を与えている),
同じ条件で計算すれば,再現性がある.
•周期がある.少なくとも
回後には,同じ数列が現れる.
を大きくとる.
16ビットの乱数列だと・・・
 2
15
 32768
(計算機で使える最大の数を使うとよい)
例題:疑似乱数列の発生
混合型合同法を用いて,乱数の初期値より,
擬似乱数列を生成するプログラムを作れ.
考え方:
1. 初期値
2.
を読み込む.
を計算し, で割ったあまりを計算する.
3. あまりを次の乱数として,
とおく.
4. さらに次の乱数を計算する.
  2 ,   12869, c  6925
15
疑似乱数列の発生:出力例
疑似乱数列の発生:プログラム例
Dim mu As Integer = 2 ^ 15
Dim x, lambda, c As Integer
Console.WriteLine("xの初期値(0-32768)を入力して下さい")
Console.Write("x0=")
x = Console.ReadLine()
lambda = 12869
c = 6925
For i As Integer = 1 To 20
x = (lambda * x + c) Mod mu
Console.WriteLine("{0,8}", x)
Next
プログラミング演習
疑似乱数列を発生させるプログラムを用いて,
六面サイコロの出目を生成するプログラムを作れ.
考え方
• 混合型合同法では,0≦x<μの乱数が得られる.
• 得られた乱数をμで割れば,[0,1)の乱数が得られる.
• [0,1)の規格化乱数が得られれば,これに(b-a)
をかけてaを加えることで,[a,b)の乱数が得られる.
• 実数で得られる乱数列を整数化する.
サイコロの出目:出力例
サイコロの出目の発生:プログラム例
Dim mu As Integer = 2 ^ 15
Sub Main()
Console.Title = "乱数の発生"
Dim x, x_dice As Integer, n As Integer = 100
Console.WriteLine("xの初期値(0-32768)を入力して下さい")
Console.Write("x0=")
一様乱数を生成する関数
x = Console.ReadLine()
For i As Integer = 1 To n
x_dice = Fix(6 * uni_rnd(x) / mu + 1)
If i Mod 10 <> 0 Then
Console.Write("{0,5}", x_dice)
1≦x<7の
Else
Console.WriteLine("{0,5}", x_dice) 実数列を生成
End If
x = uni_rnd(x)
Next
xを次の値に置き直す
End Sub
サイコロの出目の発生:プログラム例(つづき)
Function uni_rnd(x) As Single
Dim lambda, c As Integer
lambda = 12869
c = 6925
x = (lambda * x + c) Mod mu
Return x
End Function
一様乱数を計算する
関数副プログラム
プログラミング演習
六面サイコロの出目に関するプログラムを用いて,
各出目の頻度を計算せよ.
ほぼ均等に
1/6=1.666…
サイコロの出目の頻度:プログラム例
Dim mu As Integer = 2 ^ 15
各目の
Sub Main()
カウンター
Console.Title = "乱数の発生"
Dim x, x_dice, n, c1, c2, c3, c4, c5, c6 As Integer
各目の Dim p1, p2, p3, p4, p5, p6 As Single
頻度
c1 = 0 : c2 = 0 : c3 = 0 : c4 = 0 : c5 = 0 : c6 = 0
Console.WriteLine("xの初期値(0-32768)を入力して下さい")
Console.Write("x0=")
x = Console.ReadLine()
n = 1000000
試行回数
サイコロの出目の頻度:プログラム例(つづき)
For i As Integer = 1 To n
x_dice = Fix(6 * uni_rnd(x) / mu + 1)
Select Case x_dice
Case 1
c1 = c1 + 1
出目の判定
Case 2
とカウント
c2 = c2 + 1
Case 3
c3 = c3 + 1
Case 4
c4 = c4 + 1
Case 5
c5 = c5 + 1
Case 6
c6 = c6 + 1
End Select
x = uni_rnd(x)
Next
サイコロの出目の頻度:プログラム例(つづき)
p1 = c1 / n
Console.WriteLine("1の確率は{0}",
p2 = c2 / n
Console.WriteLine("2の確率は{0}",
p3 = c3 / n
Console.WriteLine("3の確率は{0}",
p4 = c4 / n
Console.WriteLine("4の確率は{0}",
p5 = c5 / n
Console.WriteLine("5の確率は{0}",
p6 = c6 / n
Console.WriteLine("6の確率は{0}",
End Sub
p1)
p2)
p3)
p4)
p5)
p6)
出目の頻度
と表示
サイコロの出目の頻度:プログラム例(つづき)
Function uni_rnd(x) As Single
Dim lambda, c As Integer
lambda = 12869
c = 6925
x = (lambda * x + c) Mod mu
Return x
End Function
一様乱数を計算する
関数副プログラム

similar documents