情報基礎Ⅱ/基礎工学Ⅲ (第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 ba 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を書き出す.
© Copyright 2024 ExpyDoc