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

수치해석 (Numerical Analysis)

· 수정 · 📖 약 3분 · 947자/단어 #algorithm #math #numerical-analysis #numerical-methods
numerical analysis, 수치해석, Newton method, Simpson rule, root finding

정의

수치해석 (Numerical Analysis) 은 해석적 해가 어렵거나 없는 문제를 수치적 근사로 푸는 분야. PS 에서는 크게 두 가지가 자주 등장한다.

  • Newton-Raphson method: 방정식 f(x) = 0 의 근을 반복적 접선 근사로 O(log N) 에 수렴.
  • 수치 적분 (Quadrature): 함수의 정적분을 Simpson / Trapezoidal rule 로 O(N) 에 근사.

적용처: 실수 연산 문제, 초월 방정식, 기하 문제의 최적값, 확률 밀도 함수의 적분.

문제 상황과 동기

“f(x) = 0 의 해를 찾아라” 또는 ”∫_a^b f(x) dx 를 계산하라”.

  • Root finding naive: 이분 탐색 (Bisection). O(log((b-a)/ε)), 느리지만 안정적.
  • Newton’s method: f(x_k) = 0 의 tangent 로 x_{k+1} 갱신. 2차 수렴 (O(log log 1/ε)).
  • 수치 적분 naive: Riemann sum O(N)에 오차 O(1/N).
  • Simpson rule: O(N)에 오차 O(1/N⁴). 훨씬 효율적.

핵심 통찰: 반복 근사에서 도함수 정보를 활용하면 수렴 속도가 비약적으로 향상된다.

시각화

핵심 아이디어

Newton-Raphson Method

x_{k+1} = x_k - f(x_k) / f'(x_k)

기하적 의미: 점 (x_k, f(x_k)) 에서 접선을 그어 x 축과 만나는 점이 다음 근사.

수렴 조건:

  • f’(x) ≠ 0.
  • 초기값 x₀ 가 해에 충분히 가까워야 함 (local convergence).
  • 2차 수렴: |x_{k+1} - α| ≈ C · |x_k - α|².

다중근 (multiple root): f’(α) = 0 이면 수렴 속도 저하 → Modified Newton 사용.

수치 적분 (Simpson 1/3 Rule)

∫_a^b f(x) dx ≈ (Δx/3) · (f(x₀) + 4f(x₁) + 2f(x₂) + 4f(x₃) + ... + f(x_N))

구간 수 N 은 짝수. 각 2개 subinterval 을 2차 Lagrange 보간.

알고리즘

newton(f, df, x0, tol, max_iter):
    x = x0
    for i = 1..max_iter:
        fx = f(x)
        if |fx| < tol: return x
        x = x - fx / df(x)
    return x

simpson(f, a, b, n):
    h = (b - a) / n
    sum = f(a) + f(b)
    for i = 1..n-1:
        if i % 2 == 1: sum += 4 * f(a + i * h)
        else:          sum += 2 * f(a + i * h)
    return sum * h / 3

구현

// Newton method: sqrt(2) via x^2 - 2 = 0
// Simpson: integral of sin(x) from 0 to PI = 2
#include <bits/stdc++.h>
using namespace std;

double f_sqrt(double x) { return x * x - 2; }
double df_sqrt(double x) { return 2 * x; }

double newton(double (*f)(double), double (*df)(double),
            double x0, double tol = 1e-12, int max_iter = 100) {
  double x = x0;
  for (int i = 0; i < max_iter; i++) {
      double fx = f(x);
      if (fabs(fx) < tol) return x;
      x -= fx / df(x);
  }
  return x;
}

double g(double x) { return sin(x); }

double simpson(double a, double b, int n) {
  if (n & 1) n++;
  double h = (b - a) / n;
  double s = g(a) + g(b);
  for (int i = 1; i < n; i++)
      s += (i & 1 ? 4 : 2) * g(a + i * h);
  return s * h / 3;
}

int main() {
  cout << fixed << setprecision(12);
  cout << "sqrt(2) via Newton: " << newton(f_sqrt, df_sqrt, 1.0) << "\n";
  cout << "expected:           " << sqrt(2) << "\n";
  cout << "Simpson integral:   " << simpson(0, M_PI, 100) << "\n";
  cout << "expected:           2.000000000000\n";
}
결과
sqrt(2) via Newton: 1.414213562373
expected:           1.414213562373
Simpson integral:   2.000000000000
expected:           2.000000000000

복잡도

항목
Newton (2차 수렴)O(log log 1/ε) 반복, 각 O(1) 도함수 평가
Bisection (1차 수렴)O(log((b-a)/ε)) 반복
Simpson 1/3O(N) 시간, O(1) 공간, 오차 O(1/N⁴)
TrapezoidalO(N) 시간, O(1) 공간, 오차 O(1/N²)

변형 / 활용

변형설명
Secant method도함수 없이 이전 점 2개로 기울기 근사. 수렴 차수 1.618
Bisection + Newton hybridBisection 으로 안정적 범위 수축 후 Newton 으로 급속 수렴
Modified Newton (다중근)x -= m * f(x) / f’(x), m = 중복도
Newton for systemsJacobian 으로 다변수 확장 (다변수 Newton)
Romberg integrationRichardson 외삽으로 trapezoidal 적분 개선
Gaussian quadratureLegendre 다항식 + 가중치로 최적 정밀도

함정

1. 초기값

Newton 은 초기값이 해에서 멀면 발산. 특히 f’(x) 가 0 근처이면 overshoot. Bisection 으로 먼저 대략 위치 파악.

2. 도함수 비용

도함수 계산이 비싸면 Secant 또는 finite difference 로 대체. 단, 수렴 속도 감소.

3. 다중근

f’(α) = 0 이면 Newton 의 2차 수렴이 1차로 저하. Modified Newton 필요.

4. 특이 적분

적분 구간 내 특이점이 있으면 Simpson rule 이 큰 오차. 구간 분할 후 improper integral 처리.

5. 수렴 판정

|x_{k+1} - x_k| < ε 만 보면 부적절. |f(x_k)| < ε 병행. 발산 대비 max_iter 설정.

BOJ 연습 문제

번호제목정답률링크
BOJ 1629곱셈-kokoa-lab
BOJ 2469사다리 타기-kokoa-lab
BOJ 1024수열의 합-kokoa-lab

참고

이 글의 용어 (3개)
미적분 (Calculus)algorithm
정의 미적분 (Calculus) 은 함수의 변화율(미분)과 누적량(적분)을 다루는 수학 분야. 알고리즘 문제에서는 수치 미분 (Numerical Differentiation) 과…
이분 탐색 (Binary Search)algorithm
정의 이분 탐색 (Binary Search) 은 정렬된 시퀀스에서 목표값의 위치를 O(log N) 에 찾는 알고리즘. 매 단계에서 후보 구간을 절반으로 줄인다. 탐색이 본질이 아…
제곱근 분할 (Sqrt Decomposition)algorithm
정의 제곱근 분할 (Sqrt Decomposition) 은 크기 N 배열을 √N 개씩 블록으로 나누고, 각 블록을 전처리해 구간 연산을 O(√N) 에 처리하는 자료구조 기법. 문…

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

💬 댓글

사이트 검색 / 명령어

검색

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