数値計算と誤差 (2)


今日の内容


数値積分と打切り誤差

数値積分

中点公式

/* m.c: 中点公式による数値積分 */

#include <stdio.h>

double f(double x) {
  return(1/x);
}

double m(double x1, double x2, int n) {
  int i;
  double s = 0.0;
  double h = (x2 - x1) / n;
  for (i = 1; i <= n; i++) {
    s = f(x1+(i-0.5)*h) * h + s;
  }
  return(s);
}

int main(void) {
  int n;
  for (n = 2; n <= 256; n = 2*n) {
    printf("n = %3d, s = %13.10lf \n", n, m(1.0, 2.0, n));
  }
}

台形公式

[演習 15.1]

打切り誤差

[演習 15.2]

  1. 中点公式と台形公式で f(x) = 1/x を区間 [1.0, 2.0] を n 分割 (n = 2, 4, 8, 16, 32, 64, 128, 256) したときの f(x) の数値積分値を求め比較しなさい.
  2. 積分の本当の値である log(2) との差をそれぞれ比較しなさい.
    関数 log を使うには,#include <math.h> をプログラムの最初の部分に書く必要がある.

[演習 15.3]

  1. 教科書57ページで定義されている中点公式の改良型,台形公式の改良型のプログラムを作りなさい.
  2. それぞれの数値積分の結果を比較し,さらに改良前とも比較しなさい.

シンプソン公式

[問題 15.1]

  1. f(x) = 1/x の区間 [1.0, 2.0] での数値積分を,シンプソン公式で n 分割 (n = 2, 4, 8, 16, 32, 64, 128, 256) して求めるプログラム simpson.c を書きなさい.
  2. f(x) = 1/x の区間 [1.0, 2.0] での真の積分値に対するシンプソン公式と中点公式の改良型,台形公式の改良型での誤差を,それぞれの分割数で表示するプログラム ni_error.c を書きなさい.
  3. シンプソン公式と中点公式の改良型,台形公式の改良型の誤差について考察しなさい.

2つの曲線に挟まれた領域の面積

[問題 15.2]

  1. y = x2 と x = y2 ではさまれる領域の面積を出来るだけ正確に計算するプログラム problem_15_2.c を作りなさい.
    その面積の数値積分による正確な値を予想し,さらに予想の理由を誤差に言及して述べなさい.
    ただし,予想は数値実験に基づいて行い,定積分を行って予想してはいけない.
    当然のことながら,予想値は無限小数ではないことに注意せよ.
    [ヒント] 図を描いて考えよう.

2013年1月26日作成
伊知地 宏
Copyright (C) Hiroshi Ichiji, 2013. All rights reserved.