Computer >> 컴퓨터 >  >> 프로그래밍 >> 프로그래밍

심슨 1/3 법칙을 활용한 정적분 계산 방법

심슨 1/3 법칙(Simpson's 1/3 Rule)이란?

사다리꼴 공식(Trapezoidal Rule)과 마찬가지로 심슨 1/3 법칙 역시 구간 [a, b]에서의 정적분 값을 구하는 데 사용되는 대표적인 수치 적분 기법입니다.

두 방법의 가장 큰 차이점은 다음과 같습니다. 사다리꼴 공식은 전체 구간을 여러 개의 사다리꼴로 나누어 넓이를 근사하는 반면, 심슨 1/3 법칙은 각 사다리꼴 영역을 다시 두 부분으로 나누어 포물선(2차 다항식)으로 근사합니다. 그렇기 때문에 같은 구간 개수 조건에서도 사다리꼴 공식보다 훨씬 정확한 결과를 얻을 수 있습니다.

심슨 1/3 법칙의 공식

심슨 1/3 법칙에서는 아래 공식을 따릅니다:

심슨 1/3 법칙을 활용한 정적분 계산 방법

여기서 h는 각 구간의 폭(width)이고, n은 구간의 개수입니다. 참고로 심슨 1/3 법칙이 정확하게 동작하려면 구간의 개수 n은 반드시 짝수여야 합니다. h는 다음 식을 통해 구할 수 있습니다:

심슨 1/3 법칙을 활용한 정적분 계산 방법

입력 및 출력

입력:
함수 f(x): x + (1/x)
적분 구간(하한, 상한): 1, 2
구간의 개수: 20

출력:
답은: 2.19315

알고리즘

integrateSimpson(a, b, n)

입력 − 적분의 하한과 상한, 그리고 구간의 개수 n

출력 − 적분 계산 후의 결과값

Begin
    h := (b - a)/n
    res := f(a) + f(b)
    lim := n/2

    i := 1부터 lim까지 반복:
        oddSum := oddSum + f(a + (2i - 1)h)
    반복 끝

    oddSum := oddSum * 4
    i := 1부터 lim-1까지 반복:
        evenSum := evenSum + f(a + 2ih)
    반복 끝

    evenSum := evenSum * 2
    res := res + oddSum + evenSum
    res := res * (h/3)
    return res
End

C++ 구현 예제

#include<iostream>
#include<cmath>
using namespace std;

float mathFunc(float x) {
    return (x+(1/x));    // 함수 f(x) = x + 1/x
}

float integrate(float a, float b, int n) {
    float h, res = 0.0, oddSum = 0.0, evenSum = 0.0, lim;
    int i;
    h = (b-a)/n;    // 인접한 두 구간 사이의 폭 계산
    res = (mathFunc(a)+mathFunc(b));    // f(a)와 f(b)를 이용한 초기 합
    lim = n/2;

    for(i = 1; i<=lim; i++)
        oddSum += mathFunc(a+(2*i-1)*h);    // 홀수 위치에 놓인 값들의 합
    oddSum *= 4;    // 홀수 항의 합에 4를 곱함

    for(i = 1; i<lim; i++)
        evenSum += mathFunc(a+(2*i)*h);    // 짝수 위치에 놓인 값들의 합
    evenSum *= 2;    // 짝수 항의 합에 2를 곱함
    res += oddSum+evenSum;
    res *= (h/3);
    return res;    // 최종 적분 결과 반환
}

main() {
    float result, lowLim, upLim;
    int interval;
    cout << "Enter Lower Limit, Upper Limit and interval: ";
    cin >>lowLim >>upLim >>interval;
    result = integrate(lowLim, upLim, interval);
    cout << "The answer is: " << result;
}

실행 결과

Enter Lower Limit, Upper Limit and interval: 1 2 20
The answer is: 2.19315

위 예제에서 함수 f(x) = x + 1/x를 구간 [1, 2]에서 20개의 구간으로 나누어 심슨 1/3 법칙을 적용한 결과, 약 2.19315라는 적분값을 얻을 수 있습니다. 구간의 개수를 늘릴수록 실제 적분값에 더 가까워지는 것을 확인할 수 있습니다.