본문으로 건너뛰기
김신건의 로그

미적분 (Calculus)

· 수정 · 📖 약 3분 · 882자/단어 #algorithm #math #calculus #numerical-methods
calculus, 미적분, 미분, 적분, numerical integration, numerical differentiation

정의

미적분 (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 sumO(N) 시간, O(1) 공간, 오차 O(1/N)
Trapezoidal ruleO(N) 시간, O(1) 공간, 오차 O(1/N²)
Simpson 1/3 ruleO(N) 시간, O(1) 공간, 오차 O(1/N⁴)

N = 구간 수, h = (b-a)/N.

변형 / 활용

변형설명
Gaussian quadrature가중치 + 직교 다항식으로 더 높은 정밀도, 같은 N 에서 더 정확
Romberg integrationRichardson 외삽으로 trapezoidal 결과 개선
Adaptive quadrature구간별 오차 추정 후 재귀 분할, 불필요한 계산 감소
Monte Carlo integration고차원 적분 (random sampling), 차원 저주 완화
Automatic differentiationChain 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…

이 개념을 다룬 위키 페이지 (1)

💬 댓글

사이트 검색 / 명령어

검색

스크롤 = 확대/축소 · 드래그 = 이동 · 0 = 원래 크기 · ESC = 닫기