C 언어로 유한 차분 근사 평가하기

CBeginner
지금 연습하기

소개

이 실험에서는 C 언어로 유한 차분 근사를 이용하여 미분을 평가하는 방법을 배웁니다. 이 실험은 다음 단계를 포함합니다.

  1. 수학 함수 f(x)를 정의하고 유한 차분 근사를 위한 간격 크기 h를 설정합니다.
  2. 주어진 평가 지점 x에서 f(x)의 미분에 대한 전방 및 후방 유한 차분 근사를 계산합니다.
  3. 계산된 근사값을 출력하고 실제 미분과 비교합니다.

이 실험을 마치면 C 언어에서 유한 차분 방법을 구현하고 근사값의 정확성을 평가하는 방법에 대한 확실한 이해를 얻게 될 것입니다.

f(x) 정의 및 단계 크기 h 설정

이 단계에서는 C 언어에서 수학 함수를 정의하고 유한 차분 근사를 위한 단계 크기를 설정하는 방법을 배웁니다.

먼저 유한 차분 근사 프로그램을 위한 새로운 C 파일을 생성합니다.

cd ~/project
nano finite_difference.c

이제 다음 코드를 추가하여 함수와 단계 크기를 정의합니다.

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

// 함수 f(x) 정의
double f(double x) {
    return x * x;  // 예시 함수: f(x) = x^2
}

int main() {
    // 단계 크기 h 정의
    double h = 0.0001;  // 정확한 근사를 위해 작은 단계 크기

    // 미분을 평가할 지점
    double x = 2.0;

    printf("함수: f(x) = x^2\n");
    printf("단계 크기 h: %f\n", h);
    printf("평가 지점 x: %f\n", x);

    return 0;
}

예시 출력:

함수: f(x) = x^2
단계 크기 h: 0.000100
평가 지점 x: 2.000000

핵심 구성 요소를 살펴보겠습니다.

  1. f(x) 함수: 간단한 이차 함수 f(x) = x^2 를 정의했습니다. 근사하고자 하는 임의의 수학 함수로 이 함수를 수정할 수 있습니다.

  2. 단계 크기 h: 유한 차분 근사에서 사용되는 작은 값입니다. 일반적으로 더 작은 h 값은 더 정확한 결과를 제공하지만, 매우 작은 값은 수치 정밀도 문제를 야기할 수 있습니다.

  3. 평가 지점 x: 미분 근사값을 계산할 지점입니다.

프로그램을 컴파일하여 작동하는지 확인합니다.

gcc -o finite_difference finite_difference.c -lm
./finite_difference

예시 출력:

함수: f(x) = x^2
단계 크기 h: 0.000100
평가 지점 x: 2.000000

전방/후방 차분 계산

이 단계에서는 미분의 전방 및 후방 유한 차분 근사를 계산하는 방법을 배웁니다.

이전 파일을 열고 미분 근사 방법을 포함하도록 코드를 수정합니다.

cd ~/project
nano finite_difference.c

전방 및 후방 차분 계산을 포함하도록 코드를 업데이트합니다.

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

// 함수 f(x) 정의
double f(double x) {
    return x * x;  // 예시 함수: f(x) = x^2
}

int main() {
    // 단계 크기 h 정의
    double h = 0.0001;  // 정확한 근사를 위해 작은 단계 크기

    // 미분을 평가할 지점
    double x = 2.0;

    // 전방 차분 근사
    double forward_diff = (f(x + h) - f(x)) / h;

    // 후방 차분 근사
    double backward_diff = (f(x) - f(x - h)) / h;

    printf("전방 차분 근사: %f\n", forward_diff);
    printf("후방 차분 근사: %f\n", backward_diff);

    return 0;
}

프로그램을 컴파일하고 실행합니다.

gcc -o finite_difference finite_difference.c -lm
./finite_difference

예시 출력:

전방 차분 근사: 4.000100
후방 차분 근사: 3.999900

유한 차분 근사를 자세히 살펴보겠습니다.

  1. 전방 차분: x 바로 다음 지점을 사용하여 미분을 계산합니다.

    • 공식: (f(x + h) - f(x)) / h
    • 앞으로 이동하는 변화율을 근사합니다.
  2. 후방 차분: x 바로 이전 지점을 사용하여 미분을 계산합니다.

    • 공식: (f(x) - f(x - h)) / h
    • 뒤로 이동하는 변화율을 근사합니다.

f(x) = x^2 함수의 경우 실제 미분은 2x (x = 2 일 때 4) 입니다. 근사값은 실제 미분 값과 매우 가깝습니다.

근사값 출력

이 단계에서는 프로그램을 향상시켜 자세한 근사 결과를 출력하고 실제 미분과 비교합니다.

이전 파일을 열고 포괄적인 출력을 포함하도록 코드를 수정합니다.

cd ~/project
nano finite_difference.c

자세한 근사 출력을 포함하도록 코드를 업데이트합니다.

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

// 함수 f(x) 정의
double f(double x) {
    return x * x;  // 예시 함수: f(x) = x^2
}

// 실제 미분 함수
double actual_derivative(double x) {
    return 2 * x;  // x^2 의 미분은 2x
}

int main() {
    // 비교를 위해 여러 단계 크기 정의
    double step_sizes[] = {0.1, 0.01, 0.001, 0.0001};
    int num_steps = sizeof(step_sizes) / sizeof(step_sizes[0]);

    // 미분을 평가할 지점
    double x = 2.0;

    // 실제 미분 값
    double true_derivative = actual_derivative(x);

    printf("미분 근사 분석\n");
    printf("-----------------\n");
    printf("함수: f(x) = x^2\n");
    printf("평가 지점: x = %f\n", x);
    printf("실제 미분: %f\n\n", true_derivative);

    printf("단계 크기 | 전방 차분 | 후방 차분 | 전방 오차 | 후방 오차\n");
    printf("-------------------------------------------------------\n");

    // 서로 다른 단계 크기에 대한 근사값 계산 및 출력
    for (int i = 0; i < num_steps; i++) {
        double h = step_sizes[i];

        // 전방 차분 근사
        double forward_diff = (f(x + h) - f(x)) / h;

        // 후방 차분 근사
        double backward_diff = (f(x) - f(x - h)) / h;

        // 절대 오차 계산
        double forward_error = fabs(forward_diff - true_derivative);
        double backward_error = fabs(backward_diff - true_derivative);

        printf("%9f | %11f | %12f | %11f | %12f\n",
               h, forward_diff, backward_diff, forward_error, backward_error);
    }

    return 0;
}

프로그램을 컴파일하고 실행합니다.

gcc -o finite_difference finite_difference.c -lm
./finite_difference

예시 출력:

미분 근사 분석
-----------------
함수: f(x) = x^2
평가 지점: x = 2.000000
실제 미분: 4.000000

단계 크기 | 전방 차분 | 후방 차분 | 전방 오차 | 후방 오차
-------------------------------------------------------
    0.100000 |     4.100000 |      3.900000 |      0.100000 |       0.100000
    0.010000 |     4.010000 |      3.990000 |      0.010000 |       0.010000
    0.001000 |     4.001000 |      3.999000 |      0.001000 |       0.001000
    0.000100 |     4.000100 |      3.999900 |      0.000100 |       0.000100

주요 관찰 사항:

  1. 단계 크기 h가 감소함에 따라 근사가 더 정확해집니다.
  2. 전방 및 후방 차분은 실제 미분으로 수렴합니다.
  3. 단계 크기가 작아짐에 따라 오차가 줄어듭니다.

요약

이 실험에서는 수학 함수를 정의하고 유한 차분 근사를 위한 단계 크기를 C 에서 설정하는 방법을 배웠습니다. 또한 미분의 전방 및 후방 유한 차분 근사를 계산하는 방법을 배웠습니다. 다루어진 주요 단계는 함수 f(x) 와 단계 크기 h 를 정의하는 것과 주어진 평가 지점 x 에서 미분을 근사하기 위한 전방 및 후방 차분 방법을 구현하는 것입니다. 이는 수치 해석 및 과학 계산에서 유한 차분 기법을 이해하고 구현하는 기초를 제공합니다.