소개
이 실험에서는 C 언어로 유한 차분 근사를 이용하여 미분을 평가하는 방법을 배웁니다. 이 실험은 다음 단계를 포함합니다.
- 수학 함수
f(x)를 정의하고 유한 차분 근사를 위한 간격 크기h를 설정합니다. - 주어진 평가 지점
x에서f(x)의 미분에 대한 전방 및 후방 유한 차분 근사를 계산합니다. - 계산된 근사값을 출력하고 실제 미분과 비교합니다.
이 실험을 마치면 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
핵심 구성 요소를 살펴보겠습니다.
f(x)함수: 간단한 이차 함수 f(x) = x^2 를 정의했습니다. 근사하고자 하는 임의의 수학 함수로 이 함수를 수정할 수 있습니다.단계 크기
h: 유한 차분 근사에서 사용되는 작은 값입니다. 일반적으로 더 작은h값은 더 정확한 결과를 제공하지만, 매우 작은 값은 수치 정밀도 문제를 야기할 수 있습니다.평가 지점
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
유한 차분 근사를 자세히 살펴보겠습니다.
전방 차분: x 바로 다음 지점을 사용하여 미분을 계산합니다.
- 공식: (f(x + h) - f(x)) / h
- 앞으로 이동하는 변화율을 근사합니다.
후방 차분: 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
주요 관찰 사항:
- 단계 크기
h가 감소함에 따라 근사가 더 정확해집니다. - 전방 및 후방 차분은 실제 미분으로 수렴합니다.
- 단계 크기가 작아짐에 따라 오차가 줄어듭니다.
요약
이 실험에서는 수학 함수를 정의하고 유한 차분 근사를 위한 단계 크기를 C 에서 설정하는 방법을 배웠습니다. 또한 미분의 전방 및 후방 유한 차분 근사를 계산하는 방법을 배웠습니다. 다루어진 주요 단계는 함수 f(x) 와 단계 크기 h 를 정의하는 것과 주어진 평가 지점 x 에서 미분을 근사하기 위한 전방 및 후방 차분 방법을 구현하는 것입니다. 이는 수치 해석 및 과학 계산에서 유한 차분 기법을 이해하고 구현하는 기초를 제공합니다.



