260 likes | 427 Views
情報基礎実習 I ( 第4回). 木 曜4・5限 担当 :北川 晃. 例題:4次式の数表. 4 次式 の値を, 0 から 0.2 きざみで 5.0 までの x に対して計算し, 順に書き出すプログラムを作れ.. Dim y As Single For x As Single = 0.0 To 5.0 Step 0.2 y = 1.5 * x ^ 4 - 0.8 * x ^ 3 _ + 6.2 * x ^ 2 + 0.5 * x + 2.1 Console.WriteLine ("{0,8},{1,16}", x, y) Next.
E N D
情報基礎実習I(第4回) 木曜4・5限 担当:北川 晃
例題:4次式の数表 4次式 の値を,0から0.2きざみで5.0までのxに対して計算し, 順に書き出すプログラムを作れ. Dim y As Single For x As Single = 0.0 To 5.0 Step 0.2 y = 1.5 * x ^ 4 - 0.8 * x ^ 3 _ + 6.2 * x ^ 2 + 0.5 * x + 2.1 Console.WriteLine("{0,8},{1,16}", x, y) Next
例題:4次式の数表(改) 4次式 について, の値を,0から0.2きざみで5.0までの xに対して計算し,順に書き出すプログラムを作れ. xをMath.Sqrt(x)で置き換え Dim y As Single For x As Single = 0.0 To 5.0 Step 0.2 y = 1.5 * x ^ 4 - 0.8 * x ^ 3 _ + 6.2 * x ^ 2 + 0.5 * x + 2.1 Console.WriteLine("{0,8},{1,16}", x, y) Next 書き換えが煩雑!!関数として定義できないか?
プロシージャとは • ある一連の処理コードに名前をつけて登録した • 下請けプログラムを,プロシージャという. • 従来の言語では,「関数」あるいは • 「サブルーチン」と呼ぶ処理に該当する. • Functionプロシージャが関数にあたり,呼び出した • コードブロックに,必ず一つの値を返す. • Subプロシージャがサブルーチンにあたり, • 呼び出したコードブロックに値を返さない. • プロシージャ間のデータの引き渡しは,「引数」で行う.
関数の定義の書式 Sub Main() … y1 = プロシージャ名(引数リスト) … End Sub Functionプロシージャ名(引数リスト) [As 戻り値の型] 文ブロック Return戻り値 または プロシージャ名= 戻り値 End Function 仮引数,「値渡し」と 「参照渡し」がある
関数の定義の仕方の例(その1) 一種の副プログラムであるから, 主プログラムとは別に書く. (主プログラム) Sub Main() … y1=f(x) … End Sub Functionf(ByVal x As Single) As Single Dim y As Single y = x ^ 2 + 2 * x Return y End Function 組み込み関数のように 呼び出せる 引数を値渡しの単精度実数型として宣言 戻り値の型の宣言 関数の定義 主プログラムへ返す値(戻り値) (副プログラム)
関数の定義の仕方の例(その2) Sub Main() … y1=f(x) … End Sub Function f(x) As Single Dim y As Single If x < 0 Then y = 0 Else y=1 End If Return y End Function 組み込み関数のように 呼び出せる 省略した場合は 値渡し (主プログラム) 戻り値の型の宣言 関数の定義 ステップ 関数 主プログラムへ返す値(戻り値) (副プログラム)
例題:4次関数の定義 4次式 について, の値を,0から0.2きざみで5.0までの xに対して計算し,順に書き出すプログラムを作れ. • 考え方: • 実数xを引数とする実数型の関数 • f(x)を定義する. • xを繰り返し変化させながら,y=f(√x)の値を • 順に書き出す.
4次関数の定義:プログラム例 Sub Main() Dim y As Single For x As Single = 0.0 To 5.0 Step 0.2 y = f(Math.Sqrt(x)) Console.WriteLine("{0,8},{1,16}", x, y) Next End Sub Function f(x) As Single Dim y As Single y = 1.5 * x ^ 4 - 0.8 * x ^ 3 _ + 6.2 * x ^ 2 + 0.5 * x + 2.1 Return y End Function
プログラミング演習 • 非負の整数 に対する階乗 を計算する • 関数を定義し,これを用いることで級数 • の値を計算せよ. • 考え方: • 整数nを引数とする実数型の関数 • factorial(n)を定義する. • 与級数は有限の値に収束する.有限項で切っても, • 十分よい近似値が得られる.
級数の計算:プログラム例 Sub Main() Dim sum As Single = 0 For i As Integer = 0 To 100 sum = sum + 1 / factorial(i) Next Console.WriteLine("級数の値は{0}", sum) End Sub Function factorial(n) As Single Dim p As Single = 1 For i As Integer = 1 To n p = p * i Next Return p End Function 有限で切る項を 十分大きく取る 関数の呼び出し 大きなnに対して 計算できるように, 実数型で定義 関数として返す値
例題:方程式の根 方程式は,区間[0,2]において ただ1つ根があることがわかっている.その根を 2分法によって求めるプログラムを作れ. • 2分法 両端と中点の 符号を調べる
方程式の根:考え方 • 区間 の中点を計算する. • 区間とにおいて, • ならば解は左の区間 • ならば解は右の区間 • 解がある方の区間において新たな中点を計算し, • 判定を行う. • となるまで繰り返し,そのときのを • 解とする.
方程式の根:プログラム例(主プログラム) 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 関数として返す値
例題:数値積分(台形公式) 次の関数をからまで積分する プログラムを作れ. 数値積分には台形公式を用いる.
数値積分(台形公式):考え方 台形で近似する
数値積分(台形公式):プログラム例 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 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 区間の分割数 刻み幅 複数の文を改行せずに 続ける表記法
数値積分(台形公式):計算結果の精度 分割の数と計算結果 精度が悪く なっている!? 有効数字の桁数が上げられないか?
数値積分(台形公式):プログラム例 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 倍精度実数型 倍精度実数型 倍精度実数型 倍精度実数型と単精度実数型を 混在させると,精度は単精度になる
数値積分(台形公式):倍精度での計算結果 分割の数と計算結果 分割数を大きくするほど,誤差が減っていく
プログラミング演習 • 方程式 は の範囲内に解が • ひとつ存在することが知られている. • 二分法を用いて,解を求めるプログラムを作成せよ. • 定積分 を台形公式により • 数値積分するプログラムを作成し, • 得られた値を解析的に解いた値と比較してみよ. (0.7390852)