심슨 법칙 (수치 적분)

심슨 법칙이란?


  • 수치 적분 해법 중 하나
  • $ f (x) $ 함수에서 미세 구간의 함수 값을 2 차 방정식으로 근사
  • 미세 구간 $ [x_0, x_2] $의 끝점과 그 중점 $ x_1 $을 사용하여 2 차 방정식을 찾습니다



  • 산법



    3점의 $y$좌표를 각각 $f(x_0)=y_0, f(x_1)=y_1, f(x_2)=y_2$로 한다.
    근사에 사용되는 2차 방정식 $y=ax^2+bx+c$는 $(x_0,y_0),(x_1,y_1),(x_2,y_2)$를 통과하며, 또한 $x_2-x_1=h, x_1-x_0=h$라고 하면,
    $$ a=\frac{y_0-2y_1+y_2}{2h^2}$$$$b=\frac{-(x_1+x_2)y_0+2(x_2+x_0)y_1-(x_0+x_1)y_2} {2h^2}$$$$c=\frac{x_1x_2y_0-2x_2x_0y_1+x_0x_1y_2}{2h^2}$$
    이 2차 방정식 $y=ax^2+bx+c$를 $x_0$에서 $x_2$까지 적분하면,
    $$\int_{x_0}^{x_2}(ax^2+bx+c)dx=\frac{a}{3}(x_2^3-x_0^3)+\frac{b}{2}(x_2 ^2-x_0^2)+c(x_2-x_0) $$$$=\frac{h}{3}(y_0+4y_1+y_2)$$

    구간 $[a,b]$가 미세 거리 $h$에서 $2n$ 등분되어 있다고 하고, 각 $x_i\(i=0,1,\cdots,2n)$의 $y$좌표를 $f (x_i)=y_i$로 하면 구간 $[a,b]$ 내의 적분은 다음과 같다.
    $$\int_a^bf(x)dx=\frac{h}{3}{(y_0+4y_1+y_2)+(y_2+4y_3+y_4)+\cdots+(y_{2n-2}+4y_{2n- 1}+y_{2n})}$$$$=\frac{h}{3}(y_0+4y_1+2y_2+4y_3+2y_4+\cdots+2y_{2n-2}+4y_{2n-1}+y_ {2n})$$
    그러나 $h=(b-a)/(2n)$

    샘플 코드



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

    simpsons_rule.c
    #include<stdio.h>
    #include<math.h>
    
    double f (double x) {
      return sqrt(1-x*x);
    }
    
    /* シンプソン則(区間[a,b]をn分割) */
    double simpsons_rule (double a, double b, int n) {
      double h;
      int i;
      double value=0;
    
      h = (b - a) / (2*n);
      for (i = 0; i <= 2*n; i++) {
        if (i == 0 || i == 2*n) value += f(a + i*h);   // 0か2nのとき
        else if (i % 2 == 1) value += 4 * f(a + i*h);   // 奇数
        else value += 2 * f(a + i*h);   // 偶数
      }
      value = value*h/3;
      return value;
    }
    
    int main (void) {
      printf("Analytical solution: %f\n", M_PI/4);
      printf("Numerical solution : %f\n", simpsons_rule(0, 1, 4));
      return 0;
    }
    

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

    특징


  • 한 구간의 오차 평가: $O(h^5/90)$
  • 전체 구간 합계의 오차 평가: $O(h^4)$
  • 좋은 웹페이지 즐겨찾기