소개
이 실습에서는 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;
}
코드를 자세히 살펴보겠습니다.
- 입력/출력을 위한
stdio.h와 수학 함수를 위한math.h헤더를 포함합니다. f(x)는 적분할 간단한 이차 함수 x^2 로 정의됩니다.main()에서 적분 구간을 0 부터 1 까지 설정합니다.- 명확성을 위해 구간을 출력합니다.
컴파일 및 실행하여 확인합니다.
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 구현을 자세히 살펴보겠습니다.
simpsons_rule()은 구간 경계와 부분 구간의 개수를 입력받습니다.h는 각 부분 구간의 너비를 계산합니다.- 구간의 첫 번째와 마지막 점으로 시작합니다.
- 반복문은 중간 점들의 가중치를 더합니다.
- 짝수 점은 2, 홀수 점은 4 로 곱합니다.
- 최종 결과는 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%
이 단계에서 추가된 주요 내용:
- 정확한 적분 값을 계산하는
exact_integral()함수 추가 - 절대 오차 및 상대 오차 계산
- 자세한 적분 결과를 보여주는 서식화된 출력 생성
요약
이 실험에서는 먼저 적분할 함수 f(x) = x^2 와 적분 구간 [a, b] = [0, 1]을 정의했습니다. 그런 다음 Simpson's Rule 알고리즘을 구현하여 함수의 정적분을 근사했습니다. Simpson's Rule 은 구간을 짝수 개의 부분 구간으로 나누고, 이러한 부분 구간의 끝점과 중점에서 함수 값의 가중 합을 계산하는 방법입니다. 마지막으로 Simpson's Rule 을 사용하여 얻은 근사적인 적분 값을 출력합니다.



