情報基礎II (第1回)

情報基礎Ⅱ/基礎工学Ⅲ
(第7回)
月曜4限
担当:北川 晃
例題:方程式の根
方程式
は,区間[0,2]において
ただ1つ根があることがわかっている.その根を
2分法によって求めるプログラムを作れ.
•2分法
両端と中点の
符号を調べる
方程式の根:考え方
1. 区間
の中点
を計算する.
2. 区間
と
において,
•
ならば解は左の区間
•
ならば解は右の区間
3. 解がある方の区間において新たな中点を計算し,
判定を行う.
となるまで繰り返し,そのときの
4.
解とする.
を
方程式の根:プログラム例(主プログラム)
Dim eps, x1, x2, xm As Single
eps = 10 ^ -6
単精度実数型の
x1 = 0
精度の限界
x2 = 2
端の値を入力
条件が真の間
While x2 - x1 > eps
は繰り返す
xm = (x1 + x2) / 2
中点の計算
If f(x1) * f(xm) > 0 Then
x1 = xm
解が中点の左右
Else
どちらにあるか判定
x2 = xm
端の点を再定義
End If
End While
解の書き出し
Console.WriteLine("解はx={0}", xm)
方程式の根:プログラム例(関数)
Function f(x) As Single
Dim y As Single
y = x ^ 3 - x - 1
Return y
End Function
関数として返す値
方程式の根:出力例
例題:数値積分(台形公式)
次の関数を
から
プログラムを作れ.
数値積分には台形公式を用いる.
まで積分する
数値積分(台形公式):考え方
台形で近似する
f  xi 
f  xi 1 
Si
ba
h
n
xi  a  i  h
f  xi 1 
h
a
xi 1 h xi
n
S   Si
i 1
b x
f  xi 
h
Si   f  xi 1   f  xi   
2
数値積分(台形公式):プログラム例
Sub Main()
Dim h, a, b, S As Single
区間の分割数
Dim n As Integer = 65536
刻み幅
a = 0 : b = 2 : h = (b - a) / n
複数の文を改行せずに
続ける表記法
S = 0
For i = 1 To n
S = S + (f(a + (i - 1) * h) + f(a + i * h)) * h / 2
Next
i 1
i
f x

f x

Console.WriteLine(“積分値はS={0}", S)
End Sub
Function f(x) As Single
Dim y As Single
y = Math.Sqrt(4 - x ^ 2)
Return y
End Function
f  x  4  x
2
数値積分(台形公式):出力例
数値積分(台形公式):計算結果の精度
分割の数と計算結果
分割数
4
16
64
256
1024
4096
16384
65536
  3.1415926
計算値
誤差(%)
2.995709
4.64361
3.123253
0.5837687
3.139297
0.07308303
3.141305
0.009144868
3.141557
0.001123187
3.141587
0.0001821384
3.141594 -5.312396×10-5
3.141598 -0.0001669602
有効数字の桁数が上げられないか?
精度が悪く
なっている!?
数値積分(台形公式):プログラム例
Sub Main()
Dim h, a, b, S As Double
倍精度実数型
Dim n As Ineger = 65536
a = 0 : b = 2 : h = (b - a) / n
S = 0
For i = 1 To n
S = S + (f(a + (i - 1) * h) + f(a + i * h)) * h / 2
Next
Console.WriteLine("積分値はS={0}", S)
End Sub
倍精度実数型
Function f(x) As Double
倍精度実数型
Dim y As Double
y = Math.Sqrt(4 - x ^ 2)
Return y
倍精度実数型と単精度実数型を
End Function
混在させると,精度は単精度になる
数値積分(台形公式):倍精度での計算結果
分割の数と計算結果
分割数
4
16
64
256
1024
4096
16384
65536
  3.1415926535897931
計算値
2.99570906810244
3.12325303782774
3.13929691277968
3.14130558295723
3.14155676653902
3.14158816760776
3.1415920928389
3.14159258349582
誤差(%)
4.6436
0.58377
0.073076
0.0091377
0.0011423
0.00014279
1.7849×10-5
2.2312×10-6
分割数を大きくするほど,誤差が減っていく
プログラミング演習
• 方程式 x  cos x は 0  x  1 の範囲内に解が
ひとつ存在することが知られている.
二分法を用いて,解を求めるプログラムを作成せよ.
(0.7390852)
• 定積分 I 

2
2
2

x
  4  dx を台形公式により
数値積分するプログラムを作成し,
得られた値を解析的に解いた値と比較してみよ.
数値積分(台形公式):改良
Dim a, h As Double
共通で使う変数をMainの外で宣言
Sub Main()
Dim b, S As Double
Dim n As Integer = 65536
Dim rel_error As Double, _
pi As Double = 3.1415926535897931
a = 0 : b = 2 : h = (b - a) / n : S = 0
座標を関数として扱う
For i = 1 To n
S = S + (f(x(i - 1)) + f(x(i))) * h / 2
Next
Console.WriteLine("積分値はS={0}", S)
End Sub
数値積分(台形公式):改良(続き)
Function f(x) As Double
Dim y As Double
y = Math.Sqrt(4 - x ^ 2)
Return y
End Function
Function x(i)
Dim x_i As Double
x_i = a + i * h
座標xをiの関数として定義
Return x_i
End Function
このFunctionプロシージャ
内部でaやhが定義されて
いないことに注意
最大値と最小値
n個のデータx1, x2, …, xnがある.データの個数とデータを
順次読み込んで,それらのデータの最大値と最小値を求めよ.
N=11個のデータ
最大値:9,最小値:1
最大値と最小値:考え方
1. 第(i-1)番目までのデータについて,
最大値xmaxと最小値xminが分かっているとする.
2. 次に読み込む第 i 番目のデータ xi について,
(i)xi>xmaxのとき,xiが新たな最大値となる.
xmax=xi
(ii)xi≦xmaxのとき,
(ii)-1. xi≧xminのとき,xmax,xminは変わらず.
(ii)-2. xi<xminのとき,xiが新たな最小値となる.
xmin=xi
3. これをすべてのデータについて繰り返す.
最大値と最小値:アルゴリズム
1. 最初のデータxを読み込む.
2. 最大値と最小値の初期値として,最初のデータを代入
xmax=x, xmin=x
3. 次のデータxを読み込み,xmaxとの大小を判定.
4. xmaxの方が小さければ,xとxminの大小を判定.
5. 必要があればxmaxもしくはxminを
読み込んだデータxで置き換え.
6. これを繰り返し,最後にxmaxとxminを書き出す.