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

정적분 계산을 위한 사다리꼴 공식(트라페조이달 규칙)

정적분(definite integral)은 사다리꼴 공식(트라페조이달 규칙, Trapezoidal Rule)을 이용해 수치적으로 계산할 수 있습니다. 함수 f(x)를 a부터 b까지 적분한다는 것은, 본질적으로 x = a에서 x = b까지 곡선 아래 영역의 넓이를 구하는 것과 같습니다.

이 넓이를 구하기 위해 전체 영역을 n개의 작은 사다리꼴로 나눕니다. 각 사다리꼴의 폭을 h라고 하면 (b − a) = nh가 성립합니다. 사다리꼴의 개수를 늘릴수록 넓이 계산 결과는 실제 값에 더 가까워지므로, 정확도를 높이려면 구간을 잘게 나누는 것이 좋습니다. 적분값은 다음 공식을 따라 구할 수 있습니다.

정적분 계산을 위한 사다리꼴 공식(트라페조이달 규칙)

여기서 h는 각 구간의 폭이고, n은 구간의 개수입니다. h는 다음 식을 통해 구할 수 있습니다.

정적분 계산을 위한 사다리꼴 공식(트라페조이달 규칙)

입력 및 출력

입력:
함수 f(x): 1-exp(-x/2.0), 적분 구간: 0 ~ 1, 구간 개수: 20
출력:
답: 0.21302

알고리즘

integrateTrapezoidal(a, b, n)

입력: 적분의 하한 a와 상한 b, 그리고 구간 개수 n

출력: 적분 결과

시작
    h := (b - a) / n
    sum := (f(a) + f(b)) / 2
    for i := 1 to n-1 do
        sum := sum + f(a + i*h)
    done
    return h * sum
종료

먼저 구간 폭 h를 구하고, 양 끝점의 함숫값 f(a)와 f(b)를 절반씩 더한 값을 초기 합계로 설정합니다. 이후 내부 구간들의 함숫값을 모두 더한 뒤, 마지막에 h를 곱하면 적분 근삿값을 얻을 수 있습니다.

C++ 예제 코드

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

float mathFunc(float x) {
    return (1 - exp(-x / 2.0));   // 함수 1 - e^(-x/2)
}

float integrate(float a, float b, int n) {
    float h, sum;
    int i;
    h = (b - a) / n;   // 인접한 두 구간 사이의 폭 계산
    sum = (mathFunc(a) + mathFunc(b)) / 2;   // f(a)와 f(b)로 초기 합계 설정

    for (i = 1; i < n; i++) {
        sum += mathFunc(a + i * h);
    }
    return (h * sum);   // 적분 결과 반환
}

int main() {
    float result, lowLim, upLim;
    int interval;
    cout << "하한, 상한, 구간 개수를 입력하세요: ";
    cin >> lowLim >> upLim >> interval;
    result = integrate(lowLim, upLim, interval);
    cout << "답: " << result;
}

실행 결과

하한, 상한, 구간 개수를 입력하세요: 0 1 20
답: 0.21302

위 예제에서는 함수 1 − e^(−x/2)를 0부터 1까지 20개의 구간으로 나누어 적분했으며, 그 결과 약 0.21302를 얻었습니다. 구간 개수(n)를 더 크게 설정하면 오차가 줄어들어 해석적 적분값에 훨씬 가까운 결과를 얻을 수 있습니다. 이처럼 사다리꼴 공식은 부정적분을 구하기 어려운 함수나 실험 데이터 기반의 함수를 적분할 때 유용하게 활용되는 대표적인 수치 적분 방법입니다.