사다리꼴 법칙(수치 적분)

사다리꼴 법이란


  • 수치 적분 해법 중 하나
  • $ f (x) $ 함수에서 미세 구간 $ [x_0, x_1] $ 내의 함수 값을 1 차 방정식으로 근사합니다.



    산법



    미세 구간 $[x_0,x_1]$의 구간 폭 $x_1-x_0=h$로 하고, 각 $y$좌표를 $f(x_0)=y_0,f(x_1)=y_1$로 한다.
    구간 내의 함수값을 1차 방정식으로 근사하면, 이 구간 내의 적분값은
    $$\int_{x_0}^{x_1}f(x)dx=\frac{h}{2}(y_0+y_1) $$
    이므로, 구간 $[a,b]$ 내의 적분은 각 미소 구간 내에서의 적분값의 합으로 표현할 수 있으므로,
    $$\int_a^bf(x)dx=\frac{h}{2}(y_0+y_1)+\frac{h}{2}(y_1+y_2)+\cdots+\frac{h}{2}( y_{n-1}+y_n) $$$$ =\frac{h}{2}(y_0+2y_1+2y_2+\cdots+2y_{n-1}+y_n)$$

    샘플 코드



    $f(x)=\sqrt{1-x^2}$에서 구간 $[0,1]$의 정적분의 값을 구하는 프로그램.
    분할수는 4로 한다.
    해석 솔루션은 $\pi/4$입니다(단위 원의 $1/4$).

    trapezoidal_rule.c
    #include<stdio.h>
    #include<math.h>
    
    double f (double x) {
      return sqrt(1-x*x);
    }
    
    /* 台形則(区間[a,b]をn分割) */
    double trapezoidal_rule (double a, double b, int n) {
      double h;
      int i;
      double value=0;
    
      h = (b - a) / n;   // 区間幅の計算
      for (i = 0; i <= n; i++) {
        if (i == 0 || i == n) value += f(a + i*h);
        else value += 2 * f(a + i*h);
      }
      value = value*h/2;
      return value;
    }
    
    int main (void) {
      printf("Analytical solution: %f\n", M_PI/4);
      printf("Numerical solution : %f\n", trapezoidal_rule(0, 1, 4));
      return 0;
    }
    

    실행 결과
    Analytical solution: 0.785398
    Numerical solution : 0.748927
    

    특징


  • 모든 구간의 오차
    $$ E=\frac{h^2(b-a)}{12}f^{\prime\prime}(\xi)\\,\\(a<\xi
  • 분할 수를 두 배로 하면 오차는 $1/4$로 감소
  • 그러나 구간 수를 너무 늘리면 반올림 오차가 증가합니다.
  • 좋은 웹페이지 즐겨찾기