미적분 (Calculus)
정의
미적분 (Calculus) 은 함수의 변화율(미분)과 누적량(적분)을 다루는 수학 분야. 알고리즘 문제에서는 수치 미분 (Numerical Differentiation) 과 수치 적분 (Numerical Integration) 으로 주로 등장한다.
- 미분: 함수 f(x) 의 순간 변화율.
f'(x) = lim_{h->0} (f(x+h) - f(x)) / h - 적분: 함수 f(x) 의 정적분.
∫_a^b f(x) dx = lim_{N->∞} Σ f(x_i) Δx
PS 에서는 closed form 으로 미분/적분이 어려운 함수를 수치적으로 근사하는 테크닉이 중요.
문제 상황과 동기
“함수의 적분값 또는 미분계수를 O(N) 에 근사” 하고 싶다.
- naive Riemann sum:
Σ f(x_i) Δx, 오차 O(1/N). - Trapezoidal rule: 사다리꼴로 근사, 오차 O(1/N²).
- Simpson 1/3 rule: 2차 곡선 근사, 오차 O(1/N⁴).
핵심 통찰: 더 높은 차수의 근사법으로 같은 N 에서 더 정밀한 계산이 가능.
수치 미분은 central difference 로 O(h²) 정밀도로 O(1) 계산.
시각화
핵심 아이디어
수치 미분
전향(forward) / 중앙(central) / 후향(backward) 차분:
f'(x) ≈ (f(x+h) - f(x)) / h # forward, O(h)
f'(x) ≈ (f(x) - f(x-h)) / h # backward, O(h)
f'(x) ≈ (f(x+h) - f(x-h)) / (2h) # central, O(h²)
Central difference 가 오차 1차 작음. h = ε^(1/2) ≈ 1e-8 (double) 권장.
수치 적분
Trapezoidal rule: 각 subinterval 을 선형(1차) 근사.
∫_a^b f(x) dx ≈ (Δx/2) · (f(x₀) + 2f(x₁) + ... + 2f(x_{N-1}) + f(x_N))
오차: -(b-a)h²/12 · f”(ξ).
Simpson 1/3 rule: 각 2개 interval 을 2차 곡선 근사 (N 짝수).
∫_a^b f(x) dx ≈ (Δx/3) · (f(x₀) + 4f(x₁) + 2f(x₂) + 4f(x₃) + ... + f(x_N))
오차: -(b-a)h⁴/180 · f⁴(ξ). 정밀도가 훨씬 높음.
알고리즘
numerical_derivative(f, x, h):
return (f(x + h) - f(x - h)) / (2 * h)
simpson(f, a, b, n): # n must be even
h = (b - a) / n
sum = f(a) + f(b)
for i = 1 to n-1:
if i % 2 == 1: sum += 4 * f(a + i * h)
else: sum += 2 * f(a + i * h)
return sum * h / 3
구현
// Simpson 1/3 rule + central difference
// Integral of sin(x) from 0 to PI = 2
#include <bits/stdc++.h>
using namespace std;
double f(double x) { return sin(x); }
double derivative(double x, double h = 1e-8) {
return (f(x + h) - f(x - h)) / (2 * h);
}
double simpson(double a, double b, int n) {
if (n & 1) 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 & 1 ? 4 : 2) * f(x);
}
return sum * h / 3;
}
int main() {
double a = 0, b = M_PI;
int n = 100;
cout << fixed << setprecision(10);
cout << "Integral (Simpson): " << simpson(a, b, n) << "\n";
cout << "Exact: 2.0000000000\n";
cout << "Deriv at pi/4: " << derivative(M_PI / 4) << "\n";
cout << "cos(pi/4): " << cos(M_PI / 4) << "\n";
}Integral (Simpson): 2.0000000000
Exact: 2.0000000000
Deriv at pi/4: 0.7071067812
cos(pi/4): 0.7071067812복잡도
| 항목 | 값 |
|---|---|
| 수치 미분 (central) | O(1) 시간, O(1) 공간, 오차 O(h²) |
| Riemann sum | O(N) 시간, O(1) 공간, 오차 O(1/N) |
| Trapezoidal rule | O(N) 시간, O(1) 공간, 오차 O(1/N²) |
| Simpson 1/3 rule | O(N) 시간, O(1) 공간, 오차 O(1/N⁴) |
N = 구간 수, h = (b-a)/N.
변형 / 활용
| 변형 | 설명 |
|---|---|
| Gaussian quadrature | 가중치 + 직교 다항식으로 더 높은 정밀도, 같은 N 에서 더 정확 |
| Romberg integration | Richardson 외삽으로 trapezoidal 결과 개선 |
| Adaptive quadrature | 구간별 오차 추정 후 재귀 분할, 불필요한 계산 감소 |
| Monte Carlo integration | 고차원 적분 (random sampling), 차원 저주 완화 |
| Automatic differentiation | Chain rule 로 정확한 미분 (계산 그래프, 역전파) |
함정
1. h 선택 (수치 미분)
h 가 너무 작으면 반올림 오차 (cancellation), 너무 크면 절단 오차. Central diff: h ≈ √ε ≈ 1e-8 (double).
2. Simpson rule 짝수 조건
Simpson 1/3 은 구간 N 이 짝수여야 함 (subinterval 2개씩 묶음). 홀수면 마지막 3구간을 3/8 rule 처리.
3. 진동 함수
고주파 진동 함수는 균등 분할로 정밀도 불충분. 구간당 주기 여러 번이면 실패.
4. 특이점
적분 구간 내 발산점이 있으면 수치 적분 불안정. Rombeg 또는 특수 변환 필요.
5. 부동소수점 누적
Summation 에서 큰 수 + 작은 수 순서로 인한 loss. Kahan summation 또는 고정밀 누적.
BOJ 연습 문제
| 번호 | 제목 | 정답률 | 링크 |
|---|---|---|---|
| BOJ 14731 | 미분개척 | - | kokoa-lab |
| BOJ 25641 | 적분 | - | kokoa-lab |
| BOJ 24060 | 알고리즘 수업 - 병합 정렬 1 | - | kokoa-lab |
참고
이 글의 용어 (3개)
- 수치해석 (Numerical Analysis)algorithm
- 정의 수치해석 (Numerical Analysis) 은 해석적 해가 어렵거나 없는 문제를 수치적 근사로 푸는 분야. PS 에서는 크게 두 가지가 자주 등장한다. Newton-Ra…
- FFT, NTTalgorithm
- 정의 FFT (Fast Fourier Transform, 고속 푸리에 변환) 은 길이 인 수열의 이산 푸리에 변환 (DFT) 을 O(n log n) 에 계산하는 분할정복 알고리즘…
- Taylor Series: 함수 근사algorithm
- 정의 무한히 미분 가능한 함수 f 의 x = a 근방 급수: $$ f(x) = \sum{n=0}^{\infty} \frac{f^{(n)}(a)}{n!} (x - a)^n $$ M…
💬 댓글