Chapter 05

수치 해법

2~4장에서 푼 방정식은 운이 좋은 경우였습니다. 변수가 분리되거나, 선형이거나, 적분 인자가 보였습니다. y′=t−y2y' = t - y^2처럼 한 글자만 바꿔도 기본 함수로 쓸 수 있는 해는 사라집니다. 그래도 4장의 존재·유일성 정리는 해가 있다고 말해 줍니다. 이 장은 그 해를 숫자로 만드는 법입니다. 1장에서 맛본 오일러 방법, 곧 "지금의 기울기로 조금 걷기"를 출발점으로 삼아, 왜 그것이 느린지(오차 차수 1), 기울기를 몇 번 더 재면 얼마나 빨라지는지(룽게–쿠타 4차), 걸음 폭을 스스로 고르는 법(적응 간격), 그리고 걸음 폭을 아무리 줄여도 터지는 방정식(강성)과 오래 돌리면 에너지가 새는 궤도(심플렉틱 적분)까지 다룹니다.

이 수식이 없었다면일기예보와 궤도 계산

대기의 운동 방정식, 행성 세 개가 서로 끌어당기는 삼체 문제, 트랜지스터 수천 개가 얽힌 회로의 방정식은 손으로 풀리는 꼴이 아닙니다. 삼체 문제는 일반적인 경우 기본 함수로 쓸 수 있는 해가 없다고 알려져 있습니다. 그런데도 우리는 내일의 기압 배치를 예보하고, 탐사선을 수년 뒤의 행성 근처로 보내고, 칩을 만들기 전에 회로를 시뮬레이션합니다. 모두 "지금 상태와 변화율에서 조금 뒤의 상태를 계산하고, 이를 수백만 번 되풀이하는" 수치 적분 덕분입니다.

이 아이디어의 뿌리는 오일러(Leonhard Euler)의 18세기 적분학 교재에 있고, 기울기를 한 걸음 안에서 여러 번 재는 방법은 19세기 말 룽게(Carl Runge)가 제안하고 20세기 초 쿠타(Martin Wilhelm Kutta)가 체계화했습니다. 오늘날 MATLAB의 ode45나 SciPy의 solve_ivp 기본값은 이 계열에 걸음 폭 자동 조절을 더한 방법입니다.

y′ = f(t, y)→기울기로 한 걸음→yₙ₊₁ = yₙ + h·(기울기의 가중 평균)→예보·궤도·회로 시뮬레이션

오일러 방법과 국소·전역 오차

걸음을 반으로 줄이면 오차는 얼마나 줄까

1장에서 오일러 방법으로 y′=yy' = y, y(0)=1y(0) = 1을 h=0.1h = 0.1로 풀면 y(1)≈2.5937y(1) \approx 2.5937이었습니다. 참값 e=2.7183e = 2.7183과 0.12만큼 차이가 납니다. 소수 넷째 자리까지 맞추려면 hh를 얼마로 해야 할까요? 그러려면 오차가 hh에 따라 어떤 법칙으로 줄어드는지 알아야 합니다.

초기값 문제 y′=f(t,y)y' = f(t, y), y(t0)=y0y(t_0) = y_0의 해를 시각 tn=t0+nht_n = t_0 + nh에서의 근삿값 yny_n으로 구합니다. hh를 걸음 폭(step size)이라 합니다. 해 y(t)y(t)를 tnt_n에서 테일러 전개하면(CalculusBook 12장)

y(tn+h)=y(tn)+h y′(tn)+h22y′′(ξn)=y(tn)+h f(tn,y(tn))+h22y′′(ξn)y(t_n + h) = y(t_n) + h\,y'(t_n) + \frac{h^2}{2}y''(\xi_n) = y(t_n) + h\,f(t_n, y(t_n)) + \frac{h^2}{2}y''(\xi_n)
ξn\xi_n은 tnt_n과 tn+1t_{n+1} 사이의 어떤 점(테일러 정리의 라그랑주 나머지). 미분방정식 덕분에 y′y'은 ff로 바로 계산된다.

마지막 항을 버리고, 모르는 y(tn)y(t_n) 대신 이미 계산한 yny_n을 넣은 것이 오일러 방법입니다.

정의 5.1 (오일러 방법) 걸음 폭 hh와 tn=t0+nht_n = t_0 + nh에 대해
yn+1=yn+h f(tn,yn),n=0,1,2,…y_{n+1} = y_n + h\,f(t_n, y_n), \qquad n = 0, 1, 2, \dots
로 근삿값을 만드는 방법을 (전진) 오일러 방법이라 한다. 한 걸음에 ff를 한 번 계산한다.

버린 항이 오차의 원천입니다. 그런데 오차에는 두 종류가 있다는 것을 구별해야 합니다. 한 걸음에서 새로 생기는 오차와, 지금까지 쌓인 오차입니다.

정의 5.2 (국소 절단 오차와 전역 오차) un(t)u_n(t)를 점 (tn,yn)(t_n, y_n)을 지나는 미분방정식의 정확한 해라 하자. 한 걸음의 국소 절단 오차(local truncation error)는 τn+1=un(tn+1)−yn+1\tau_{n+1} = u_n(t_{n+1}) - y_{n+1}, 곧 맞는 점에서 출발해 한 걸음만 걸었을 때의 오차다. 전역 오차(global error)는 원래 해와의 차이 En=y(tn)−ynE_n = y(t_n) - y_n이다.
t₀tₙtₙ₊₁ 참 해 y(t) uₙ(t): (tₙ, yₙ)을 지나는 해 접선 걸음 yₙ yₙ₊₁ 국소 오차 τₙ₊₁ 한 걸음에서 새로 생김 크기 ≈ (h²/2)·|y″| 전역 오차 Eₙ₊₁ 지금까지 쌓인 것 이전 오차 + 이번 국소 오차 (해곡선이 벌어지면 증폭)
그림 5-1. 오일러 걸음은 지금 점의 접선을 따라간다. 한 걸음 동안 생기는 국소 오차(노랑)는 지금 점을 지나는 해 unu_n과의 차이이고, 전역 오차(청록)는 처음 해 yy와의 차이다. 앞선 걸음의 오차 때문에 이미 다른 해곡선 위에 올라탔다는 점이 핵심이다.

국소 오차는 위의 테일러 나머지 그 자체라서 ∣τn+1∣≤M2h2|\tau_{n+1}| \le \frac{M}{2}h^2(M=max⁡∣y′′∣M = \max|y''|)입니다. 구간 [t0,T][t_0, T]를 지나려면 N=(T−t0)/hN = (T - t_0)/h걸음이 필요하니, 국소 오차를 그냥 더하면 N⋅M2h2=M(T−t0)2hN\cdot\frac{M}{2}h^2 = \frac{M(T - t_0)}{2}h, 즉 hh의 1제곱입니다. 실제로는 앞선 오차가 다음 걸음에서 해곡선의 벌어짐에 따라 커지거나 줄어드므로 한 가지 인자가 더 붙습니다.

정리 5.3 (오일러 방법의 오차) ff가 yy에 대해 립시츠 상수 LL을 가지고(∣f(t,y)−f(t,z)∣≤L∣y−z∣|f(t, y) - f(t, z)| \le L|y - z|), 해가 ∣y′′∣≤M|y''| \le M을 만족하면 tn≤Tt_n \le T인 모든 nn에 대해
∣En∣=∣y(tn)−yn∣≤Mh2L(eL(tn−t0)−1).|E_n| = |y(t_n) - y_n| \le \frac{Mh}{2L}\left(e^{L(t_n - t_0)} - 1\right).

증명의 핵심. 참 해의 테일러 전개에서 오일러 식을 빼면 En+1=En+h(f(tn,y(tn))−f(tn,yn))+h22y′′(ξn)E_{n+1} = E_n + h\bigl(f(t_n, y(t_n)) - f(t_n, y_n)\bigr) + \frac{h^2}{2}y''(\xi_n). 립시츠 조건으로 ∣En+1∣≤(1+hL)∣En∣+M2h2|E_{n+1}| \le (1 + hL)|E_n| + \frac{M}{2}h^2. 이 부등식을 E0=0E_0 = 0부터 되풀이하면 등비수열의 합 M2h2⋅(1+hL)n−1hL\frac{M}{2}h^2\cdot\frac{(1 + hL)^n - 1}{hL}이 나오고, 1+hL≤ehL1 + hL \le e^{hL}을 쓰면 위 식이다. ∎

정리의 메시지는 둘입니다. 첫째, 전역 오차는 hh에 비례합니다. hh를 반으로 줄이면 오차도 반이 됩니다. 국소 오차는 h2h^2인데 걸음 수가 1/h1/h이므로 하나가 깎입니다. 둘째, eL(t−t0)e^{L(t - t_0)} 인자 때문에 해곡선이 서로 벌어지는 방정식(∂f/∂y>0\partial f/\partial y > 0)에서는 오래 적분할수록 오차가 지수적으로 커질 수 있습니다. 해곡선이 모이는 방정식에서는 이 상한이 지나치게 비관적입니다.

예제 5.1 (오차가 h에 비례하는지 확인) y′=yy' = y, y(0)=1y(0) = 1을 오일러 방법으로 풀어 y(1)y(1)을 근사하라. h=0.1h = 0.1과 h=0.05h = 0.05를 비교하라.
  1. f=yf = y이므로 yn+1=yn+hyn=(1+h)yny_{n+1} = y_n + hy_n = (1 + h)y_n, 곧 yN=(1+h)Ny_N = (1 + h)^N이다.
  2. h=0.1h = 0.1, N=10N = 10: 1.110=2.5937421.1^{10} = 2.593742. 오차 e−2.593742=0.124539e - 2.593742 = 0.124539.
  3. h=0.05h = 0.05, N=20N = 20: 1.0520=2.6532981.05^{20} = 2.653298. 오차 0.0649840.064984.
  4. 비율 0.124539/0.064984=1.920.124539 / 0.064984 = 1.92. hh를 반으로 줄였더니 오차가 거의 반이 되었다. 오차 10−410^{-4}를 원하면 hh를 약 0.1×0.1245/10−4≈10−40.1\times 0.1245/10^{-4} \approx 10^{-4}까지, 즉 1만 걸음 가까이 줄여야 한다. 오일러 방법이 "정확하지만 느리다"는 말의 정량적 뜻이다.

아래 시뮬레이터에서 각 걸음의 국소 오차(노란 막대)와 끝점의 전역 오차(청록 막대)를 보세요. 점선은 각 걸음의 출발점을 지나는 정확한 해 unu_n입니다. y′=yy' = y에서는 점선들이 위로 벌어지므로 국소 오차가 쌓이며 커지고, y′=t−yy' = t - y에서는 점선들이 한데 모이므로 앞선 오차가 저절로 줄어듭니다.

SIMULATOR

오일러 걸음: 국소 오차가 전역 오차로 쌓이는 과정

참 해오일러 근사국소 오차전역 오차 (t = 2)
걸음 수 N—
yN / 참값 y(2)—
전역 오차 EN—
국소 오차 합 Σ|τ|—
|EN| / h—
해볼 것: ① h를 0.2 → 0.1 → 0.05로 반씩 줄이며 아래 메시지의 오차 비율이 2에 가까운지 보세요. |EN|/h가 거의 일정합니다. ② y′ = y에서는 전역 오차가 국소 오차 합보다 크고, y′ = t − y에서는 더 작습니다. 해곡선이 벌어지느냐 모이느냐의 차이입니다. ③ h = 0.5에서 각 노란 막대가 h²에 비례해 큰 것을 보세요. 모델: 국소 해 uₙ는 각 방정식의 일반해 공식으로 정확히 그립니다.

오차 차수: 로그–로그 그래프의 기울기

정리 5.3은 오일러 방법의 오차가 ChCh 꼴이라는 것을 말합니다. 더 좋은 방법은 Ch2Ch^2, Ch4Ch^4처럼 hh의 더 높은 거듭제곱으로 줄어듭니다. 이 지수를 방법의 차수라 합니다.

정의 5.4 (방법의 차수) 충분히 매끄러운 ff에 대해 국소 절단 오차가 O(hp+1)O(h^{p+1})이고, 따라서 고정된 구간에서 전역 오차가 ∣EN∣≤Chp|E_N| \le Ch^p이면 그 방법을 p차 방법(method of order p)이라 한다. 오일러 방법은 1차다.

E≈ChpE \approx Ch^p의 양변에 로그를 취하면 log⁡E≈log⁡C+plog⁡h\log E \approx \log C + p\log h. 그래서 오차를 hh에 대해 로그–로그 눈금으로 그리면 직선이 되고, 그 기울기가 차수 pp입니다. 두 간격 hh와 h/2h/2의 오차만 있어도 p≈log⁡2(Eh/Eh/2)p \approx \log_2(E_h / E_{h/2})로 차수를 추정할 수 있습니다. 예제 5.1에서 log⁡21.92=0.94\log_2 1.92 = 0.94, 1에 가깝습니다.

이 기울기는 새 프로그램을 검증하는 가장 강력한 도구입니다. RK4를 구현했는데 기울기가 4가 아니라 1로 나오면 어딘가에 버그가 있습니다(흔히 k2k_2를 계산할 때 t+h/2t + h/2 대신 tt를 넣은 경우). 반대로 hh를 너무 줄이면 오차가 더 이상 줄지 않고 들쭉날쭉해지는 바닥이 나타납니다. 컴퓨터의 실수가 약 16자리만 저장하기 때문에 생기는 반올림 오차로, 걸음 수가 많을수록 쌓입니다(MathBook: 컴퓨터는 어떻게 틀리는가).

SIMULATOR

오차–간격 로그–로그 그래프: 기울기가 차수다

가로축
오일러호인중점법RK4기준선
오일러 기울기—
호인 기울기—
중점법 기울기—
RK4 기울기—
해볼 것: ① 네 직선의 기울기가 1, 2, 2, 4인 것을 확인하세요(기울기는 반올림 바닥 위의 점들로만 맞춥니다). ② RK4는 h ≈ 10⁻³ 아래에서 10⁻¹⁴ 근처의 바닥에 닿아 더 줄지 않습니다. 반올림 오차입니다. ③ 가로축을 'f 계산 횟수'로 바꾸면 공정한 비용 비교가 됩니다. 같은 오차 10⁻⁶을 얻는 데 오일러는 백만 번이 넘게, RK4는 수십 번이면 됩니다(아래 메시지). 모델: h = 2⁻¹ … 2⁻¹³, 오차는 끝점에서 참 해와의 차이입니다.

개선 오일러(호인)와 중점법

기울기를 한 번 더 재면

오일러 방법은 구간의 왼쪽 끝 기울기만 씁니다. 해가 휘어 있으면 걸음 내내 그 기울기가 틀려 갑니다. 적분에서 왼쪽 직사각형 합보다 사다리꼴 공식이나 중점 공식이 훨씬 정확했던 것(CalculusBook 7장)과 같은 처방을 쓸 수 있지 않을까요?

미분방정식을 한 걸음 적분하면 y(tn+1)=y(tn)+∫tntn+1f(t,y(t)) dty(t_{n+1}) = y(t_n) + \int_{t_n}^{t_{n+1}} f(t, y(t))\,dt입니다. 오일러 방법은 이 적분을 왼쪽 직사각형으로 근사한 것입니다. 사다리꼴 공식을 쓰면 오른쪽 끝의 기울기 f(tn+1,yn+1)f(t_{n+1}, y_{n+1})이 필요한데, 그 yn+1y_{n+1}이 바로 지금 구하려는 값입니다. 해결책은 오일러로 먼저 어림해서(예측) 그 점의 기울기를 재고, 평균을 쓰는(수정) 것입니다.

정의 5.5 (호인 방법과 중점법)

개선 오일러(호인) 방법(Heun's method): 예측–수정 두 단계.

k1=f(tn,yn),k2=f(tn+h, yn+hk1),yn+1=yn+h2(k1+k2).k_1 = f(t_n, y_n),\quad k_2 = f(t_n + h,\ y_n + hk_1),\quad y_{n+1} = y_n + \frac{h}{2}(k_1 + k_2).

중점법(midpoint method): 반 걸음 가서 기울기를 잰 뒤 그 기울기로 처음부터 한 걸음.

k1=f(tn,yn),k2=f ⁣(tn+h2, yn+h2k1),yn+1=yn+hk2.k_1 = f(t_n, y_n),\quad k_2 = f\!\left(t_n + \tfrac{h}{2},\ y_n + \tfrac{h}{2}k_1\right),\quad y_{n+1} = y_n + hk_2.
둘 다 한 걸음에 ff를 두 번 계산하는 2단 룽게–쿠타 방법이다.
tₙtₙ + h ① 기울기 k₁로 예측 ② 예측점의 기울기 k₂ ③ 평균 (k₁ + k₂)/2로 다시 걷기 참 해 오른쪽 끝의 기울기는 더 가파르다 → 평균 기울기가 해의 할선에 가깝다 (적분의 사다리꼴 공식)
그림 5-2. 호인 방법. 오일러 걸음(빨강 점선)은 예측일 뿐이고, 그 끝점에서 잰 기울기 k2k_2와 처음 기울기 k1k_1의 평균으로 처음 점에서 다시 걷는다(청록). 아래로 볼록한 해에서 k1k_1은 너무 작고 k2k_2는 너무 크므로 평균이 오차를 상쇄한다.

왜 2차일까요? 참 해의 테일러 전개를 2차 항까지 쓰면 y(t+h)=y+hf+h22(ft+fyf)+O(h3)y(t + h) = y + hf + \frac{h^2}{2}(f_t + f_y f) + O(h^3)입니다(연쇄 법칙으로 y′′=ft+fyy′=ft+fyfy'' = f_t + f_y y' = f_t + f_y f). 한편 호인의 k2k_2를 전개하면 k2=f+h(ft+fyf)+O(h2)k_2 = f + h(f_t + f_y f) + O(h^2)이므로 y+h2(k1+k2)=y+hf+h22(ft+fyf)+O(h3)y + \frac{h}{2}(k_1 + k_2) = y + hf + \frac{h^2}{2}(f_t + f_y f) + O(h^3). 2차 항까지 정확히 일치합니다.

정리 5.6 (2단 방법의 2차 조건) yn+1=yn+h(b1k1+b2k2)y_{n+1} = y_n + h(b_1k_1 + b_2k_2), k2=f(tn+ch, yn+chk1)k_2 = f(t_n + ch,\ y_n + chk_1) 꼴의 방법이 2차일 필요충분조건은 b1+b2=1b_1 + b_2 = 1, b2c=12b_2c = \frac12이다. 호인은 b1=b2=12,c=1b_1 = b_2 = \frac12, c = 1, 중점법은 b1=0,b2=1,c=12b_1 = 0, b_2 = 1, c = \frac12이다. 국소 오차는 O(h3)O(h^3), 전역 오차는 O(h2)O(h^2)이다.
예제 5.2 (한 걸음 손계산) y′=t+yy' = t + y, y(0)=1y(0) = 1, h=0.1h = 0.1로 한 걸음을 세 방법으로 계산하고 참 해 y=2et−t−1y = 2e^t - t - 1과 비교하라.
  1. 참값: y(0.1)=2e0.1−1.1=1.1103418y(0.1) = 2e^{0.1} - 1.1 = 1.1103418.
  2. 오일러: k1=f(0,1)=1k_1 = f(0, 1) = 1, y1=1+0.1⋅1=1.1y_1 = 1 + 0.1\cdot 1 = 1.1. 오차 1.03×10−21.03\times10^{-2}.
  3. 호인: 예측점 (0.1, 1.1)(0.1,\ 1.1)에서 k2=0.1+1.1=1.2k_2 = 0.1 + 1.1 = 1.2. y1=1+0.05(1+1.2)=1.11y_1 = 1 + 0.05(1 + 1.2) = 1.11. 오차 3.4×10−43.4\times10^{-4}.
  4. 중점법: 반 걸음 점 (0.05, 1.05)(0.05,\ 1.05)에서 k2=1.1k_2 = 1.1. y1=1+0.1⋅1.1=1.11y_1 = 1 + 0.1\cdot 1.1 = 1.11. 오차 3.4×10−43.4\times10^{-4}.
  5. 계산 한 번을 더해 오차가 30분의 1이 되었다. (ff가 tt와 yy에 대해 1차식이라 두 2차 방법의 결과가 같아졌다. 비선형 ff에서는 서로 다르다.)

아래 시뮬레이터는 세 방법(그리고 다음 절의 RK4)을 같은 방향장 위에서 나란히 걷게 합니다. 출발점을 끌고 걸음 폭을 바꿔 보세요. 회색 굵은 선은 아주 작은 걸음으로 계산한 기준 해입니다.

SIMULATOR

세 방법 나란히: 오일러 · 호인 · 중점법 (+ RK4)

t = 0의 점을 위아래로 끌기
기준 해오일러호인중점법RK4
오일러 |오차| (t = 4)—
호인—
중점법—
RK4—
해볼 것: ① h = 0.5에서 오일러는 처음 구간에서 기준 해보다 크게 뒤처지지만 호인·중점법은 거의 붙어 갑니다. 출발점을 y = 2.5로 올리고 h = 1로 하면 오일러는 첫 걸음에 아래로 튀어 발산합니다. ② 'y′ = −4(y − sin 2t)'에서 h = 0.5로 하면 오일러가 위아래로 지그재그합니다. h·4 = 2가 경계라는 것을 6절에서 봅니다. ③ RK4를 켜고 h = 1로 키워도 꽤 맞는 것을 보세요. 괄호 안 숫자는 f 계산 횟수입니다. 모델: 기준 해는 h = 0.002의 RK4.

룽게–쿠타 4차: 기울기 네 개의 가중 평균

같은 생각을 더 밀고 나가면, 한 걸음 안에서 기울기를 네 번 재서 테일러 전개의 4차 항까지 맞출 수 있습니다. 이것이 공학 계산의 표준 도구인 룽게–쿠타 4차 방법(classical Runge–Kutta, RK4)입니다.

정의 5.7 (RK4)
k1=f(tn, yn),k2=f ⁣(tn+h2, yn+h2k1),k3=f ⁣(tn+h2, yn+h2k2),k4=f(tn+h, yn+hk3),\begin{aligned} k_1 &= f(t_n,\ y_n), & k_2 &= f\!\left(t_n + \tfrac{h}{2},\ y_n + \tfrac{h}{2}k_1\right),\\ k_3 &= f\!\left(t_n + \tfrac{h}{2},\ y_n + \tfrac{h}{2}k_2\right), & k_4 &= f(t_n + h,\ y_n + hk_3),\end{aligned} yn+1=yn+h6(k1+2k2+2k3+k4).y_{n+1} = y_n + \frac{h}{6}\left(k_1 + 2k_2 + 2k_3 + k_4\right).
k1k_1: 왼쪽 끝, k2k_2: k1k_1로 반 걸음 간 중점, k3k_3: k2k_2로 다시 반 걸음 간 중점, k4k_4: k3k_3로 한 걸음 간 오른쪽 끝의 기울기. 한 걸음에 ff를 네 번 계산한다.

가중치 1,2,2,11, 2, 2, 1(합 6)이 낯익습니다. ff가 tt에만 의존하면(y′=f(t)y' = f(t)) k2=k3=f(tn+h/2)k_2 = k_3 = f(t_n + h/2)이고 RK4는 h6(f(tn)+4f(tn+h2)+f(tn+h))\frac{h}{6}\bigl(f(t_n) + 4f(t_n + \frac h2) + f(t_n + h)\bigr), 바로 심프슨 공식입니다. 심프슨 공식이 4차인 것처럼 RK4도 4차입니다.

정리 5.8 (RK4는 4차) ff가 충분히 매끄러우면 RK4의 국소 절단 오차는 O(h5)O(h^5), 전역 오차는 O(h4)O(h^4)이다.

선형 방정식에서 확인. 일반적인 증명은 다변수 테일러 전개의 긴 계산이지만, y′=λyy' = \lambda y에서는 바로 보인다. z=hλz = h\lambda라 하면 hk1=zynhk_1 = zy_n, hk2=z(1+z2)ynhk_2 = z(1 + \frac z2)y_n, hk3=z(1+z2+z24)ynhk_3 = z(1 + \frac z2 + \frac{z^2}{4})y_n, hk4=z(1+z+z22+z34)ynhk_4 = z(1 + z + \frac{z^2}{2} + \frac{z^3}{4})y_n. 가중 평균을 정리하면 yn+1=(1+z+z22+z36+z424)yny_{n+1} = \left(1 + z + \frac{z^2}{2} + \frac{z^3}{6} + \frac{z^4}{24}\right)y_n이고, 이는 참 해의 한 걸음 인자 eze^z의 테일러 다항식 4차까지와 정확히 같다. 차이는 z5/120z^5/120부터다. ∎

예제 5.3 (RK4 한 걸음) 예제 5.2의 y′=t+yy' = t + y, y(0)=1y(0) = 1, h=0.1h = 0.1을 RK4로 한 걸음 계산하라.
  1. k1=f(0, 1)=1k_1 = f(0,\ 1) = 1.
  2. k2=f(0.05, 1+0.05⋅1)=0.05+1.05=1.1k_2 = f(0.05,\ 1 + 0.05\cdot 1) = 0.05 + 1.05 = 1.1.
  3. k3=f(0.05, 1+0.05⋅1.1)=0.05+1.055=1.105k_3 = f(0.05,\ 1 + 0.05\cdot 1.1) = 0.05 + 1.055 = 1.105.
  4. k4=f(0.1, 1+0.1⋅1.105)=0.1+1.1105=1.2105k_4 = f(0.1,\ 1 + 0.1\cdot 1.105) = 0.1 + 1.1105 = 1.2105.
  5. y1=1+0.16(1+2.2+2.21+1.2105)=1+0.16⋅6.6205=1.1103417y_1 = 1 + \frac{0.1}{6}(1 + 2.2 + 2.21 + 1.2105) = 1 + \frac{0.1}{6}\cdot 6.6205 = 1.1103417. 참값 1.11034181.1103418과의 오차는 1.7×10−71.7\times10^{-7}이다. 오일러보다 계산이 네 배지만 오차는 6만분의 1이다.
y′=t+yy' = t + y, y(1)y(1)의 오차h=0.1h = 0.1h=0.05h = 0.05비율log⁡2\log_2(비율)
오일러 (1차)2.49×10⁻¹1.30×10⁻¹1.920.94
호인 (2차)8.40×10⁻³2.18×10⁻³3.851.95
RK4 (4차)4.17×10⁻⁶2.72×10⁻⁷15.353.94

표의 마지막 열이 차수입니다. hh를 반으로 줄이면 RK4의 오차는 24=162^4 = 16분의 1이 됩니다. 아래 시뮬레이터에서 기울기 네 개가 어디서 재어지는지 단계별로 보세요.

SIMULATOR

RK4 한 걸음 해부: 기울기 네 개 k₁ … k₄

출발점 (tₙ, yₙ)을 끌기
보일 단계
참 해k₁k₂k₃k₄RK4 걸음
k₁, k₂, k₃, k₄—
가중 평균 (k₁+2k₂+2k₃+k₄)/6—
RK4 yₙ₊₁ / 참값—
오차 RK4 · 오일러—
해볼 것: ① 단계를 k₁ → k₄로 넘기며 시험점(작은 원)이 반 걸음, 반 걸음, 한 걸음 위치에 놓이는 것을 보세요. ② 'y′ = 1 + y²'에서 출발점을 y = 1 위로 올리고 h를 키우면 해가 곧 폭발(4장)하므로 k₄가 매우 커집니다. RK4도 이런 곳에서는 작은 h가 필요합니다. ③ h를 반으로 줄이면 RK4 오차가 약 16분의 1이 됩니다. 모델: 참 해는 h/200의 RK4.

연립 방정식과 고계 방정식에 적용하기

큰 각도로 흔들리는 진자의 주기

길이 LL인 진자의 각도는 θ′′=−gLsin⁡θ\theta'' = -\frac{g}{L}\sin\theta를 따릅니다. 작은 각도에서는 sin⁡θ≈θ\sin\theta \approx \theta로 단진동(7장)이 되어 주기가 2πL/g2\pi\sqrt{L/g}이지만, 90°에서 놓으면 얼마일까요? 이 방정식은 2계이고 비선형입니다. 지금까지의 방법은 1계 스칼라 방정식용이었습니다.

요령은 두 가지입니다. 첫째, 고계 방정식은 1계 연립으로 바꿉니다. 각도 θ\theta와 각속도 ω=θ′\omega = \theta'를 함께 상태로 보면 θ′=ω\theta' = \omega, ω′=−gLsin⁡θ\omega' = -\frac{g}{L}\sin\theta입니다. 일반적으로 y(m)=F(t,y,y′,…,y(m−1))y^{(m)} = F(t, y, y', \dots, y^{(m-1)})은 u=(y,y′,…,y(m−1))\mathbf{u} = (y, y', \dots, y^{(m-1)})로 두면 u′=f(t,u)\mathbf{u}' = \mathbf{f}(t, \mathbf{u}) 꼴의 1계 연립이 됩니다(11장에서 다시 씁니다). 둘째, 오일러·호인·RK4의 식은 그대로 벡터에 적용됩니다. yny_n을 벡터 un\mathbf{u}_n으로, ff를 벡터 함수로 읽기만 하면 됩니다.

2계 방정식 θ″ = −(g/L) sin θ 상태 벡터 u = (θ, ω) θ′ = ω ω′ = −(g/L) sin θ 한 걸음: uₙ₊₁ = uₙ + h·f(uₙ) (오일러) θω uₙ f(uₙ) = (ω, −(g/L) sin θ)
그림 5-3. 2계 방정식의 상태는 위치와 속도의 쌍이다. 위상 평면(θ\theta, ω\omega)의 각 점에 화살표 f\mathbf f가 붙은 벡터장이 되고, 수치 해법은 1계 스칼라 때와 똑같이 이 화살표를 따라 걷는다.
예제 5.4 (진자의 오일러 한 걸음과 RK4 주기) g/L=1g/L = 1, θ(0)=π/2\theta(0) = \pi/2, ω(0)=0\omega(0) = 0.
  1. 상태 u0=(1.5708, 0)\mathbf u_0 = (1.5708,\ 0), f(u0)=(0, −sin⁡1.5708)=(0, −1)\mathbf f(\mathbf u_0) = (0,\ -\sin 1.5708) = (0,\ -1).
  2. 오일러 h=0.1h = 0.1: u1=(1.5708, 0)+0.1(0, −1)=(1.5708, −0.1)\mathbf u_1 = (1.5708,\ 0) + 0.1(0,\ -1) = (1.5708,\ -0.1). 각도는 그대로이고 속도만 생겼다.
  3. RK4(h=0.001h = 0.001)로 θ\theta가 처음 0이 되는 시각을 찾아 4배 하면 주기 T=7.4163T = 7.4163. 작은 진동의 주기 2π=6.28322\pi = 6.2832의 1.1803배다.
  4. 이 값은 타원 적분으로 표현되는 정확한 주기 4K(sin⁡45°)4K(\sin 45°)와 소수 넷째 자리까지 일치한다. 수치 해법은 닫힌 꼴이 없거나 특수 함수가 필요한 답을 곧바로 준다.
진폭 θ₀10°30°60°90°120°150°170°
주기 / 2π√(L/g)1.00191.01741.07321.18031.37291.76222.4394

표는 RK4로 계산한 값입니다. 진폭 30°에서도 단진동 공식과 1.7%밖에 차이 나지 않으니 괘종시계의 작은 흔들림에는 단진동 근사가 충분하고, 180°에 가까워지면 진자가 꼭대기에서 오래 머물러 주기가 한없이 길어집니다. 위상 평면의 그림은 12장에서 다시 봅니다.

실무 메모 라이브러리 함수(solve_ivp, ode45)는 모두 1계 연립 u′=f(t,u)\mathbf u' = \mathbf f(t, \mathbf u) 꼴만 받습니다. 그래서 2계 방정식을 넘길 때는 항상 상태 벡터로 바꾸는 이 단계를 손으로 해야 합니다. 질량 mm, 감쇠 cc, 강성 kk인 용수철이라면 f(t,(x,v))=(v, (F(t)−cv−kx)/m)\mathbf f(t, (x, v)) = \bigl(v,\ (F(t) - cv - kx)/m\bigr)입니다.

적응 간격: 걸음 폭을 스스로 고르기

혜성은 태양 근처에서만 빠르다

이심률이 큰 타원 궤도를 도는 혜성은 태양에서 멀 때는 느릿느릿 움직이다가 근일점을 순식간에 지나갑니다. 고정된 hh를 쓰면 근일점에 맞춰 hh를 아주 작게 해야 하는데, 그러면 궤도 대부분에서 걸음을 낭비합니다. 어려운 곳에서만 촘촘히 걸을 수는 없을까요?

걸음 폭을 고르려면 지금 걸음의 오차를 알아야 하는데, 참 해를 모르니 오차를 직접 잴 수는 없습니다. 대신 차수가 다른 두 방법으로 같은 걸음을 계산해 그 차이를 오차의 추정값으로 씁니다. 차수가 높은 쪽이 훨씬 정확하므로 차이는 거의 낮은 쪽의 오차입니다.

정의 5.9 (내장 쌍과 걸음 폭 조절) 같은 기울기 k1,…,ksk_1, \dots, k_s를 다른 가중치로 조합해 pp차 근사 yn+1y_{n+1}과 p+1p + 1차 근사 y^n+1\hat y_{n+1}을 함께 만드는 룽게–쿠타 공식을 내장 쌍(embedded pair)이라 한다. 오차 추정 err=∣y^n+1−yn+1∣\mathrm{err} = |\hat y_{n+1} - y_{n+1}|를 허용 오차 tol\mathrm{tol}과 비교해
  • err≤tol\mathrm{err} \le \mathrm{tol}이면 걸음을 받아들이고(정확한 쪽 y^\hat y를 쓴다),
  • 그렇지 않으면 버리고 더 작은 hh로 다시 시도한다.
  • 어느 경우든 다음 걸음 폭은 hnew=0.9 h (tol/err)1/(p+1)h_{\text{new}} = 0.9\,h\,(\mathrm{tol}/\mathrm{err})^{1/(p+1)}로 정한다.

마지막 식의 뜻은 간단합니다. 국소 오차가 Chp+1Ch^{p+1}에 비례하므로, 오차를 tol\mathrm{tol}로 맞추려면 hh에 (tol/err)1/(p+1)(\mathrm{tol}/\mathrm{err})^{1/(p+1)}을 곱하면 됩니다. 0.9는 다음 걸음이 다시 버려지지 않도록 두는 안전 계수입니다. 실무의 표준은 6단 공식 안에 4차와 5차 근사를 함께 담은 RK45 계열이며, ode45와 solve_ivp의 기본값인 도르만드–프린스 쌍(Dormand–Prince)도 그중 하나입니다.

h로 한 걸음4차 y, 5차 ŷ err = |ŷ − y|오차 추정 err ≤ tol: 채택 err > tol: 버림 h ← 0.9h·(tol/err)^⅕ 다음 시도 (채택이면 t ← t + h)
그림 5-4. 적응 간격 제어. 오차 추정이 허용 오차보다 작으면 걸음을 채택하고 더 크게, 크면 버리고 더 작게 다시 걷는다. 사용자는 hh 대신 원하는 정확도 tol\mathrm{tol}을 준다.
SIMULATOR

적응 간격 점 찍기: 혜성 궤도의 도르만드–프린스 RK45

궤도 위 채택된 걸음 (색 = 걸음 폭)
걸음 폭 h(t), 로그 눈금
채택 / 버린 걸음—
최소 h · 최대 h—
한 바퀴 뒤 위치 오차—
같은 오차의 고정 RK4—
해볼 것: ① e = 0(원 궤도)에서는 점이 고르게 찍히고 h가 거의 일정합니다. ② e를 0.9로 키우면 근일점(오른쪽, 태양 근처)에서 점이 빽빽해지고 h가 수백 배 작아집니다. ③ tol을 100배 줄이면 걸음 수는 약 1001/5 ≈ 2.5배만 늘어납니다. 모델: 중력 상수 1, 장반경 1(주기 2π), 근일점에서 출발. 오차 척도는 tol·(1 + |y|), 처음 h = 0.01. 고정 RK4 걸음 수는 두 배씩 늘려 찾은 값입니다.

시뮬레이터에서 이심률을 0.9, tol을 10⁻⁶으로 두면 적응 방법은 한 바퀴에 54걸음을 채택하고(24번 버림) 위치 오차 약 9×10−49\times10^{-4}으로 돌아옵니다. 고정 간격 RK4로 같은 오차를 얻으려면 걸음 수를 두 배씩 늘려 찾았을 때 3200걸음이 필요합니다. 걸음 폭은 근일점 근처의 10⁻³ 수준부터 원일점 근처의 0.5 가까이까지 수백 배 바뀝니다. 적응 간격이 hh를 고르는 일을 사용자에게서 덜어 줄 뿐 아니라 계산량도 몇 분의 1로 줄인 것입니다.

안정성 영역과 강성, 음적 오일러

정확도는 충분한데 해가 터진다

회로에 아주 빨리 사라지는 과도 성분(시상수 1 μs)과 천천히 변하는 신호(주기 1 ms)가 함께 있습니다. 우리가 보고 싶은 것은 느린 신호뿐이라 h=10h = 10 μs면 충분해 보입니다. 그런데 오일러 방법으로 돌리면 몇 걸음 만에 값이 103010^{30}으로 튑니다. 이미 사라진 빠른 성분이 왜 계산을 망칠까요?

이 현상을 이해하는 열쇠는 가장 단순한 방정식, 시험 방정식 y′=λyy' = \lambda y입니다. λ\lambda는 복소수일 수도 있습니다(진동하는 성분). 실수부가 음수면 참 해 eλte^{\lambda t}는 0으로 줄어듭니다. 수치 해도 줄어드는가가 질문입니다. 앞 절의 계산처럼 어떤 룽게–쿠타 방법도 이 방정식에서는 yn+1=R(z) yny_{n+1} = R(z)\,y_n, z=hλz = h\lambda 꼴이 됩니다.

정의 5.10 (안정성 함수와 절대 안정 영역) 시험 방정식에 적용한 한 걸음 인자 R(z)R(z)를 그 방법의 안정성 함수(stability function), 복소평면에서 ∣R(z)∣≤1|R(z)| \le 1인 z=hλz = h\lambda의 집합을 절대 안정 영역(region of absolute stability)이라 한다.
R오일러=1+z,R호인=1+z+z22,RRK4=1+z+z22+z36+z424,R음적 오일러=11−z.R_{\text{오일러}} = 1 + z,\quad R_{\text{호인}} = 1 + z + \tfrac{z^2}{2},\quad R_{\text{RK4}} = 1 + z + \tfrac{z^2}{2} + \tfrac{z^3}{6} + \tfrac{z^4}{24},\quad R_{\text{음적 오일러}} = \frac{1}{1 - z}.
정리 5.11 (오일러 방법의 안정 조건) 오일러 방법의 절대 안정 영역은 −1-1을 중심으로 하는 반지름 1인 원판 ∣1+z∣≤1|1 + z| \le 1이다. 특히 λ<0\lambda \lt 0인 실수이면 수치 해가 줄어들 조건은
h≤2∣λ∣h \le \frac{2}{|\lambda|}
이고, h>2/∣λ∣h > 2/|\lambda|이면 ∣yn∣=∣1+hλ∣n∣y0∣|y_n| = |1 + h\lambda|^n|y_0|가 부호를 바꾸며 지수적으로 커진다. 순허수 λ=iω\lambda = i\omega(감쇠 없는 진동)에서는 어떤 h>0h > 0도 ∣1+ihω∣>1|1 + i h\omega| > 1이라 진폭이 항상 커진다.

RK4의 영역은 더 넓어서 실수축에서는 −2.785≤z≤0-2.785 \le z \le 0, 허수축에서는 ∣z∣≤22≈2.83|z| \le 2\sqrt2 \approx 2.83까지 안정합니다. 그래도 크기가 유한하다는 점은 같습니다. 명시적 방법(다음 값을 이미 아는 값으로만 계산하는 방법)의 R(z)R(z)는 다항식이고, 다항식은 ∣z∣→∞|z| \to \infty에서 커지므로 영역은 언제나 유한합니다.

SIMULATOR

안정성 영역 지도: z = hλ를 끌어 보기

복소평면 z = hλ: 칠한 곳이 |R(z)| ≤ 1
Re yₙ = Re R(z)ⁿ (점) vs 참 해 Re e^(zn) (선)
방법
z = hλ—
|R(z)|—
참 해 인자 |ez|—
판정—
해볼 것: ① 오일러에서 z = −2.5로 두면 참 해는 줄어드는데 수치 해는 부호를 바꾸며 커집니다. 호인으로 바꿔도 불안정, RK4는 안정합니다(경계 −2.785). ② z = 1.5i(감쇠 없는 진동)에서 오일러·호인은 진폭이 커지고, RK4는 거의 유지, 음적 오일러는 줄어듭니다. ③ 음적 오일러는 왼쪽 반평면 전체가 칠해져 있습니다. 모델: y₀ = 1, n = 0 … 30.

이제 문제 상자의 회로를 이해할 수 있습니다. 다음 방정식은 해가 cos⁡t\cos t를 따라가는 느린 성분과 e−λte^{-\lambda t}로 사라지는 빠른 과도 성분을 함께 가집니다.

y′=−λ (y−cos⁡t)−sin⁡t,y(0)=0⟹y(t)=cos⁡t−e−λt.y' = -\lambda\,(y - \cos t) - \sin t,\quad y(0) = 0 \quad\Longrightarrow\quad y(t) = \cos t - e^{-\lambda t}.
대입 확인: y′=−sin⁡t+λe−λty' = -\sin t + \lambda e^{-\lambda t}이고 −λ(y−cos⁡t)−sin⁡t=λe−λt−sin⁡t-\lambda(y - \cos t) - \sin t = \lambda e^{-\lambda t} - \sin t. 같다.

λ=50\lambda = 50이면 과도 성분은 t=0.1t = 0.1 무렵 이미 e−5≈0.007e^{-5} \approx 0.007로 사라지고, 그 뒤의 해는 cos⁡t\cos t처럼 매끄럽습니다. 정확도만 보면 h=0.1h = 0.1이면 충분합니다. 그러나 오일러 방법의 오차는 매 걸음 1−hλ=−41 - h\lambda = -4배로 증폭되므로 h≤2/50=0.04h \le 2/50 = 0.04를 지켜야 합니다. 해의 모양이 아니라 이미 사라진 성분의 빠르기가 걸음 폭을 묶는 것, 이것이 강성입니다.

정의 5.12 (강성) 해의 관심 있는 부분은 천천히 변하는데, 방정식(의 야코비안)에 실수부가 크게 음수인 고유값이 있어서 명시적 방법의 걸음 폭이 정확도가 아니라 안정성 때문에 제한되는 문제를 강성(stiff) 문제라 한다. 시상수의 비가 클수록(예: 1 μs와 1 ms) 강성이 심하다.

처방은 오른쪽 끝의 기울기를 쓰는 것입니다. yn+1=yn+hf(tn+1,yn+1)y_{n+1} = y_n + hf(t_{n+1}, y_{n+1})은 구하려는 yn+1y_{n+1}이 양변에 있는 방정식이라 매 걸음 그것을 풀어야 합니다(선형이면 나눗셈 한 번, 비선형이면 뉴턴 반복). 대신 시험 방정식에서 yn+1=yn+hλyn+1y_{n+1} = y_n + hλy_{n+1}, 곧 R(z)=1/(1−z)R(z) = 1/(1 - z)이고, Re⁡z<0\operatorname{Re}z \lt 0이면 ∣1−z∣>1|1 - z| > 1이라 언제나 ∣R∣<1|R| \lt 1입니다.

정리 5.13 (음적 오일러는 A-안정) 음적 오일러 방법(backward Euler) yn+1=yn+hf(tn+1,yn+1)y_{n+1} = y_n + h f(t_{n+1}, y_{n+1})의 절대 안정 영역은 왼쪽 반평면 Re⁡z≤0\operatorname{Re} z \le 0을 모두 포함한다. 이런 방법을 A-안정(A-stable)이라 한다. 따라서 감쇠하는 성분이 아무리 빨라도 hh는 정확도만으로 고를 수 있다. 정확도는 오일러와 같은 1차다.
예제 5.5 (강성 방정식, λ = 50) 위 방정식을 t=2t = 2까지 풀어 참값 y(2)=cos⁡2−e−100=−0.41615y(2) = \cos 2 - e^{-100} = -0.41615와 비교하라.
  1. 음적 오일러를 선형 방정식에 쓰면 yn+1=yn+h(−λ(yn+1−cos⁡tn+1)−sin⁡tn+1)y_{n+1} = y_n + h\bigl(-\lambda(y_{n+1} - \cos t_{n+1}) - \sin t_{n+1}\bigr)를 yn+1y_{n+1}에 대해 풀어 yn+1=yn+h(λcos⁡tn+1−sin⁡tn+1)1+hλy_{n+1} = \dfrac{y_n + h(\lambda\cos t_{n+1} - \sin t_{n+1})}{1 + h\lambda}.
  2. 오일러 h=0.03h = 0.03 (hλ=1.5h\lambda = 1.5): y(2)≈−0.4253y(2) \approx -0.4253. 안정하다.
  3. 오일러 h=0.041h = 0.041 (hλ=2.05h\lambda = 2.05): y(2)≈10.5y(2) \approx 10.5. 경계를 조금 넘자 오차가 걸음마다 1.05배씩 자랐다.
  4. 오일러 h=0.05h = 0.05 (hλ=2.5h\lambda = 2.5): y(2)≈−1.1×107y(2) \approx -1.1\times10^{7}. 증폭률 1.5의 40제곱이다.
  5. 음적 오일러 h=0.1h = 0.1 (hλ=5h\lambda = 5): y(2)≈−0.4158y(2) \approx -0.4158. 걸음 20번으로 소수 셋째 자리까지 맞다. λ=1000\lambda = 1000으로 바꿔도 h=0.1h = 0.1에서 −0.41613-0.41613이다.
SIMULATOR

강성 방정식: 명시적 오일러의 폭발 vs 음적 오일러

참 해 cos t − e−λt명시적 오일러음적 오일러RK4
hλ—
증폭률 |1 − hλ| · 1/(1 + hλ)—
최대 오차 (t ≥ 0.5) 명시적—
음적—
해볼 것: ① λ = 50에서 h를 0.03 → 0.04 → 0.05로 올리며 hλ = 2를 넘는 순간 명시적 오일러가 지그재그로 터지는 것을 보세요. ② λ를 1000으로 올리면 명시적 오일러는 h = 0.002 이하가 필요하지만, 음적 오일러는 h = 0.2에서도 cos t를 따라갑니다. ③ RK4를 켜면 경계가 hλ ≈ 2.79로 조금 늘 뿐입니다. 모델: y(0) = 0, t ∈ [0, 3]. 화면 밖으로 나간 값은 잘립니다.

회로 시뮬레이터 SPICE가 사다리꼴 공식이나 후방 차분 공식(BDF) 같은 음적 방법을 쓰는 것, MATLAB이 강성 문제용으로 ode15s를 따로 두는 것이 이 때문입니다. 화학 반응(빠른 반응과 느린 반응이 섞인 계), 열 방정식을 격자로 나눈 연립 방정식(16장의 r≤1/2r \le 1/2 조건)도 대표적인 강성 문제입니다.

에너지 보존: 심플렉틱 오일러와 궤도 계산

행성이 태양에서 멀어진다

원 궤도를 도는 행성을 오일러 방법으로 h=0.05h = 0.05(한 바퀴에 약 126걸음)로 계산하면 열 바퀴 뒤 궤도 반지름이 1에서 3.09로 커집니다. 걸음을 줄이면 늦출 수는 있지만, 오래 돌리면 결국 행성은 날아가 버립니다. 물리 법칙은 에너지를 보존하는데 왜 수치 해는 그러지 않을까요?

용수철 x′′=−xx'' = -x(위상 평면의 원 운동)에서 정확히 계산해 볼 수 있습니다. 오일러 방법은 xn+1=xn+hvnx_{n+1} = x_n + hv_n, vn+1=vn−hxnv_{n+1} = v_n - hx_n이고, 에너지 x2+v2x^2 + v^2를 계산하면

xn+12+vn+12=(xn+hvn)2+(vn−hxn)2=(1+h2) (xn2+vn2).x_{n+1}^2 + v_{n+1}^2 = (x_n + hv_n)^2 + (v_n - hx_n)^2 = (1 + h^2)\,(x_n^2 + v_n^2).
교차항 2hxnvn2hx_nv_n이 서로 지워진다. 매 걸음 에너지가 정확히 1+h21 + h^2배가 된다. 정리 5.11의 순허수 경우 ∣1+ih∣2=1+h2|1 + ih|^2 = 1 + h^2와 같은 이야기다.

h=0.1h = 0.1로 100걸음(t=10t = 10, 1.6바퀴)이면 1.01100=2.701.01^{100} = 2.70배, 에너지가 거의 세 배가 됩니다. 이제 아주 작은 수정을 해 봅시다. 속도를 먼저 갱신하고, 새 속도로 위치를 갱신합니다.

정의 5.14 (심플렉틱 오일러) x′′=a(x)x'' = a(x)(가속도가 위치에만 의존)에 대해
vn+1=vn+h a(xn),xn+1=xn+h vn+1v_{n+1} = v_n + h\,a(x_n),\qquad x_{n+1} = x_n + h\,v_{n+1}
로 걷는 방법을 심플렉틱 오일러(symplectic Euler) 또는 반음적 오일러라 한다. 계산량은 오일러와 똑같고 차수도 1차다.

x′′=−xx'' = -x에서 한 걸음은 행렬 [xn+1vn+1]=[1−h2h−h1][xnvn]\begin{bmatrix}x_{n+1}\\v_{n+1}\end{bmatrix} = \begin{bmatrix}1 - h^2 & h\\ -h & 1\end{bmatrix}\begin{bmatrix}x_n\\v_n\end{bmatrix}이고 행렬식은 (1−h2)+h2=1(1 - h^2) + h^2 = 1입니다. 오일러 행렬 [1h−h1]\begin{bmatrix}1 & h\\ -h & 1\end{bmatrix}의 행렬식은 1+h21 + h^2입니다. 행렬식이 1이라는 것은 위상 평면의 넓이를 보존한다는 뜻이고(LinearBook: 행렬식), 이것이 2차원에서 "심플렉틱"의 의미입니다. 참 해의 흐름도 넓이를 보존하는데(해밀턴 계의 리우빌 정리), 오일러는 이 성질을 깨고 심플렉틱 오일러는 지킵니다.

정리 5.15 (심플렉틱 오일러의 보존량) x′′=−xx'' = -x에 심플렉틱 오일러를 쓰면 ∣h∣<2|h| \lt 2일 때 수정된 에너지
E~=xn2+vn2−h xnvn\tilde E = x_n^2 + v_n^2 - h\,x_nv_n
가 모든 nn에서 정확히 일정하다. 따라서 참 에너지 x2+v2x^2 + v^2는 hh에 비례하는 폭으로 진동할 뿐 한 방향으로 새지 않는다.

확인. x′=(1−h2)x+hvx' = (1 - h^2)x + hv, v′=−hx+vv' = -hx + v를 x′2+v′2−hx′v′x'^2 + v'^2 - hx'v'에 넣어 전개하면 x2x^2의 계수는 (1−h2)2+h2+h(1−h2)h=1(1 - h^2)^2 + h^2 + h(1 - h^2)h = 1, v2v^2의 계수는 h2+1−h2=1h^2 + 1 - h^2 = 1, xvxv의 계수는 2h(1−h2)−2h−h(1−h2)+h3=−h2h(1 - h^2) - 2h - h(1 - h^2) + h^3 = -h이다. ∎

RK4는 어떨까요? 정확도가 높아 에너지 오차가 매우 작지만 심플렉틱은 아닙니다. x′′=−xx'' = -x에서 ∣R(ih)∣2=1−h6/72+h8/576|R(ih)|^2 = 1 - h^6/72 + h^8/576이라 에너지가 매 걸음 아주 조금씩 줄어듭니다(h=0.1h = 0.1이면 걸음당 1.4×10−81.4\times10^{-8}). 짧은 계산에서는 RK4가 압도적으로 낫지만, 수억 걸음을 도는 태양계 장기 적분이나 분자 동역학에서는 이 꾸준한 표류가 문제가 되어 심플렉틱 방법(속도 베를레 등)을 씁니다. 게임 물리 엔진이 흔히 반음적 오일러를 쓰는 것도 같은 이유입니다.

SIMULATOR

행성 궤도의 에너지 표류: 오일러 vs 심플렉틱 오일러 vs RK4

궤도 (태양 = 원점, GM = 1)
에너지 E(t) = v²/2 − 1/r
에너지 축
오일러심플렉틱 오일러RK4참 궤도 / 처음 에너지
시간 (바퀴 수)—
ΔE/|E₀| 오일러—
심플렉틱—
RK4—
해볼 것: ① ▶로 돌리면 오일러 궤도는 바깥으로 나선을 그리며 에너지가 0(탈출)을 향해 오릅니다. ② 심플렉틱 오일러는 궤도가 조금 기울어진 타원으로 돌아가지만(세차) 에너지는 띠 안에서만 오르내립니다. '확대'로 보세요. ③ h = 0.2로 키우면 RK4의 에너지가 서서히 한쪽으로 미끄러지는 것이 보입니다. 같은 h에서 심플렉틱 오일러는 오르내릴 뿐입니다. 모델: 2체 문제 x″ = −x/r³, 처음 위치 (1, 0), 속도 (0, v₀).

이 도구가 쓰이는 곳

교과서의 방정식은 대부분 손으로 풀리지만, 실제 공학의 방정식은 대부분 수치로만 풀립니다. 그래서 어떤 방법이 어떤 문제에 맞는지 고르는 눈이 중요합니다.

문제의 성격알맞은 방법대표 도구
매끄럽고 강성이 없는 일반 문제적응 간격 RK45ode45, solve_ivp(method="RK45")
강성(회로, 화학 반응, 격자로 나눈 열 방정식)음적 방법(BDF, 사다리꼴), 뉴턴 반복SPICE, ode15s, solve_ivp(method="BDF")
오래 도는 보존계(궤도, 분자 동역학, 게임 물리)심플렉틱(속도 베를레, 반음적 오일러)N체 적분기, 분자 동역학 패키지, 물리 엔진
실시간 제어·임베디드(고정 주기)고정 간격 RK4 또는 오일러마이크로컨트롤러의 상태 추정 루프

핵심 정리

  1. 오일러 방법 yn+1=yn+hf(tn,yn)y_{n+1} = y_n + hf(t_n, y_n)은 테일러 전개를 1차에서 자른 것이다. 국소 절단 오차는 O(h2)O(h^2), 걸음 1/h1/h개가 쌓인 전역 오차는 O(h)O(h)이고, 상한에 eL(t−t0)e^{L(t - t_0)} 인자가 붙는다.
  2. 전역 오차가 ChpCh^p이면 p차 방법이다. 오차–간격 로그–로그 그래프의 기울기가 p이고, log⁡2(Eh/Eh/2)\log_2(E_h/E_{h/2})로 추정한다. 너무 작은 h에서는 반올림 오차의 바닥이 나타난다.
  3. 호인(예측–수정, 사다리꼴)과 중점법은 기울기 두 개로 2차, RK4는 기울기 네 개 (k1+2k2+2k3+k4)/6(k_1 + 2k_2 + 2k_3 + k_4)/6로 4차다. y′=f(t)y' = f(t)이면 RK4는 심프슨 공식이다.
  4. 고계 방정식은 상태 벡터 (y,y′,… )(y, y', \dots)의 1계 연립으로 바꾸면 같은 공식이 벡터에 그대로 적용된다.
  5. 적응 간격은 내장 쌍(4차·5차)의 차이로 국소 오차를 추정하고 h←0.9h(tol/err)1/5h \leftarrow 0.9h(\mathrm{tol}/\mathrm{err})^{1/5}로 걸음을 조절한다. 어려운 구간에서만 촘촘히 걷는다.
  6. 시험 방정식 y′=λyy' = \lambda y에서 yn+1=R(hλ)yny_{n+1} = R(h\lambda)y_n. 오일러는 ∣1+hλ∣≤1|1 + h\lambda| \le 1, 실수 λ<0\lambda \lt 0이면 h≤2/∣λ∣h \le 2/|\lambda|. 명시적 방법의 안정 영역은 유한하다.
  7. 강성 문제는 사라진 빠른 성분이 걸음 폭을 묶는 문제다. 음적 오일러 R=1/(1−z)R = 1/(1 - z)는 A-안정이라 h를 정확도만으로 고를 수 있다.
  8. 오일러는 용수철의 에너지를 매 걸음 1+h21 + h^2배로 키운다. 심플렉틱 오일러는 위상 평면의 넓이를 보존하고 수정된 에너지를 정확히 지켜, 장기 궤도 계산에서 에너지가 새지 않는다.

확인 퀴즈

Q1. 오일러 방법으로 h=0.02h = 0.02일 때 y(1)y(1)의 오차가 0.0080.008이었다. h=0.005h = 0.005로 줄이면 오차는 대략?

오일러는 1차라 전역 오차가 h에 비례한다. h가 1/4이 되면 오차도 약 1/4, 0.008/4 = 0.002. 0.0005는 2차 방법(1/16)일 때의 답이다.

Q2. 어떤 방법의 오차를 로그–로그 그래프에 그렸더니 h=0.1h = 0.1에서 3.2×10−53.2\times10^{-5}, h=0.05h = 0.05에서 2.0×10−62.0\times10^{-6}이었다. 이 방법의 차수는?

비율 3.2×10⁻⁵ / 2.0×10⁻⁶ = 16 = 2⁴. h를 반으로 줄여 오차가 16분의 1이 되었으므로 4차다. RK4가 이렇게 행동한다.

Q3. y′=2yy' = 2y, y(0)=1y(0) = 1에 호인 방법을 h=0.5h = 0.5로 한 걸음 쓰면 y1y_1은?

k1=2k_1 = 2, 예측점 y=1+0.5⋅2=2y = 1 + 0.5\cdot 2 = 2에서 k2=4k_2 = 4. y1=1+0.25(2+4)=2.5y_1 = 1 + 0.25(2 + 4) = 2.5. R(z)=1+z+z2/2R(z) = 1 + z + z^2/2에 z=1z = 1을 넣은 값과 같다. 참값은 e1=2.718e^1 = 2.718.

Q4. RK4가 y′=f(t)y' = f(t)(우변이 yy에 무관)에 적용되면 어떤 적분 공식과 같아지는가?

k2=k3=f(tn+h/2)k_2 = k_3 = f(t_n + h/2)이므로 h6(fn+4fn+1/2+fn+1)\frac h6(f_n + 4f_{n+1/2} + f_{n+1}), 심프슨 공식이다. 호인은 사다리꼴, 중점법은 중점 공식, 오일러는 왼쪽 직사각형에 대응한다.

Q5. y′=−200yy' = -200y를 명시적 오일러로 안정하게 풀 수 있는 가장 큰 걸음 폭은?

∣1+hλ∣≤1|1 + h\lambda| \le 1, λ=−200\lambda = -200이면 0≤200h≤20 \le 200h \le 2, 곧 h≤0.01h \le 0.01. h = 0.005는 진동 없이 줄어드는 조건 hλ≥−1h\lambda \ge -1이다. 음적 오일러를 쓰면 제한이 없다.

Q6. 강성 문제에 대한 설명으로 옳은 것은?

강성은 정확도 때문이 아니라 안정성 때문에 h가 작아야 하는 상황이다. 해 자체는 매끄러운데, 큰 음의 고유값이 명시적 방법의 안정 영역 밖으로 hλ를 밀어낸다. 처방은 음적(A-안정) 방법이다.

Q7. x′′=−xx'' = -x를 오일러 방법 h=0.2h = 0.2로 50걸음 계산하면 에너지 x2+v2x^2 + v^2는 처음의 몇 배가 되는가?

매 걸음 정확히 1+h2=1.041 + h^2 = 1.04배가 된다. 1.0450=7.111.04^{50} = 7.11. 심플렉틱 오일러를 쓰면 x2+v2−hxvx^2 + v^2 - hxv가 정확히 보존되어 에너지는 일정한 띠 안에 머문다.

Q8. 적응 간격 4(5)차 쌍에서 오차 추정이 허용 오차의 32배였다. 안전 계수를 빼면 다음 시도의 걸음 폭은 지금의 몇 배인가?

국소 오차가 h5h^5에 비례하므로 hnew=h(tol/err)1/5=h⋅(1/32)1/5=h/2h_{\text{new}} = h(\mathrm{tol}/\mathrm{err})^{1/5} = h\cdot(1/32)^{1/5} = h/2. 오차가 32배 크면 걸음을 반으로 줄이면 된다. 이 걸음은 버리고 다시 계산한다.