이번 포스팅에서는 룽게-쿠타법에 대해 알아보도록 합시다.
(부르기에 따라 런지-쿠타, 룽게-쿠타 등 여러 발음으로 불리기도 하나,
본 포스팅에서는 룽게-쿠타로 표기하겠습니다.)
룽게-쿠타법 (Runge-Kutta method)
룽게-쿠타법은 많은 수치적분법 중 한가지 방법입니다.
독일의 수학자 카를 다비트 톨메 룽게와 마르틴 빌헬름 쿠타가 개발하였고
흔히 4차항까지 구하여 사용하는 방법을 많이 쓰며,
이 방법은 RK4라고도 불립니다. 수치적분법 중 가장 흔히 사용되는 방법입니다.
식으로는 아래와 같이 나타낼 수 있습니다.
yi+1=yi+16(k1+2k2+2k3+k4)h
여기서 k는 아래와 같습니다.
k1=f(ti,yi)
k2=f(ti+12h,yi+12k1h)
k3=f(ti+12h,yi+12k2h)
k2=f(ti+h,yi+k3h)
유도(Derivation)
Taylor series로부터 i+1시점의 함수값 y는 아래와 같이 나타낼 수 있습니다.
yi+1=yi+dydt(ti+1−ti)+12!d2ydt2(ti+1−ti)2
+13!d3ydt3(ti+1−ti)3+14!d4ydt4(ti+1−ti)4+O(ti+1−ti)n
여기서 O(ti+1−ti)n은 nth error term이며,
만약 이 error가 충분히 작아 무시가능하다면 함수값 y는 아래와 같이 쓸 수 있습니다.
yi+1≃yi+f(ti,yi)h+12!f′(ti,yi)h2+13!f″(ti,yi)h3+14!f‴(ti,yi)h3
그리고 RK4의 기본 형태인 아래와 같이 표현할 때
yi+1=yi+(a1k1+a2k2+a3k3+a4k4)h
kn는 위에서 언급한것과 같이 아래와 같습니다.
k1=f(ti,yi)
k2=f(ti+12h,yi+12k1h)
k3=f(ti+12h,yi+12k2h)
k2=f(ti+h,yi+k3h)
이건 RK4의 정의이기 때문에 왜이렇게 나오느냐? 라고 물어도 할 말이 없습니다.
위 공식을 통해 RK4의 컨셉을 말씀드리자면,
dt=0,dt=h/2,dt=h 세 지점의 기울기 평균을 통해
다음 step의 값을 계산해내는 concept라고 생각하시면 되겠습니다!

이 때, RK4의 기본형태에서 Taylor series와의 계수비교를 통해
a1 ~ a4를 확정할 수 있는데요.
전개가 꽤 복잡하니 천천히 따라오세요!
k1=f(ti,yi)
k2=f(ti+12h,yi+12k1h)=f(ti,yi)+h2ddtf(ti,yi)
k3=f(ti+12h,yi+12k2h)=f(ti,yi)+h2ddt[f(ti,yi)+h2ddtf(ti,yi)]
k4=f(ti+h,yi+k3h)=f(ti,yi)+hddt[f(ti,yi)+h2ddt[f(ti,yi)+h2ddtf(ti,yi)]]
yi+1=yi+(a1k1+a2k2+a3k3+a4k4)h
yi+1=yi+[a1f(ti,yi)+a2{f(ti,yi)+h2ddtf(ti,yi)}]h
+[a3{f(ti,yi)+h2ddt[f(ti,yi)+h2ddtf(ti,yi)]}]h
+[a4{f(ti,yi)+hddt[f(ti,yi)+h2ddt[f(ti,yi)+h2ddtf(ti,yi)]]}]h
=yi+(a1+a2+a3+a4)f(ti,yi)h+(12a2+12a3+a4)f′(ti,yi)h2
+(14a3+12a4)f″(ti,yi)h3+14a4f‴(ti,yi)h4
여기서 앞서 Taylor series에서 유도된 식을 이용하여 계수비교 합니다.
즉,
yi+1=yi+f(ti,yi)h+12!f′(ti,yi)h2+13!f″(ti,yi)h3+14!f‴(ti,yi)h4
식 (1)과 식 (2)에서 각 hn의 계수는 같아야 합니다.
식이 4개, 미지수가 4개이므로 우리는 여기서 a1~a4를 확정할 수 있습니다.
결과적으로 아래와 같이 나오며,
a1=16,a2=13,a3=13,a4=16
따라서 RK4의 일반화된 형태는 아래와 같습니다.
yi+1=yi+16(k1+2k2+2k3+k4)h
예제 (MATLAB)
간단한 미분방정식을 통해 룽게-쿠타법을 연습해봅시다.
y′+2y−3e−4t=0
위의 1차 미분방정식을 풀어보도록 하죠.
참고로 exact solution은 아래와 같습니다.
y(t)=2.5e−2t−1.5e−4t
룽게-쿠타법으로 근사해를 구한 결과와 정해를 서로 비교해볼겁니다.
우선 룽게-쿠타법을 위해 도함수를 구해보죠.
도함수는 미분방정식에서 두개 항을 이항하면 간단히 구할 수 있습니다.
f(t,y)=y′=3e−4t−2y
매트랩을 이용해 적분해봅시다!

exact solution의 결과와 거의 오차없이 유사한 모습을 확인할 수 있습니다.
사용한 코드는 아래에 있습니다.
※ 미분방정식 함수
function dY = ODE_example(t,Y)
y = Y(1);
dY = 3*exp(-4*t)-2*y;
end
※ main script
clc; clear all; close all force;
%%
Y0 = 1;
%%
t_start = 0;
dt = 0.001;
t_end = 5;
n = t_end/dt+1;
Y = Y0;
Y_data = zeros(1,n);
t_data = zeros(1,n);
% exact solution
fn_y = @(t) 2.5*exp(-2*t) - 1.5*exp(-4*t);
exact_solution = zeros(1,n);
for i = 1 : n
t = t_start + (i-1)*dt;
K1 = ODE_example(t,Y);
K2 = ODE_example(t+dt*0.5,Y+0.5*dt*K1);
K3 = ODE_example(t+dt*0.5,Y+0.5*dt*K2);
K4 = ODE_example(t+dt,Y+dt*K3);
Y = Y + dt*(K1 + 2*K2 + 2*K3 + K4)/6;
Y_data(:,i) = Y;
t_data(:,i) = t;
exact_solution(:,i) = fn_y(t);
end
%% solution
figure; hold on; grid on;
plot(t_data,exact_solution,'r-','LineWidth',2)
plot(t_data,Y_data,'b--','LineWidth',2)
legend('Exact solution','RK 4th order')
xlabel('time [sec]'); ylabel('y(t)');
이상으로 룽게-쿠타법에 대해 알아보았습니다.
'공학 > 수치해석' 카테고리의 다른 글
[수치해석] Gaussian elimination(가우스 소거법) (0) | 2021.07.28 |
---|---|
[수치해석] Cramer's rule (크래머 공식) (0) | 2021.07.27 |
[수치해석] 사다리꼴 공식(trapezoidal rule) (2) | 2021.04.15 |
[수치해석] Newmark method(뉴마크 기법) (0) | 2021.04.11 |
[수치해석] 뉴턴-랩슨(Newton-Raphson)법 (with Python) (6) | 2020.12.06 |