Loading [MathJax]/jax/output/CommonHTML/jax.js

공학/수치해석

[수치해석] Runge-kutta method(룽게-쿠타법) (with MATLAB)

슬기나무 2020. 12. 7. 22:07
반응형

이번 포스팅에서는 룽게-쿠타법에 대해 알아보도록 합시다.

 

(부르기에 따라 런지-쿠타, 룽게-쿠타 등 여러 발음으로 불리기도 하나,

 

본 포스팅에서는 룽게-쿠타로 표기하겠습니다.)

 

 룽게-쿠타법 (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+1ti)+12!d2ydt2(ti+1ti)2

+13!d3ydt3(ti+1ti)3+14!d4ydt4(ti+1ti)4+O(ti+1ti)n

 

여기서 O(ti+1ti)nnth error term이며,

 

만약 이 error가 충분히 작아 무시가능하다면 함수값 y는 아래와 같이 쓸 수 있습니다.

 

yi+1yi+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의 concept. 출처 - Numerical Methods for Engineers, 6th edition, Chapra, Canale

 

이 때, 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+2y3e4t=0

 

위의 1차 미분방정식을 풀어보도록 하죠.

 

참고로 exact solution은 아래와 같습니다.

 

y(t)=2.5e2t1.5e4t

 

룽게-쿠타법으로 근사해를 구한 결과와 정해를 서로 비교해볼겁니다.

 

우선 룽게-쿠타법을 위해 도함수를 구해보죠.

 

도함수는 미분방정식에서 두개 항을 이항하면 간단히 구할 수 있습니다.

 

f(t,y)=y=3e4t2y

 

매트랩을 이용해 적분해봅시다!

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)');

 

이상으로 룽게-쿠타법에 대해 알아보았습니다.

반응형