C 언어로 사다리꼴 규칙을 이용한 적분 근사

CBeginner
지금 연습하기

소개

이 실습에서는 C 언어를 사용하여 사다리꼴 규칙 (trapezoidal rule) 을 이용하여 적분을 근사하는 방법을 배웁니다. 이 실습은 다음 단계를 포함합니다: 1) 함수 f(x) 와 구간 [a, b]를 정의하고, 2) 구간을 분할하고 사다리꼴 공식을 적용하여 근사적인 적분을 계산하고, 3) 최종 결과를 출력합니다. 이 실습은 C 프로그래밍 언어를 사용하여 수치적 적분 기법에 대한 실질적인 이해를 제공하는 것을 목표로 합니다.

f(x) 및 구간 [a, b] 정의

이 단계에서는 C 언어를 사용하여 사다리꼴 규칙 (trapezoidal rule) 을 이용한 수치적분을 위해 수학 함수 f(x) 를 정의하고 구간 [a, b]를 지정합니다.

먼저, 적분 근사를 구현하기 위한 새로운 C 소스 파일을 생성합니다.

cd ~/project
nano integral_approximation.c

이제 함수와 구간을 정의하는 초기 코드를 작성합니다.

#include <stdio.h>
#include <math.h>

// 적분할 함수 f(x) 를 정의합니다.
double f(double x) {
    // 예시: f(x) = x^2
    return x * x;
}

int main() {
    // 구간 [a, b] 를 정의합니다.
    double a = 0.0;  // 하한
    double b = 1.0;  // 상한

    printf("적분 근사\n");
    printf("함수: f(x) = x^2\n");
    printf("구간: [%.2f, %.2f]\n", a, b);

    return 0;
}

컴파일 및 실행하여 확인해 봅시다.

gcc -o integral_approximation integral_approximation.c -lm
./integral_approximation

예상 출력:

적분 근사
함수: f(x) = x^2
구간: [0.00, 1.00]

이 코드에서 다음을 정의했습니다.

  • x^2 를 반환하는 함수 f(x)
  • 0 부터 1 까지의 구간 [a, b]
  • 함수와 구간 정보를 출력

f(x) 함수는 적분하고자 하는 임의의 수학 함수로 수정할 수 있습니다.

구간 분할 및 사다리꼴 공식 적용

이 단계에서는 구간을 분할하고 근사적인 적분을 계산하여 수치적분에 사다리꼴 규칙 (trapezoidal rule) 을 구현하는 방법을 보여주는 코드를 수정합니다.

이전 소스 파일을 열고 코드를 업데이트합니다.

cd ~/project
nano integral_approximation.c

다음 구현으로 내용을 바꿉니다.

#include <stdio.h>
#include <math.h>

// 적분할 함수 f(x) 를 정의합니다.
double f(double x) {
    return x * x;
}

// 사다리꼴 규칙 구현
double trapezoidalRule(double a, double b, int n) {
    double h = (b - a) / n;  // 각 사다리꼴의 폭
    double sum = 0.5 * (f(a) + f(b));  // 첫 번째와 마지막 점

    for (int i = 1; i < n; i++) {
        double x = a + i * h;
        sum += f(x);
    }

    return sum * h;
}

int main() {
    // 구간 [a, b] 를 정의합니다.
    double a = 0.0;  // 하한
    double b = 1.0;  // 상한
    int n = 100;     // 사다리꼴의 개수

    double approximateIntegral = trapezoidalRule(a, b, n);

    printf("적분 근사\n");
    printf("함수: f(x) = x^2\n");
    printf("구간: [%.2f, %.2f]\n", a, b);
    printf("사다리꼴 개수: %d\n", n);
    printf("근사적인 적분 값: %.6f\n", approximateIntegral);

    return 0;
}

업데이트된 코드를 컴파일하고 실행합니다.

gcc -o integral_approximation integral_approximation.c -lm
./integral_approximation

예상 출력:

적분 근사
함수: f(x) = x^2
구간: [0.00, 1.00]
사다리꼴 개수: 100
근사적인 적분 값: 0.333333

이 구현의 주요 내용:

  • trapezoidalRule() 함수는 근사적인 적분을 계산합니다.
  • h는 각 사다리꼴의 폭을 나타냅니다.
  • n은 근사에 사용할 사다리꼴의 개수를 결정합니다.
  • n 값을 증가시키면 근사 정확도가 향상됩니다.

근사 적분 출력

이 단계에서는 적분 근사 프로그램을 개선하여 더 자세한 출력을 추가하고 수치 결과를 정확한 적분 값과 비교합니다.

이전 소스 파일을 열고 코드를 업데이트합니다.

cd ~/project
nano integral_approximation.c

보다 포괄적인 출력을 포함하도록 코드를 수정합니다.

#include <stdio.h>
#include <math.h>

// 적분할 함수 f(x) 를 정의합니다.
double f(double x) {
    return x * x;
}

// x^2 를 0 부터 1 까지 적분한 정확한 적분 값 계산
double exactIntegral() {
    return 1.0 / 3.0;
}

// 사다리꼴 규칙 구현
double trapezoidalRule(double a, double b, int n) {
    double h = (b - a) / n;  // 각 사다리꼴의 폭
    double sum = 0.5 * (f(a) + f(b));  // 첫 번째와 마지막 점

    for (int i = 1; i < n; i++) {
        double x = a + i * h;
        sum += f(x);
    }

    return sum * h;
}

int main() {
    // 구간 [a, b] 를 정의합니다.
    double a = 0.0;  // 하한
    double b = 1.0;  // 상한
    int n = 100;     // 사다리꼴의 개수

    double approximateIntegral = trapezoidalRule(a, b, n);
    double exact = exactIntegral();
    double error = fabs(approximateIntegral - exact);
    double percentError = (error / exact) * 100.0;

    // 자세한 정보를 포함한 서식화된 출력
    printf("적분 근사 결과\n");
    printf("------------------------------\n");
    printf("함수:            f(x) = x^2\n");
    printf("구간:            [%.2f, %.2f]\n", a, b);
    printf("사다리꼴 개수: %d\n", n);
    printf("\n수치 결과:\n");
    printf("근사적인 적분 값: %.6f\n", approximateIntegral);
    printf("정확한 적분 값:       %.6f\n", exact);
    printf("\n오차 분석:\n");
    printf("절대 오차:       %.6f\n", error);
    printf("상대 오차:        %.4f%%\n", percentError);

    return 0;
}

업데이트된 코드를 컴파일하고 실행합니다.

gcc -o integral_approximation integral_approximation.c -lm
./integral_approximation

예상 출력:

적분 근사 결과
------------------------------
함수:            f(x) = x^2
구간:            [0.00, 1.00]
사다리꼴 개수: 100

수치 결과:
근사적인 적분 값: 0.333333
정확한 적분 값:       0.333333

오차 분석:
절대 오차:       0.000000
상대 오차:        0.0000%

이 버전의 주요 개선 사항:

  • 수치 결과를 비교하기 위해 exactIntegral() 함수를 추가했습니다.
  • 절대 오차와 상대 오차를 계산했습니다.
  • 더 자세하고 서식화된 출력을 제공했습니다.

요약

이 실험에서는 C 언어를 사용하여 사다리꼴 규칙 (trapezoidal rule) 을 이용하여 적분을 근사하는 방법을 배웠습니다. 먼저, 수치적분을 위해 수학 함수 f(x) 와 구간 [a, b]를 정의했습니다. 그런 다음, 구간을 분할하고 사다리꼴 공식을 적용하여 근사적인 적분 값을 계산하는 사다리꼴 규칙을 구현했습니다. 마지막으로, 적분 근사 결과를 출력했습니다.

이 실험의 핵심 단계는 함수와 구간을 정의하고, 구간을 분할하며, 사다리꼴 공식을 적용하여 근사적인 적분 값을 계산하는 것이었습니다. 이러한 단계들을 따름으로써 C 언어에서 간단하고 효과적인 수치적분 기법을 구현할 수 있었습니다.