C 언어로 지점에서의 미분 근사

CBeginner
지금 연습하기

소개

이 실험에서는 C 프로그래밍 언어를 사용하여 특정 지점에서 함수의 미분을 근사하는 방법을 배웁니다. 먼저 간단한 이차 함수를 정의한 후, 작은 값 h를 사용하여 차분법으로 수치 미분을 계산합니다. 마지막으로 근사적인 미분 값을 출력합니다. 이 실험은 미적분학 및 해석 기하학에서 기본적인 개념인 미분 근사에 대한 실질적인 이해를 제공하는 것을 목표로 합니다.

함수 f(x) 정의

이 단계에서는 미분 근사를 보여주기 위해 C 프로그래밍에서 수학 함수 f(x) 를 정의합니다. 이 개념을 설명하기 위해 간단한 이차 함수를 만들 것입니다.

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

cd ~/project
nano derivative_approximation.c

이제 함수의 초기 코드를 작성합니다.

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

// f(x) = x^2 + 2x + 1 이차 함수 정의
double f(double x) {
    return x * x + 2 * x + 1;
}

int main() {
    double x = 2.0;  // 미분을 근사할 지점
    printf("함수 f(x) = x^2 + 2x + 1\n");
    printf("x = %.2f 에서 평가: f(x) = %.2f\n", x, f(x));

    return 0;
}

코드를 컴파일하고 실행하여 함수를 확인합니다.

gcc derivative_approximation.c -o derivative_approximation -lm
./derivative_approximation

예상 출력:

함수 f(x) = x^2 + 2x + 1
x = 2.00에서 평가: f(x) = 9.00
코드 설명
  • f(x) = x^2 + 2x + 1 이차 함수를 정의합니다.
  • 함수는 double 입력 x를 받아 double 결과를 반환합니다.
  • main() 함수에서 x = 2 에서 함수를 평가하는 것을 보여줍니다.
  • printf()를 사용하여 함수 정보와 값을 표시합니다.

작은 h 값 사용 및 (f(x+h)-f(x))/h 계산

이 단계에서는 차분법을 사용하여 미분을 근사하도록 이전 코드를 수정합니다. 작은 값 h를 사용하여 수치 미분을 계산합니다.

derivative_approximation.c 파일을 업데이트합니다.

nano ~/project/derivative_approximation.c

이전 main() 함수를 다음 코드로 바꿉니다.

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

// 이차 함수 f(x) = x^2 + 2x + 1
double f(double x) {
    return x * x + 2 * x + 1;
}

// 차분법을 사용한 미분 근사
double approximate_derivative(double x, double h) {
    return (f(x + h) - f(x)) / h;
}

int main() {
    double x = 2.0;  // 미분 근사 지점
    double h = 0.0001;  // 차분법을 위한 작은 값

    double approx_derivative = approximate_derivative(x, h);

    printf("함수: f(x) = x^2 + 2x + 1\n");
    printf("x = %.2f 에서 미분 근사\n", x);
    printf("증분 h = %.6f\n", h);
    printf("근사 미분: %.4f\n", approx_derivative);

    return 0;
}

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

gcc derivative_approximation.c -o derivative_approximation -lm
./derivative_approximation

예상 출력:

함수: f(x) = x^2 + 2x + 1
x = 2.00에서 미분 근사
증분 h = 0.000100
근사 미분: 5.0001
코드 설명
  • 차분법을 사용하여 미분을 계산하는 새로운 함수 approximate_derivative()를 도입합니다.
  • h는 순간 변화율을 근사하는 데 도움이 되는 작은 값 (0.0001) 입니다.
  • 공식 (f(x+h) - f(x)) / h는 x 지점에서의 미분을 근사합니다.
  • 근사된 미분 값을 출력합니다.

근사 미분 출력

이 단계에서는 수치 근사값과 해석적 미분값을 비교하고 더욱 정보에 풍부한 방식으로 결과를 출력하도록 미분 근사 프로그램을 확장합니다.

derivative_approximation.c 파일을 업데이트합니다.

nano ~/project/derivative_approximation.c

이전 코드를 다음과 같이 바꿉니다.

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

// 이차 함수 f(x) = x^2 + 2x + 1
double f(double x) {
    return x * x + 2 * x + 1;
}

// f(x) 의 해석적 미분
double analytical_derivative(double x) {
    return 2 * x + 2;
}

// 차분법을 사용한 미분 근사
double approximate_derivative(double x, double h) {
    return (f(x + h) - f(x)) / h;
}

int main() {
    double x = 2.0;  // 미분 근사 지점
    double h_values[] = {1e-1, 1e-2, 1e-3, 1e-4, 1e-5};
    int num_h = sizeof(h_values) / sizeof(h_values[0]);

    double true_derivative = analytical_derivative(x);

    printf("함수: f(x) = x^2 + 2x + 1\n");
    printf("미분 지점: x = %.2f\n", x);
    printf("해석적 미분: %.4f\n\n", true_derivative);

    printf("미분 근사 결과:\n");
    printf("-----------------------------------\n");
    printf("증분 (h)   근사 미분   오차\n");
    printf("-----------------------------------\n");

    for (int i = 0; i < num_h; i++) {
        double h = h_values[i];
        double approx_derivative = approximate_derivative(x, h);
        double error = fabs(true_derivative - approx_derivative);

        printf("%.1e             %.4f               %.6f\n",
               h, approx_derivative, error);
    }

    return 0;
}

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

gcc derivative_approximation.c -o derivative_approximation -lm
./derivative_approximation

예상 출력:

함수: f(x) = x^2 + 2x + 1
미분 지점: x = 2.00
해석적 미분: 6.0000

미분 근사 결과:
-----------------------------------
증분 (h)   근사 미분   오차
-----------------------------------
1.0e-01             6.2000               0.200000
1.0e-02             6.0200               0.020000
1.0e-03             6.0020               0.002000
1.0e-04             6.0002               0.000200
1.0e-05             6.0000               0.000020
코드 설명
  • 실제 미분을 계산하는 analytical_derivative() 함수를 추가했습니다.
  • 수렴을 보여주기 위해 서로 다른 증분 크기 h의 배열을 만들었습니다.
  • 루프를 사용하여 서로 다른 증분 크기로 근사값을 출력했습니다.
  • 해석적 미분과 수치 미분 사이의 오차를 계산하고 표시했습니다.
  • 작은 h 값이 더 정확한 근사값으로 이어지는 것을 보여줍니다.

요약

이 실험에서 우리는 먼저 C 프로그래밍에서 이차 함수 f(x) = x^2 + 2x + 1 을 정의했습니다. 그런 다음 차분법 ((f(x+h)-f(x))/h) 을 사용하여 함수의 미분을 근사하기 위해 작은 값 h 를 도입했습니다. 마지막으로 근사 미분 값을 출력했습니다.