C 언어로 Simpson's Rule 을 이용한 적분 근사

CBeginner
지금 연습하기

소개

이 실습에서는 C 언어를 사용하여 Simpson's Rule 을 이용하여 적분을 근사하는 방법을 배웁니다. 이 실습에서는 적분할 함수, 적분 구간을 정의하고, Simpson's Rule 알고리즘을 구현하여 근사적인 적분 값을 계산하는 단계별 과정을 다룹니다. 이 실습을 마치면 지정된 구간에서 주어진 함수를 Simpson's Rule 방법을 사용하여 수치적으로 적분할 수 있는 C 프로그램을 완성하게 됩니다.

이 실습은 두 가지 주요 단계로 구성됩니다. 첫째, 함수와 구간을 정의하고, 둘째, 짝수 개의 부분 구간을 사용하여 Simpson's Rule 을 적용하여 근사적인 적분 값을 계산합니다. 이 실습을 통해 C 프로그래밍에서 수치적 적분 기법을 적용하는 실질적인 경험을 얻을 수 있습니다.

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

이 단계에서는 C 언어로 수치적분을 위한 Simpson's Rule 을 구현하기 위한 기본 요소들을 설정합니다. 적분할 함수를 정의하고 적분 구간을 지정합니다.

먼저 ~/project 디렉토리에 새로운 C 파일을 생성합니다.

cd ~/project
nano simpson_integration.c

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

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

// 함수 적분: f(x) = x^2
double f(double x) {
    return x * x;
}

int main() {
    // 적분 구간 [a, b] 정의
    double a = 0.0;  // 하한
    double b = 1.0;  // 상한

    printf("f(x) = x^2 를 %f에서 %f까지 적분합니다.\n", a, b);

    return 0;
}

코드를 자세히 살펴보겠습니다.

  1. 입력/출력을 위한 stdio.h와 수학 함수를 위한 math.h 헤더를 포함합니다.
  2. f(x)는 적분할 간단한 이차 함수 x^2 로 정의됩니다.
  3. main()에서 적분 구간을 0 부터 1 까지 설정합니다.
  4. 명확성을 위해 구간을 출력합니다.

컴파일 및 실행하여 확인합니다.

gcc simpson_integration.c -o simpson_integration -lm
./simpson_integration

예상 출력:

f(x) = x^2 를 0.000000 에서 1.000000 까지 적분합니다.

짝수 부분 구간을 사용한 Simpson's Rule 적용

이 단계에서는 함수의 정적분을 근사하기 위해 Simpson's Rule 알고리즘을 구현합니다. 기존 C 프로그램에 적분 함수를 추가합니다.

이전 파일을 엽니다.

cd ~/project
nano simpson_integration.c

Simpson's Rule 구현을 포함하도록 코드를 업데이트합니다.

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

// 함수 적분: f(x) = x^2
double f(double x) {
    return x * x;
}

// Simpson's Rule 구현
double simpsons_rule(double a, double b, int n) {
    double h = (b - a) / n;  // 각 부분 구간의 너비
    double sum = f(a) + f(b);  // 첫 번째와 마지막 점

    // 짝수 및 홀수 점의 합 계산
    for (int i = 1; i < n; i++) {
        double x = a + i * h;
        sum += (i % 2 == 0 ? 2 : 4) * f(x);
    }

    return (h / 3) * sum;
}

int main() {
    // 적분 구간 [a, b] 정의
    double a = 0.0;  // 하한
    double b = 1.0;  // 상한
    int n = 100;     // 부분 구간의 개수 (짝수여야 함)

    double integral = simpsons_rule(a, b, n);

    printf("f(x) = x^2 의 적분 (구간 %f에서 %f까지)\n", a, b);
    printf("%d개의 부분 구간을 사용한 Simpson's Rule 근사값: %f\n", n, integral);

    return 0;
}

컴파일 및 실행합니다.

gcc simpson_integration.c -o simpson_integration -lm
./simpson_integration

예상 출력:

f(x) = x^2의 적분 (구간 0.000000에서 1.000000까지)
100개의 부분 구간을 사용한 Simpson's Rule 근사값: 0.333333

Simpson's Rule 구현을 자세히 살펴보겠습니다.

  1. simpsons_rule()은 구간 경계와 부분 구간의 개수를 입력받습니다.
  2. h는 각 부분 구간의 너비를 계산합니다.
  3. 구간의 첫 번째와 마지막 점으로 시작합니다.
  4. 반복문은 중간 점들의 가중치를 더합니다.
  5. 짝수 점은 2, 홀수 점은 4 로 곱합니다.
  6. 최종 결과는 h/3 로 스케일링됩니다.

근사 적분 출력

이 마지막 단계에서는 Simpson's Rule 구현을 개선하여 더 자세한 출력을 추가하고 수치 근사값을 정확한 적분 값과 비교합니다.

이전 파일을 엽니다.

cd ~/project
nano simpson_integration.c

보다 포괄적인 출력을 포함하도록 코드를 업데이트합니다.

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

// 함수 적분: f(x) = x^2
double f(double x) {
    return x * x;
}

// f(x) = x^2 의 정확한 적분 계산 (a 부터 b 까지)
double exact_integral(double a, double b) {
    return (pow(b, 3) - pow(a, 3)) / 3.0;
}

// Simpson's Rule 구현
double simpsons_rule(double a, double b, int n) {
    double h = (b - a) / n;  // 각 부분 구간의 너비
    double sum = f(a) + f(b);  // 첫 번째와 마지막 점

    // 짝수 및 홀수 점의 합 계산
    for (int i = 1; i < n; i++) {
        double x = a + i * h;
        sum += (i % 2 == 0 ? 2 : 4) * f(x);
    }

    return (h / 3) * sum;
}

int main() {
    // 적분 구간 [a, b] 정의
    double a = 0.0;  // 하한
    double b = 1.0;  // 상한
    int n = 100;     // 부분 구간의 개수 (짝수여야 함)

    // 근사값 및 정확한 적분 계산
    double approx_integral = simpsons_rule(a, b, n);
    double exact_value = exact_integral(a, b);
    double error = fabs(exact_value - approx_integral);

    // 자세한 결과 출력
    printf("적분 근사 결과:\n");
    printf("------------------------------\n");
    printf("함수: f(x) = x^2\n");
    printf("구간: [%.2f, %.2f]\n", a, b);
    printf("부분 구간 개수: %d\n\n", n);

    printf("근사값 (Simpson's Rule): %.6f\n", approx_integral);
    printf("정확한 값: %.6f\n", exact_value);
    printf("절대 오차: %.6f\n", error);
    printf("상대 오차: %.4f%%\n", (error / exact_value) * 100);

    return 0;
}

컴파일 및 실행합니다.

gcc simpson_integration.c -o simpson_integration -lm
./simpson_integration

예상 출력:

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

근사값 (Simpson's Rule): 0.333333
정확한 값: 0.333333
절대 오차: 0.000000
상대 오차: 0.0000%

이 단계에서 추가된 주요 내용:

  1. 정확한 적분 값을 계산하는 exact_integral() 함수 추가
  2. 절대 오차 및 상대 오차 계산
  3. 자세한 적분 결과를 보여주는 서식화된 출력 생성

요약

이 실험에서는 먼저 적분할 함수 f(x) = x^2 와 적분 구간 [a, b] = [0, 1]을 정의했습니다. 그런 다음 Simpson's Rule 알고리즘을 구현하여 함수의 정적분을 근사했습니다. Simpson's Rule 은 구간을 짝수 개의 부분 구간으로 나누고, 이러한 부분 구간의 끝점과 중점에서 함수 값의 가중 합을 계산하는 방법입니다. 마지막으로 Simpson's Rule 을 사용하여 얻은 근사적인 적분 값을 출력합니다.