AEGLOSLAB 로봇공학 전서(全書)

제1부 수학적 기초

1.18 수치 해석: ODE 적분기(룽게-쿠타·암시적·심플렉틱)·자동 미분(순방향·역방향 모드)·수치 안정성

1.18.1 이 장에서 배우는 것 / 선수 지식 / 특히 중요한 독자

이 장은 로봇 소프트웨어가 연속시간 모델을 컴퓨터에서 계산할 때 필요한 두 가지 수치 도구, 곧 상미분방정식(ODE)의 적분기와 도함수의 계산(자동 미분), 그리고 이들을 지배하는 수치 안정성을 다룬다. 시뮬레이터와 동역학 라이브러리는 운동방정식을 적분하고, 최적화·추정은 야코비안을 필요로 한다. 적분기의 선택(오차 차수, 강성 안정성, 에너지 보존)과 미분 방법(유한 차분, 복소 스텝, 자동 미분)에 따라 결과의 정확도와 비용이 크게 달라진다. 다룰 질문은 다섯 가지다. 오일러·RK4·후진 오일러의 오차 차수와 안정 한계는 무엇이며 강성 문제에서 무엇이 달라지는가, 심플렉틱 적분기는 에너지를 어떻게 다루는가, 회전 행렬을 적분할 때 직교성은 어떻게 유지하는가, 자동 미분의 순방향·역방향 모드는 어떻게 작동하고 비용이 어떻게 다른가, 유한 차분은 간격에 따라 얼마나 틀리며 복소 스텝은 이를 어떻게 피하는가.

배우는 것:

  • ODE 적분기 — 명시적(오일러·RK4)·암시적(후진 오일러), 차수, 안정 영역, 강성.
  • 기하 적분 — 스토머-베를레(심플렉틱)의 에너지 거동, 회전 행렬 적분.
  • 자동 미분 — 쌍대수 순방향 모드, 테이프 역방향 모드, 비용 비교.
  • 유한 차분과 복소 스텝 — 절단 오차와 반올림 오차의 균형.
  • 라이브러리 — SciPy solve_ivp의 방법별 비용, JAX 자동 미분과의 대조.

선수 지식: 1.7(지수 사상), 1.2(조건수), 1.11(쌍대수). 동역학 라이브러리의 해석적 도함수와 자동 미분은 3.6, 최적화 문제 모델링과 코드 생성은 1.15이 다룬다.

특히 중요한 독자: 시뮬레이터·동역학 라이브러리를 사용하거나 구현하는 엔지니어, 야코비안을 계산하는 추정·최적화 개발자, 수치 오차를 진단하는 연구자.

출처 방침. 서지는 Crossref·arXiv 응답으로 확인했다(목록은 이 장 끝). 직접 실행한 것: SciPy 1.18.1의 solve_ivp(RK45·DOP853·Radau·BDF·LSODA), JAX 0.12.0.1(jacfwd·jacrev·grad, float64)(Python 3.12, NumPy 2.5.4). 읽지 못한 것: 인용한 교과서·논문의 본문(정리 번호는 (확인 필요)), SciPy·JAX의 소스와 문서. 이 장의 수치는 순수 파이썬 구현으로 계산했으며 1.1의 행렬 곱, 1.7의 지수 사상을 불러와 사용했다.

1.18.2 개념 — 이산 단계로 연속 모델을 따라가기

미분방정식 $\dot y=f(t,y)$의 해는 닫힌 식이 드물어 시간을 간격 $h$로 나누고 단계마다 근사한다. 한 단계 방법의 오차는 간격에 대한 거듭제곱($h^p$, $p$는 차수)으로 줄지만 간격을 줄이면 계산이 늘고, 간격이 크면 수치적으로 불안정해질 수 있다. 특히 빠르게 감쇠하는 성분을 가진 강성 문제는 명시적 방법의 간격을 안정성이 제한하고 정확도는 제한하지 않는다. 암시적 방법은 단계마다 방정식을 풀어야 하나 안정 영역이 넓다.

도함수는 최적화·추정·제어의 모든 선형화에 필요하다. 유한 차분은 구현이 쉽지만 간격에 따라 절단 오차와 반올림 오차가 맞선다. 자동 미분은 계산 그래프에 연쇄 법칙을 기계적으로 적용해 반올림 수준의 정확한 도함수를 준다. 두 주제는 모두 부동소수점 산술의 한계 위에서 작동한다.

1.18.3 원리

1.18.3.1 한 단계 적분기와 차수

결론: 오일러는 1차, RK4는 4차이며 간격을 절반으로 줄이면 오차가 각각 $2^1$, $2^4$배 줄어든다. 후진 오일러는 1차이지만 안정 영역이 넓다.

$h$만큼 한 단계 나아가는 식은 다음과 같다.

방법식차수종류
전진 오일러$y_{n+1}=y_n+hf(t_n,y_n)$1명시적
RK4$y_{n+1}=y_n+\tfrac h6(k_1+2k_2+2k_3+k_4)$4명시적
후진 오일러$y_{n+1}=y_n+hf(t_{n+1},y_{n+1})$1암시적
스토머-베를레$p\leftarrow p-\tfrac h2\nabla V(q)$, $q\leftarrow q+hp$, $p\leftarrow p-\tfrac h2\nabla V(q)$2심플렉틱

RK4의 $k_i$는 구간 안 네 곳에서의 기울기이다(구현은 1.18.5). 암시적 방법은 단계마다 $y_{n+1}$의 방정식을 뉴턴법 등으로 푼다. 차수와 안정성의 이론은 Hairer 외의 교과서가 다룬다(Hairer–Nørsett–Wanner; 장·정리 번호 (확인 필요)).

1.18.3.2 안정 영역과 강성

결론: 시험 방정식 $\dot y=-\lambda y$에서 한 단계의 증폭 인자 $R(-\lambda h)$의 크기가 1 이하여야 안정이며, 전진 오일러는 $\lambda h\le2$, RK4는 $\lambda h\lesssim2.785$이고 후진 오일러·사다리꼴은 모든 $\lambda h>0$에서 안정이다.

증폭 인자는 전진 오일러 $1-x$, RK4 $1-x+\tfrac{x^2}2-\tfrac{x^3}6+\tfrac{x^4}{24}$, 후진 오일러 $1/(1+x)$, 사다리꼴 $(1-x/2)/(1+x/2)$($x=\lambda h$)이다. 강성 문제는 $\lambda$가 매우 커 안정 조건이 정확도 요구보다 훨씬 작은 간격을 강제하는 문제이다. 이때 명시적 방법은 해가 매끄러워도 작은 간격이 필요하고, 암시적 방법은 큰 간격을 쓸 수 있다. 사다리꼴(터스틴)의 증폭 인자는 $\lambda h\to\infty$에서 $-1$로 접근해 진동이 감쇠하지 않으며(1.25의 쌍선형 변환과 같은 식), 후진 오일러는 0으로 간다(도해).

0 1 2 3 4 5 0.0 0.5 1.0 1.5 2.0 λh 증폭 인자의 크기 R(−λh) 전진 오일러 RK4 후진 오일러 사다리꼴
실수 음축에서 한 단계 증폭 인자의 크기 R(−λh)(계산값). 크기가 1 이하인 구간이 안정 영역이다. 전진 오일러는 λh ≤ 2, RK4는 약 2.785까지이고 후진 오일러·사다리꼴은 전 구간에서 1 이하이다.

1.18.3.3 심플렉틱 적분기와 에너지

결론: 해밀턴계를 스토머-베를레로 적분하면 에너지 오차가 장시간에 걸쳐 커지지 않고 일정한 범위에서 진동하며, 일반 고차 적분기(RK4)는 오차가 시간에 따라 누적된다.

심플렉틱 적분기는 위상 공간의 부피를 보존한다. 이 구조는 에너지를 정확히 보존하지는 않으나 오차를 유계로 만든다는 이론이 알려져 있다(Hairer–Lubich–Wanner의 기하 적분; 정리 번호 (확인 필요)). 스토머-베를레는 Verlet(1967)이 분자 동역학에 사용한 알고리즘으로 알려져 있다(서지 확인, 본문 미확인). 로봇 시뮬레이터의 접촉·장시간 적분에서 에너지 표류는 안정성과 정확도의 핵심 요인이다.

1.18.3.4 회전 행렬의 적분

$\dot R=R[\omega]_\times$를 행렬 성분에 대한 ODE로 적분하면 단계마다 직교성이 깨진다. 오일러 단계 $R+hR[\omega]_\times$는 $R^\top R=I+h^2[\omega]_\times^\top[\omega]_\times$ 꼴로 열의 노름을 매 단계 $\sqrt{1+h^2\lVert\omega\rVert^2}$배(각속도에 수직인 성분) 키운다. 정규화는 직교성을 되돌리지만 회전량(각)의 오차는 남는다. 지수 사상 $R\leftarrow R\,\mathrm{Exp}(h\omega)$(1.7)는 각속도가 일정하면 정확하고 직교성이 반올림 수준으로 유지된다. 각속도가 변하는 경우의 고차 리군 적분은 이 장이 구현하지 않았다. 오일러 단계의 직교성 오차는 이 식으로 예측된다: $\omega=(0.3,-0.5,0.8)$, $h=0.01$, 10,000단계에서 $(1+h^2\lVert\omega\rVert^2)^n-1=1.664$이고 $R^\top R-I$의 최대 원소는 $1.664\max_i(1-\omega_i^2/\lVert\omega\rVert^2)=1.511$로 측정값 1.51과 일치한다(1.18.5).

1.18.3.5 자동 미분

결론: 자동 미분은 계산을 기본 연산의 연쇄로 보고 연쇄 법칙을 기계적으로 적용해 도함수를 반올림 수준으로 정확히 구한다. 순방향 모드는 입력 하나당 한 번, 역방향 모드는 출력 하나당 한 번의 전파가 필요해 입력이 많은 스칼라 함수에는 역방향이 유리하다.

순방향 모드는 값과 방향 미분을 쌍으로 전파한다. 이중수 $a+b\varepsilon$($\varepsilon^2=0$; 1.11와 같은 대수)에서 $f(x+\varepsilon)=f(x)+f'(x)\varepsilon$이다. 역방향 모드는 순방향으로 계산하면서 연산마다 지역 편미분을 테이프에 저장하고, 출력에서 입력으로 $\bar x_i=\sum_j\bar y_j\,\partial y_j/\partial x_i$를 전파한다. 기울기 한 번의 비용이 입력 수와 무관하게 함수 평가의 상수배이나 테이프의 메모리가 필요하다. 이론은 Griewank & Walther(2008)와 Baydin 외(2018)가 다룬다(서지 확인, 본문 미확인).

1.18.3.6 유한 차분과 복소 스텝

전진 차분 $[f(x+h)-f(x)]/h$의 절단 오차는 $O(h)$, 중심 차분은 $O(h^2)$이고 반올림 오차는 $O(\varepsilon_{\mathrm{mach}}/h)$이다. 두 오차의 합이 최소가 되는 간격이 있어 전진 차분은 $h\approx\sqrt{\varepsilon_{\mathrm{mach}}}$, 중심 차분은 $\varepsilon_{\mathrm{mach}}^{1/3}$ 근처이고 최소 오차도 각각 $\sqrt{\varepsilon_{\mathrm{mach}}}$, $\varepsilon_{\mathrm{mach}}^{2/3}$ 수준이다. 복소 스텝 $\mathrm{Im}\,f(x+ih)/h$는 뺄셈이 없어 반올림 오차가 간격에 의존하지 않으므로 $h$를 극히 작게 잡아도 $\varepsilon_{\mathrm{mach}}$ 수준의 정확도를 낸다(Martins 외, 2003; 서지 확인). 함수가 복소수 입력을 받아야 하고 절댓값·비교 연산에서는 사용할 수 없다.

1.18.3.7 수치 안정성의 기초

부동소수점은 상대 정밀도 $\varepsilon_{\mathrm{mach}}\approx1.1\times10^{-16}$(배정밀도)의 반올림을 연산마다 더하며, 거의 같은 두 수의 뺄셈은 유효 숫자를 잃는다(Goldberg 1991; 서지 확인). 이 장의 모든 결과는 이 한계 위에 있다: 유한 차분의 오차 곡선, 지수 사상의 반올림 수준 직교성, 이전 장들의 $\varepsilon/\theta$ 형태 오차(1.9의 acos, 1.10의 스크루 복원).

1.18.4 알고리즘

RK4, 후진 오일러, 스토머-베를레, 순방향·역방향 자동 미분

RK4(f, t, y, h):  k1 ← f(t, y) ;  k2 ← f(t+h/2, y+h/2 k1) ;  k3 ← f(t+h/2, y+h/2 k2)
                  k4 ← f(t+h, y+h k3) ;  y ← y + h/6 (k1 + 2k2 + 2k3 + k4)
후진 오일러:      y1 ← y ;  반복: y1 ← y1 − g/g',  g = y1 − y − h f(t+h, y1)
스토머-베를레(q, p): p ← p − h/2 ∇V(q) ;  q ← q + h p ;  p ← p − h/2 ∇V(q)
순방향 모드: 각 입력 i에 대해 시드 d_j = δ_ij로 f를 한 번 계산, 출력의 d가 ∂f/∂x_i
역방향 모드: 순방향으로 f를 계산하며 (부모, 지역 편미분)을 기록 ;
             출력 g ← 1 ;  위상 역순으로 부모.g += 자식.g × 지역 편미분

구현은 1.18.5의 두 코드 블록에 있다.

1.18.5 풀이 예제 — 차수·강성·에너지·회전 적분·자동 미분과 라이브러리 비교

세 적분기의 오차 차수를 로지스틱 방정식에서 측정하고, 강성 시험 문제에서 안정 한계를 확인하며, 단진자의 장시간 에너지 거동과 회전 행렬 적분의 직교성을 비교하고, 평면 2링크 팔의 야코비안을 자동 미분·유한 차분·복소 스텝으로 계산한 뒤 SciPy·JAX와 대조한다. 결론부터 적으면 다음과 같다. ① 간격을 절반으로 줄이면 오일러·후진 오일러의 오차는 약 1/2, RK4는 약 1/16이다(관찰 차수 1.00, 3.99). ② 강성 문제($\lambda=1000$)에서 전진 오일러는 $\lambda h=2.5$, RK4는 $\lambda h=2.94$에서 발산하고 RK4는 $\lambda h=2.5$에서 안정이며(이론 한계 2.785), 후진 오일러는 $\lambda h=100$에서도 안정이다. ③ 단진자를 $T=10^5$까지 적분하면 RK4의 에너지 오차는 $4.6\times10^{-3}$까지 누적되나 스토머-베를레는 $1.1\times10^{-3}$에서 더 늘지 않는다($T=1000$에서는 RK4가 $4.6\times10^{-5}$로 더 작다). ④ 행렬 오일러로 회전 행렬을 적분하면 $10^4$단계 뒤 직교성 오차가 1.51에 이르고 지수 사상은 $2.7\times10^{-13}$이다. ⑤ 전진 차분의 최소 오차는 $4.0\times10^{-8}$($h=10^{-8}$), 복소 스텝은 $h\le10^{-8}$에서 $2.2\times10^{-16}$이며 자동 미분은 해석 야코비안과 같다. ⑥ SciPy의 RK45는 강성 문제에 함수 평가 2,162회, Radau는 84회를 사용하고 JAX의 자동 미분은 이 장의 결과와 같다.

구현. step_euler·step_rk4·step_beuler·step_verlet·integrate(첫 블록), Dual·Var·grad_forward·grad_reverse(둘째 블록). 시험 함수 arm(평면 2링크, $l_1=1$, $l_2=0.7$)

항목값
입력 1로지스틱 $\dot y=y(1-y)$, $y(0)=0.1$, $t\in[0,2]$, 정확해 $1/(1+9e^{-t})$
입력 2강성: $\dot y=-\lambda(y-\cos t)-\sin t$, $y(0)=1$, $\lambda=1000$, $t\in[0,1]$, 정확해 $\cos t$
입력 3단진자 $H=p^2/2-\cos q$, $(q,p)=(1,0)$, $h=0.1$
입력 4각속도 $\omega=(0.3,-0.5,0.8)$ rad/s 일정, $h=0.01$, 10,000단계
입력 5야코비안 점 $q=(0.7,-0.4)$ rad
import math

def step_euler(f, t, y, h):
    return [a + h * b for a, b in zip(y, f(t, y))]

def step_rk4(f, t, y, h):
    k1 = f(t, y)
    k2 = f(t + h / 2, [a + h / 2 * b for a, b in zip(y, k1)])
    k3 = f(t + h / 2, [a + h / 2 * b for a, b in zip(y, k2)])
    k4 = f(t + h, [a + h * b for a, b in zip(y, k3)])
    return [a + h / 6 * (b + 2 * c + 2 * d + e)
            for a, b, c, d, e in zip(y, k1, k2, k3, k4)]

def step_beuler(f, jac, t, y, h, it=20):
    """후진 오일러: y1 = y + h f(t+h, y1), 뉴턴 반복"""
    y1 = list(y)
    for _ in range(it):
        g = y1[0] - y[0] - h * f(t + h, y1)[0]
        dg = 1 - h * jac(t + h, y1)
        y1[0] -= g / dg
    return y1

def step_verlet(grad, q, p, h):
    """스토머-베를레(kick-drift-kick), H = p^2/2 + V(q)"""
    p = p - h / 2 * grad(q)
    q = q + h * p
    p = p - h / 2 * grad(q)
    return q, p

def integrate(step, y, t0, t1, n):
    h = (t1 - t0) / n
    for k in range(n):
        y = step(t0 + k * h, y, h)
    return y
import math

class Dual:
    """순방향 모드: 값 v와 방향 미분 d를 함께 전파"""
    def __init__(self, v, d=0.0):
        self.v, self.d = v, d
    def _w(o):
        return o if isinstance(o, Dual) else Dual(o)
    def __add__(s, o):
        o = Dual._w(o)
        return Dual(s.v + o.v, s.d + o.d)
    __radd__ = __add__
    def __mul__(s, o):
        o = Dual._w(o)
        return Dual(s.v * o.v, s.d * o.v + s.v * o.d)
    __rmul__ = __mul__
    def sin(s):
        return Dual(math.sin(s.v), math.cos(s.v) * s.d)
    def cos(s):
        return Dual(math.cos(s.v), -math.sin(s.v) * s.d)

class Var:
    """역방향 모드: 연산 기록(테이프)에 지역 편미분을 저장"""
    def __init__(self, v, parents=()):
        self.v, self.parents, self.g = v, parents, 0.0
    def _w(o):
        return o if isinstance(o, Var) else Var(o)
    def __add__(s, o):
        o = Var._w(o)
        return Var(s.v + o.v, ((s, 1.0), (o, 1.0)))
    __radd__ = __add__
    def __mul__(s, o):
        o = Var._w(o)
        return Var(s.v * o.v, ((s, o.v), (o, s.v)))
    __rmul__ = __mul__
    def sin(s):
        return Var(math.sin(s.v), ((s, math.cos(s.v)),))
    def cos(s):
        return Var(math.cos(s.v), ((s, -math.sin(s.v)),))

def sin(x):
    return x.sin() if hasattr(x, 'sin') else math.sin(x)

def cos(x):
    return x.cos() if hasattr(x, 'cos') else math.cos(x)

def grad_forward(f, x):
    """입력마다 한 번씩 전파: n번의 순방향 계산"""
    out = []
    for i in range(len(x)):
        X = [Dual(v, float(i == j)) for j, v in enumerate(x)]
        out.append(f(X).d)
    return out

def grad_reverse(f, x):
    """한 번의 순방향 계산 + 한 번의 역전파"""
    X = [Var(v) for v in x]
    y = f(X)
    order, seen = [], set()
    def topo(n):
        if id(n) not in seen:
            seen.add(id(n))
            for p, _ in n.parents:
                topo(p)
            order.append(n)
    topo(y)
    y.g = 1.0
    for n in reversed(order):
        for p, w in n.parents:
            p.g += n.g * w
    return [v.g for v in X]

① 오차 차수.

간격 $h$오일러 오차RK4 오차후진 오일러 오차오일러 차수RK4 차수후진 오일러 차수
0.20002.46e-021.75e-062.52e-02
0.10001.24e-021.14e-071.26e-020.993.941.00
0.05006.24e-037.29e-096.28e-030.993.971.00
0.02503.13e-034.61e-103.14e-031.003.981.00
0.01251.56e-032.89e-111.57e-031.003.991.00

② 강성 문제.

방법$h$$\lambda h$단계 수$t=1$의 오차
오일러0.00111,0002.70e-07
오일러0.0110100발산
오일러0.00252.5400발산
오일러5e-050.0520,0001.35e-08
RK40.0029412.943401.81e+29
RK40.00252.54001.58e-06
RK40.00111,0009.02e-09
후진 오일러0.01101002.72e-06
후진 오일러0.1100102.84e-05
RK4 실수축 안정 한계 $\lambda h$2.7853

전진 오일러와 RK4의 발산은 안정 조건 위반이며 해가 매끄러운 $\cos t$인 구간에서도 일어난다. 후진 오일러는 $\lambda h=100$에서도 오차 $2.8\times10^{-5}$이다. RK4의 실수축 안정 한계는 증폭 인자의 크기가 1인 점을 이분법으로 구해 2.7853을 얻었다.

③ 에너지 거동.

방법간격적분 시간에너지 오차 최대에너지 오차 최종
RK40.110004.59e-05-4.58e-05
스토머-베를레0.110001.06e-03-8.52e-04
RK40.11000004.57e-03-4.57e-03
스토머-베를레0.11000001.06e-03-4.40e-04
0 20,000 40,000 60,000 80,000 100,000 10−5 10−3 10−1 시간 에너지 오차의 최댓값 ΔH RK4 스토머-베를레
단진자의 에너지 오차 최댓값 대 시간(간격 0.1, 계산값). RK4는 오차가 시간에 따라 누적되고 스토머-베를레는 1.1×10⁻³ 부근에서 더 늘지 않는다.

짧은 시간($T=1000$)에는 RK4의 오차가 더 작으나 선형에 가깝게 누적되어($100$배 긴 시간에 $100$배) $T=10^5$에서 스토머-베를레의 유계 값($1.1\times10^{-3}$)을 넘는다. 간격 0.1과 이 시스템에 한정한 결과이다.

④ 회전 행렬의 적분.

방법 (회전 행렬, 각속도 일정, 10,000단계)$\max\lvert R^\top R-I\rvert$정확한 $\mathrm{Exp}$와의 최대 차이
행렬 오일러 $R\leftarrow R+hR[\omega]_\times$1.51e+005.13e-01
행렬 RK41.19e-107.19e-09
행렬 오일러 + 그람-슈미트 정규화2.22e-165.33e-02
지수 사상 $R\leftarrow R\,\mathrm{Exp}(h\omega)$2.74e-131.26e-13

행렬 오일러는 직교성이 크게 깨지고 RK4는 $10^{-10}$ 수준에서 깨진다. 오일러에 그람-슈미트 정규화를 더하면 직교성은 반올림 수준이나 정확한 회전과 0.053 차이가 나 각이 틀린다. 지수 사상은 직교성과 정확도를 모두 반올림 수준으로 유지한다.

⑤ 야코비안의 계산 방법.

방법야코비안 최대 오차
순방향 자동 미분(입력당 1회)0.0e+00
역방향 자동 미분(출력당 1회)0.0e+00
전진 차분 $h=0.0001$7.2e-05
전진 차분 $h=1e-08$4.0e-08
전진 차분 $h=1e-12$2.4e-04
중심 차분 $h=0.001$2.4e-07
중심 차분 $h=1e-05$3.5e-11
중심 차분 $h=1e-08$6.4e-09
복소 스텝 $h=0.0001$2.4e-09
복소 스텝 $h=1e-08$2.2e-16
복소 스텝 $h=1e-20$2.2e-16
복소 스텝 $h=1e-100$2.2e-16
10−15 10−10 10−5 10−15 10−10 10−5 100 간격 h 야코비안 최대 오차 전진 차분 중심 차분 복소 스텝 자동 미분
평면 2링크 팔 야코비안의 최대 오차 대 간격(계산값). 전진·중심 차분은 간격에 따라 V자 곡선(절단 오차와 반올림 오차의 균형)을 그리고, 복소 스텝은 작은 간격에서 반올림 수준으로 일정하며 자동 미분은 간격과 무관하다.

전진 차분은 $h=10^{-8}$ 근처에서 최소 오차 $4.0\times10^{-8}$($\approx\sqrt{\varepsilon_{\mathrm{mach}}}$)에 이르고 그보다 작은 간격에서 반올림 오차가 지배해($h=10^{-12}$에서 $2.4\times10^{-4}$) 오히려 커진다. 중심 차분의 최소는 $h\approx10^{-5}$에서 $3.5\times10^{-11}$이다. 복소 스텝은 $h\le10^{-8}$에서 $2.2\times10^{-16}$으로 일정하다. 자동 미분의 오차 0은 이 시험 함수에서 해석식과 같은 연산 순서가 만들어져 비트 단위로 같았다는 뜻이며 일반적으로 반올림 수준의 차이는 있을 수 있다.

⑥ 순방향 대 역방향 모드의 비용. 스칼라 함수 $\sum_i\sin(x_i)x_{i+1}$의 기울기 시간이다.

입력 수 $n$순방향 (s)역방향 (s)순방향/역방향두 기울기의 최대 차이
100.00030.000210.0e+00
1000.01880.0007290.0e+00
4000.30030.00181710.0e+00

입력이 늘면 순방향 모드의 시간이 입력 수에 비례해 늘고 역방향은 거의 상수 배이다. 시간은 이 환경의 순수 파이썬 측정이며 실행마다 달라진다.

⑦ SciPy와 JAX 호출 결과(실행 2026-11-03). 스크립트는 robotics/fig-src/1.18-libcheck.py, 출력은 robotics/fig-src/data/1.18-libcheck-output.txt에 있다. 강성 문제를 rtol=1e-6, atol=1e-9로 풀었다.

방법함수 평가 수야코비안 평가 수$t=1$의 오차
RK452,1620$1.14\times10^{-7}$
DOP8532,8700$1.04\times10^{-8}$
Radau841$8.34\times10^{-10}$
BDF542$4.95\times10^{-9}$
LSODA11610$4.31\times10^{-10}$

명시적 방법(RK45·DOP853)은 안정 조건 때문에 2,000회 넘는 평가를 사용하고 암시적·강성 대응 방법은 54~116회로 끝난다. JAX(jacfwd·jacrev)는 평면 2링크 팔의 야코비안이 해석식과 $0.0$ 차이이고 이 장의 순방향 자동 미분과도 $0.0$ 차이이며, $n=10$ 기울기도 이 장의 순방향·역방향과 $0.0$ 차이이다.

한계. 수치는 합성 입력(결정적)이다. 오차 차수는 한 방정식, 에너지 거동은 단진자 하나와 간격 하나, 회전 적분은 일정 각속도 하나에서 측정했다. 암시적 방법은 스칼라 문제만 구현했다(벡터 문제는 1.1의 LU로 확장 가능하나 구현하지 않았다). 적응 간격·오차 제어, 고차 암시적 룽게-쿠타, 리군 위의 고차 적분, 자동 미분의 고계 도함수·메모리 절약(체크포인팅)은 다루지 않았다. 자동 미분의 시간 비교는 순수 파이썬의 측정이며 컴파일된 라이브러리의 비용과 다르다. JAX는 결과의 일치만 확인했고 소스를 읽지 않았다.

견해: 이 책은 로봇 시뮬레이션의 적분에서 오차 허용과 간격 상한을 정한 뒤 강성이 있으면 암시적(또는 강성 대응) 방법을, 장시간 보존계 시뮬레이션에는 심플렉틱 방법을 기본으로 두고, 야코비안은 자동 미분이나 해석식을 사용하며 유한 차분은 검증용으로만 사용하는 것을 기본으로 둔다고 본다. 근거는 위 예제에서 RK45가 강성 문제에 평가 2,162회를 사용한 데 비해 Radau는 84회였고, 스토머-베를레의 에너지 오차는 $10^5$ 시간 단위에서도 일정했으며, 유한 차분의 최소 오차가 $10^{-8}$ 수준이어서 반올림 수준의 자동 미분보다 8자리 낮았다는 점이다. 이 근거는 작은 시험 문제이다.

1.18.6 설계 트레이드오프 — 적분기와 미분 방법의 선택

공개 문헌에서 확인되는 선택지는 네 가지다.

  • ① 명시적 룽게-쿠타. 단계가 단순하고 함수 평가만 필요하다. 강성에서 간격이 안정 조건에 묶인다.
  • ② 암시적(후진 오일러·Radau·BDF). 강성에 안정적이다. 단계마다 비선형 방정식과 야코비안이 필요하다.
  • ③ 심플렉틱. 보존계의 장시간 에너지가 유계이다. 2차 이상 구성과 비보존계에 대한 적용은 제한이 있다.
  • ④ 리군 적분(지수 사상). 직교성 같은 구조를 보존한다. 각속도가 변하는 경우 고차 구성이 필요하다.
방식장점한계알맞은 경우
① 명시적 RK단순, 평가만 필요강성에서 간격 제한비강성 시뮬레이션, 저비용
② 암시적강성 안정단계 비용, 야코비안강성 동역학, 큰 간격
③ 심플렉틱에너지 유계보존계에 한정장시간 보존계
④ 리군 적분구조 보존구현 복잡자세·강체 적분
도함수 방법장점한계알맞은 경우
해석식정확, 빠름유도 오류 위험핵심 모델
자동 미분반올림 수준, 기계적메모리(역방향), 도구 필요일반 야코비안, 최적화
복소 스텝구현 단순, 정확복소 입력 필요검증, 소규모
유한 차분단순최소 $10^{-8}$ 오차, 간격 선택검증

견해: 수치 도구의 선택은 평균 정확도보다 최악의 조건(강성·장시간·큰 입력 수)에서 정하는 것이 맞다고 본다. 근거는 이 장의 각 시험에서 방법 간 차이가 평균적인 작은 간격에서는 작았고 극단 조건(λh 큼, T 큼, n 큼)에서 크게 벌어졌다는 점이다.

1.18.7 응용 축 비교

응용 축수치 해석이 맡는 일요구관련 장
산업·제조동역학 시뮬레이션, 보정 야코비안정확도1.12, 3.6
물류·이동이동 로봇 동역학 적분, 궤적 시뮬레이션연산량1.15
도로 주행차량 모델 적분, 칼만 필터 전파실시간9.3
서비스접촉 시뮬레이션안정성3.12
의료·헬스케어조직·도구 모델의 강성 적분안정성3.12
휴머노이드·범용장시간 접촉 시뮬레이션, 해석적 도함수에너지 안정, 비용3.6
필드차량-지형 모델의 적분강건성—
국방·안보원리 수준에서 해당하는 고유 요구 없음——

이 표는 이 책의 정리이며 장별 요구는 다르다.

1.18.8 관련 규격·프로토콜

문서발행무엇을 정하나상세 장
『Solving Ordinary Differential Equations I·II』Hairer 외, SpringerODE 적분의 이론(비강성·강성)—
『Geometric Numerical Integration』Hairer·Lubich·Wanner, Springer심플렉틱·구조 보존 적분—
『Evaluating Derivatives』Griewank·Walther, SIAM, 2008알고리즘 미분1.15
「The complex-step derivative approximation」Martins 외, ACM TOMS 29(3), 2003복소 스텝—
SciPy integrate·JAXPyPI, GitHub적분기·자동 미분 구현3.6
수학 표기·기호표이 책적분·도함수 표기A.2

수치 해석 알고리즘의 표기에 국제 표준은 없다. 시험은 정확해가 있는 문제와 허용 오차를 적은 실행 기록이 기준이다.

1.18.9 관련 규제·인증 요구와의 연결

직접 적용되는 규제는 없다. 시뮬레이션 기반 검증(16.24)에서 적분기의 오차와 에너지 표류, 야코비안의 오류는 검증 결과의 신뢰도에 영향을 주므로 수치 설정(간격·허용 오차)을 기록하는 것이 안전 관련 소프트웨어의 검증 항목이 될 수 있다. 소프트웨어 안전과 품질 표준은 26.20이 다룬다.

1.18.10 한계·유의점·미해결

  • 정리의 출처. 적분기의 차수·안정 영역, 심플렉틱 적분의 유계 에너지 오차, 자동 미분의 복잡도의 정리 번호와 교과서 장 번호는 확인하지 않았다 (확인 필요).
  • 범위. 적응 간격, 고차 암시적 방법, 리군 고차 적분, 고계·희소 야코비안, 체크포인팅은 다루지 않았다.
  • 라이브러리. SciPy·JAX의 소스·문서는 읽지 않았고 실행 결과로만 비교했다.
  • 시간 측정. 자동 미분의 비교는 순수 파이썬의 값이며 컴파일된 구현과 다르다.

1.18.11 체크포인트·연구 질문

체크포인트:

  1. 오일러·RK4·후진 오일러의 식과 차수를 적고 간격 반감 시의 오차 비를 설명할 수 있는가.
  2. 시험 방정식의 증폭 인자로 전진 오일러·RK4·후진 오일러의 안정 조건을 유도할 수 있는가.
  3. 강성 문제가 명시적 방법에 주는 영향과 암시적 방법의 이점을 설명할 수 있는가.
  4. 스토머-베를레의 단계와 에너지 거동, RK4와의 차이를 설명할 수 있는가.
  5. 회전 행렬을 적분할 때 직교성이 깨지는 이유와 지수 사상의 이점을 설명할 수 있는가.
  6. 순방향·역방향 자동 미분의 작동과 비용 차이를 설명할 수 있는가.
  7. 유한 차분의 최적 간격이 존재하는 이유와 복소 스텝이 이를 피하는 이유를 설명할 수 있는가.

연구 질문(47.12에 수록한다):

  • 접촉이 있는 로봇 시뮬레이션에서 심플렉틱·암시적 적분기의 에너지 거동과 접촉 안정성은 간격에 따라 어떻게 달라지는가.
  • 역방향 자동 미분의 메모리 비용을 줄이는 체크포인팅은 장시간 궤적 최적화(11.8)에서 얼마나 효과적인가.
  • 동역학 라이브러리의 해석적 도함수와 자동 미분의 정확도·속도 차이는 전신 제어에서 어느 정도인가(3.6).

1차 출처

  • E. Hairer, S. P. Nørsett, G. Wanner, 『Solving Ordinary Differential Equations I: Nonstiff Problems』, Springer(doi:10.1007/978-3-662-12607-3) (확인 필요: 판·장 번호).
  • E. Hairer, G. Wanner, 『Solving Ordinary Differential Equations II: Stiff and Differential-Algebraic Problems』, Springer(doi:10.1007/978-3-662-09947-6) (확인 필요: 판·장 번호).
  • E. Hairer, C. Lubich, G. Wanner, 『Geometric Numerical Integration: Structure-Preserving Algorithms for Ordinary Differential Equations』, Springer(doi:10.1007/3-540-30666-8) — 서지(장 단위)만 확인 (확인 필요: 판).
  • L. Verlet, 「Computer "Experiments" on Classical Fluids. I. Thermodynamical Properties of Lennard-Jones Molecules」, Physical Review 159(1), 98–103, 1967(doi:10.1103/physrev.159.98) — 서지만 확인.
  • A. Griewank, A. Walther, 『Evaluating Derivatives: Principles and Techniques of Algorithmic Differentiation』, 2판, SIAM, 2008(doi:10.1137/1.9780898717761) — 서지만 확인 (확인 필요: 판·장 번호).
  • A. G. Baydin, B. A. Pearlmutter, A. A. Radul, J. M. Siskind, 「Automatic differentiation in machine learning: a survey」, Journal of Machine Learning Research 18(153), 1–43, 2018(arXiv:1502.05767) — 서지만 확인.
  • J. R. R. A. Martins, P. Sturdza, J. J. Alonso, 「The complex-step derivative approximation」, ACM Transactions on Mathematical Software 29(3), 245–262, 2003(doi:10.1145/838250.838251) — 서지만 확인.
  • D. Goldberg, 「What every computer scientist should know about floating-point arithmetic」, ACM Computing Surveys 23(1), 5–48, 1991(doi:10.1145/103162.103163) — 서지만 확인.
  • SciPy 1.18.1(integrate.solve_ivp 실행), JAX 0.12.0.1(jacfwd·jacrev·grad 실행), 2026-11-03.

다음 장. 1.19은 확률·통계 I로, 확률변수·가우시안·베이즈 정리를 다룬다. 결정적 모델의 수치 계산에서 잡음이 있는 모델의 확률적 기술로 넘어가 추정과 필터의 기초를 정리한다.