명시적 룽게-쿠타 메소드
📂수치해석 명시적 룽게-쿠타 메소드 개요 상미분 방정식 솔버ODE solver 인 룽게-쿠타 메소드를 소개한다. 흔히 사용되는 4차 룽게-쿠타 메소드 RK4에 대한 구체적인 설명은 글이 따로 발행되어있다.
빌드업 다음과 같이 주어진 상미분 방정식을 생각하자. y y y 는 t t t 에 대한 함수이며, ′ ^{\prime} ′ 은 t t t 에 대한 미분을 의미한다.
y ′ = f ( t , y ) , t ≥ t 0 , y ( t 0 ) = y 0
y^{\prime} = f(t,y),\quad t \ge t_{0},\quad y(t_{0}) = y_{0}
y ′ = f ( t , y ) , t ≥ t 0 , y ( t 0 ) = y 0
이를 t n t_{n} t n 부터 t n + 1 = t n + h t_{n+1} = t_{n} + h t n + 1 = t n + h 까지 적분하면(헷갈리므로 적분 변수는 t t t 대신 τ \tau τ 로 두자),
∫ t n t n + 1 y ′ d τ = ∫ t n t n + 1 f ( τ , y ) d τ
\int_{t_{n}}^{t_{n+1}}y^{\prime}d\tau = \int_{t_{n}}^{t_{n+1}} f(\tau,y)d\tau
∫ t n t n + 1 y ′ d τ = ∫ t n t n + 1 f ( τ , y ) d τ
좌변을 정리하고 τ ≡ t n + h τ \tau \equiv t_{n} + h\tau τ ≡ t n + h τ 로 치환하면 다음의 식을 얻는다.
[ y ( τ ) ] t n t n + 1 = ∫ t n t n + 1 f ( τ , y ) d τ
\big[y(\tau)\big]_{t_{n}}^{t_{n+1}} = \int_{t_{n}}^{t_{n+1}} f(\tau,y)d\tau
[ y ( τ ) ] t n t n + 1 = ∫ t n t n + 1 f ( τ , y ) d τ
⇓ y ( t n + 1 ) = y ( t n ) + ∫ t n t n + 1 f ( τ , y ) d τ = y ( t n ) + h ∫ 0 1 f ( t n + h τ , y ( t n + h τ ) ) d τ
\Downarrow \\
y(t_{n+1}) = y(t_{n}) + \int_{t_{n}}^{t_{n+1}} f(\tau,y)d\tau = y(t_{n}) + h\int_{0}^{1} f\big(t_{n} + h\tau,y(t_{n} + h\tau)\big)d\tau
⇓ y ( t n + 1 ) = y ( t n ) + ∫ t n t n + 1 f ( τ , y ) d τ = y ( t n ) + h ∫ 0 1 f ( t n + h τ , y ( t n + h τ ) ) d τ
이제 뒤의 적분을 합으로 근사하여 다음의 식을 얻는다.
y ( t n + 1 ) = y ( t n ) + h ∑ j = 1 ν b j f ( t n + c j h , y ( t n + c j h ) ) , n = 0 , 1 , 2 , ⋯ (1)
y(t_{n+1}) = y(t_{n}) + h\sum_{j=1}^{\nu} b_{j} f\big(t_{n} + c_{j}h,y(t_{n} + c_{j}h)\big),\quad n=0,1,2,\cdots
\tag{1}
y ( t n + 1 ) = y ( t n ) + h j = 1 ∑ ν b j f ( t n + c j h , y ( t n + c j h ) ) , n = 0 , 1 , 2 , ⋯ ( 1 )
이는 y n = y ( t n ) y_{n} = y(t_{n}) y n = y ( t n ) 을 알 때, y n + 1 = y ( t n + 1 ) y_{n+1} = y(t_{n+1}) y n + 1 = y ( t n + 1 ) 을 알 수 있는 근사식이다. 물론 우변에 모르는 값인 y ( t n + c j h ) y(t_{n} + c_{j}h) y ( t n + c j h ) 가 포함되어 있으니 이도 근사해야한다. 식이 복잡하므로 j = 1 , 2 , … , ν j = 1,2,\dots,\nu j = 1 , 2 , … , ν 에 대해서 다음과 같이 표기하자.
ξ j = y ( t n + c j h )
\xi_{j} = y(t_{n} + c_{j}h)
ξ j = y ( t n + c j h )
우선 c 1 = 0 c_{1} = 0 c 1 = 0 이라 두자. 그러면 ξ 1 = y n \xi_{1} = y_{n} ξ 1 = y n 이므로 아는 값이다. 이제 멀티스텝 메소드 를 적용하여 ξ j \xi_{j} ξ j 들을 다음과 같이 순차적으로 근사한다고 하자.
ξ 2 = y ( t n + c 2 h ) = y n + h a 2 , 1 f ( t n + c 1 h , y n + c 1 h ) = y n + h a 2 , 1 f ( t n , y n ) ( ∵ c 1 = 0 ) = y n + h a 2 , 1 f ( t n , ξ 1 ) ( ∵ ξ 1 = y n ) ξ 3 = y ( t n + c 3 h ) = y n + h a 3 , 1 f ( t n + c 1 h , y n + c 1 h ) + h a 3 , 2 f ( t n + c 2 h , y n + c 2 h ) = y n + h a 3 , 1 f ( t n , ξ 1 ) + h a 3 , 2 f ( t n + c 2 h , ξ 2 ) ⋮ ξ ν = y n + h ∑ j = 1 n − 1 a ν , j f ( t n + c j h , ξ j )
\begin{align*}
\xi_{2}
&= y(t_{n} + c_{2}h) \\
&= y_{n} + h a_{2,1}f(t_{n} + c_{1}h, y_{n} + c_{1}h) \\
&= y_{n} + h a_{2,1}f(t_{n}, y_{n}) & (\because c_{1} = 0)\\
&= y_{n} + h a_{2,1}f(t_{n}, \xi_{1}) & (\because \xi_{1}=y_{n}) \\[2em]
\xi_{3}
&= y(t_{n} + c_{3}h) \\
&= y_{n} + h a_{3,1}f(t_{n} + c_{1}h, y_{n} + c_{1}h) + h a_{3,2}f(t_{n} + c_{2}h, y_{n} + c_{2}h) \\
&= y_{n} + h a_{3,1}f(t_{n}, \xi_{1}) + h a_{3,2}f(t_{n} + c_{2}h, \xi_{2}) \\
&\vdots \\
\xi_{\nu} &= y_{n} + h\sum_{j=1}^{n-1}a_{\nu,j} f(t_{n} + c_{j}h, \xi_{j})
\end{align*}
ξ 2 ξ 3 ξ ν = y ( t n + c 2 h ) = y n + h a 2 , 1 f ( t n + c 1 h , y n + c 1 h ) = y n + h a 2 , 1 f ( t n , y n ) = y n + h a 2 , 1 f ( t n , ξ 1 ) = y ( t n + c 3 h ) = y n + h a 3 , 1 f ( t n + c 1 h , y n + c 1 h ) + h a 3 , 2 f ( t n + c 2 h , y n + c 2 h ) = y n + h a 3 , 1 f ( t n , ξ 1 ) + h a 3 , 2 f ( t n + c 2 h , ξ 2 ) ⋮ = y n + h j = 1 ∑ n − 1 a ν , j f ( t n + c j h , ξ j ) ( ∵ c 1 = 0 ) ( ∵ ξ 1 = y n )
이제 ( 1 ) (1) ( 1 ) 의 우변의 값 y n y_{n} y n , f ( t n , ξ 1 ) f(t_{n}, \xi_{1}) f ( t n , ξ 1 ) , f ( t n + c 2 h , ξ 2 ) f(t_{n} + c_{2}h, \xi_{2}) f ( t n + c 2 h , ξ 2 ) , … \dots … , f ( t n + c j − 1 h , ξ j − 1 ) f(t_{n} + c_{j-1}h, \xi_{j-1}) f ( t n + c j − 1 h , ξ j − 1 ) 들을 모두 구한 셈이다. 명시적 룽게-쿠타 explicit Runge-Kutta, ERK 메소드는 y n + 1 y_{n+1} y n + 1 의 값을 y n y_{n} y n , f ( t n , ξ 1 ) f(t_{n}, \xi_{1}) f ( t n , ξ 1 ) , f ( t n + c 2 h , ξ 2 ) f(t_{n} + c_{2}h, \xi_{2}) f ( t n + c 2 h , ξ 2 ) , … \dots … , f ( t n + c j − 1 h , ξ j − 1 ) f(t_{n} + c_{j-1}h, \xi_{j-1}) f ( t n + c j − 1 h , ξ j − 1 ) 의 선형결합으로 근사하여 얻는 방법을 말한다.
정의 명시적 룽게-쿠타 메소드란, 주어진 y n y_{n} y n 에 대해서 y n + 1 y_{n+1} y n + 1 을 다음과 같이 근사하는 방법이다.
y n + 1 = y n + h ∑ j = 1 ν b j f ( t n + c j h , ξ j ) , n = 0 , 1 , 2 , ⋯ (2)
y_{n+1} = y_{n} + h\sum_{j=1}^{\nu} b_{j} f(t_{n} + c_{j}h, \xi_{j}),\quad n=0,1,2,\cdots
\tag{2}
y n + 1 = y n + h j = 1 ∑ ν b j f ( t n + c j h , ξ j ) , n = 0 , 1 , 2 , ⋯ ( 2 )
여기서 각각의 ξ j \xi_{j} ξ j 는,
ξ 1 = y n ξ 2 = y n + h a 2 , 1 f ( t n , ξ 1 ) ξ 3 = y n + h a 3 , 1 f ( t n , ξ 1 ) + h a 3 , 2 f ( t n + c 2 h , ξ 2 ) ⋮ ξ ν = y n + h ∑ i = 1 ν − 1 a ν , i f ( t n + c i h , ξ i )
\begin{align*}
\xi_{1} &= y_{n} \\
\xi_{2} &= y_{n} + ha_{2,1}f(t_{n}, \xi_{1}) \\
\xi_{3} &= y_{n} + ha_{3,1}f(t_{n}, \xi_{1}) + ha_{3,2}f(t_{n} + c_{2}h, \xi_{2}) \\
\vdots & \\
\xi_{\nu} &= y_{n} + h\sum_{i=1}^{\nu-1}a_{\nu, i}f(t_{n} + c_{i}h, \xi_{i})
\end{align*}
ξ 1 ξ 2 ξ 3 ⋮ ξ ν = y n = y n + h a 2 , 1 f ( t n , ξ 1 ) = y n + h a 3 , 1 f ( t n , ξ 1 ) + h a 3 , 2 f ( t n + c 2 h , ξ 2 ) = y n + h i = 1 ∑ ν − 1 a ν , i f ( t n + c i h , ξ i )
이때 ν × ν \nu \times \nu ν × ν 행렬 A = [ a j , i ] A = [a_{j,i}] A = [ a j , i ] 를 룽게-쿠타 행렬 RK matrix 이라 한다. 수식에서 비어있는 성분은 0 0 0 이다.
A = [ a j , i ] = [ a 2 , 1 a 3 , 1 a 3 , 2 ⋮ a ν , 1 a ν , 2 ⋯ a ν , ν − 1 ]
A = [a_{j,i}]
= \begin{bmatrix}
\\
a_{2,1} & \\
a_{3,1} & a_{3,2} \\
\vdots & \\
a_{\nu,1} & a_{\nu,2} & \cdots & a_{\nu,\nu-1} &
\end{bmatrix}
A = [ a j , i ] = a 2 , 1 a 3 , 1 ⋮ a ν , 1 a 3 , 2 a ν , 2 ⋯ a ν , ν − 1
또한 아래의 b \mathbf{b} b 와 c \mathbf{c} c 를 각각 RK 웨이트 RK weights , Rk 노드 RK nodes 라 한다.
b = [ b 1 b 2 ⋮ b ν ] and c = [ c 1 c 2 ⋮ c ν ]
\mathbf{b} = \begin{bmatrix}
b_{1} \\ b_{2} \\ \vdots \\ b_{\nu}
\end{bmatrix}
\quad \text{and} \quad
\mathbf{c} = \begin{bmatrix}
c_{1} \\ c_{2} \\ \vdots \\ c_{\nu}
\end{bmatrix}
b = b 1 b 2 ⋮ b ν and c = c 1 c 2 ⋮ c ν
또한 ( 2 ) (2) ( 2 ) 가 ν \nu ν 스테이지ν \nu ν stages 를 가진다고 말하며, 이러한 방법을 ν \nu ν 스테이지(혹은 ν \nu ν 차) 룽게-쿠타 메소드라 한다.
설명 정의에 따라 자명하게도 RK 행렬은 하삼각행렬 이다.
위의 방법에 따라서, ξ j \xi_{j} ξ j 는 ξ 1 \xi_{1} ξ 1 부터 ξ ν \xi_{\nu} ξ ν 까지 순차적으로 계산할 수 있다. 그러면 결과적으로 ( 2 ) (2) ( 2 ) 를 계산할 수 있고, y n + 1 y_{n+1} y n + 1 을 얻는다. 이를 반복하여 다음 스텝에서의 y y y 값 y n + 2 y_{n+2} y n + 2 , y n + 3 y_{n+3} y n + 3 , … \dots … 들을 구할 수 있다.
RK 메소드에서 계수들 a j , i a_{j,i} a j , i , b j b_{j} b j , c j c_{j} c j 들은 구하는 것이 아니라 선택하여 사용하는 것 이다. 계수는 c A b t \begin{array}{c|c} \mathbf{c} & A \\ \hline & \mathbf{b}^{t} \end{array} c A b t 와 같은 꼴로 표기하는데 이를 RK 테이블 RK tableaux 라 한다. 흔히 사용되는 RK4 의 RK 테이블은 다음과 같다.
0 1 2 1 2 1 2 0 1 2 1 0 0 1 0 0 1 6 1 3 1 3 1 6
\begin{array}{c|cccc}
0 & \\[0.5em]
\frac{1}{2} & \frac{1}{2} \\[0.5em]
\frac{1}{2} & 0 & \frac{1}{2} \\[0.5em]
1 & 0 & 0 & 1 \\[0.5em]
\hline {\displaystyle {\color{white}\dfrac{0}{0}}} & \frac{1}{6} & \frac{1}{3} & \frac{1}{3} & \frac{1}{6}
\end{array}
0 2 1 2 1 1 0 0 2 1 0 0 6 1 2 1 0 3 1 1 3 1 6 1
같이보기