# Runge-Kutta Methods
[toc]
## 介紹
在數值分析領域中,Runge-Kutta 法是用於求出非線性**常微分方程式**近似解的一種系列方法。它由兩位德國數學家 Carl Runge 和 Martin Kutta 大約西元 1900 年發明出來的。RK 法有分階層,最常使用的是二階 RK 法簡稱 RK2 以及四階 RK4。
它們的算法都是透過迭代法來實現,RK2 相比 RK4 可以計算的比較快,但相對精準度就沒有 RK4 來的高,所以都是依據情況來決定要使用甚麼方法。
## 前即提要
### 常微分方程式
在深入講解 RK 法之前我們要先建立一些基本知識,首先**常微分方程式(Ordinary Differential Equations,ODEs)**,它是微分方程式的一種。
常微分方程式會有以下要素:
1. 未知數 $x$
2. 未知函數 $y = f(x)$
3. 未知函數的導函數 $y^{(n)} = f^{(n)}(x),n \in \mathbb{N}$
> 那個 $n$ 代表微分階數
微分方程式之下除了常微分方程式之外,還有另外一種叫**偏微分方程式(Partial Differential Equations,PDEs)**。
分辨這兩個方程式很簡單:常微分方程式指涉及到**一個自變數**的導數,而偏微分方程式涉及到**多個自變數**的導數。
> 導數(Derivative)與微分(Differential)的差別:微分是指運算,類似加法或乘法;導數指的是結果,例如 $f'(x)$、且導數可以是常數或者是函數(導函數)。
### Euler Method
Euler Method 跟 RK 法一樣都是用來求常微分方程式近似解會使用的方法,只是它只有用一階而已,對於非線性的函式來說精準度相當的不夠,但它的觀念是數值分析中最基本。
假設我們有一個微分方程:$y'(t) = f(t, y(t)), y(t_0) = y_0$。Euler Method 中會有一個變數 $h$ 來代表時間步伐,所以說:
$$
t_{n + 1} = t_n + h
$$
然後我們可以得到時間 $t_{n + 1}$ 的近似值:
$$
y_{n + 1} = y_n + hf(t_n, y_n)
$$
## Runge-Kutta
### RK2
由於 Euler Method 的誤差會很不精確,所以 RK2 它的方法是取兩個點上的斜率,最後平均後再推算。先看一下它的公式:
$$
y_{n + 1} = y_n + hK \\
K = \frac{1}{2}(K_1 + K_2) \\
K_1 = f(t_n, y_n) \\
K_2 = f(x_n + h, y_n + hK_1) \\
$$
RK2 的觀念就是:從已知點 $P_0(x_0, y_0)$ 和其斜率 $K_1$ 可以推出新點 $P_1(x_1, y_1)$,透過這個新點推算出的斜率 $K_2$,來跟剛剛的 $K_1$ 求斜率平均值後得 $K$,即可從點 $P_n$ 和斜率 $K$ 來推算點 $P_{n+1}$,這樣的計算方式會比 Euler Method 更加的精準。
### RK4
基本上就是算四階,會更加精準但相對計算步驟變多了:
$$
y_{n + 1} = y_n + hK \\
K = \frac{1}{6}(K_1 + 2K_2 + 2K_3 + K_4) \\
K_1 = f(t_n, y_n) \\
K_2 = f(t_n + \frac{h}{2}, y_n + \frac{h}{2}K_1) \\
K_3 = f(t_n + \frac{h}{2}, y_n + \frac{h}{2}K_2) \\
K_4 = f(t_n + h, y_n + hK_3) \\
$$
> 注意這裡的 $K_2$ 計算方式跟 RK2 的不同哦!
## 應用
有一個未知的函數 $y(x)$,其導函數為 $y'(x)=f(x,y(x))=-2y(x)+3e^{-4x}$,目前已知 $y(0) = 1$,求 $y(0.1)$ 是多少?
### RK2
設定步長 $h = 0.1$,我們先求 $K_1$:
$$
K_1 = f(0, 1) = -2 \cdot 1 +3e^{-4 \cdot 0} = -2 + 3 = 1
$$
接著求 $K_2$:
$$
K_2 = f(0 + 0.1, 1 + 0.1 \cdot 1) \\
= f(0.1, 1.1) \\
= -2 \cdot 1.1 +3e^{-4 \cdot 0.1} \\
= -2.2 + 2.01096014 \\
= -0.18903986
$$
接著求 $K$:
$$
K = \frac{1}{2}(K_1 + K_2) \\
= \frac{1}{2}(1 - 0.18903986) \\
= 0.40548007
$$
最後算出 $y_{n+1}$:
$$
y_{n + 1} = y_n + hK \\
= 1 + 0.1 * 0.40548007 \\
= 1.04054801
$$
答案:$y(0.1)$ 近似解是 $1.0405$。
### RK4
懶的算了 XD
透過程式算出來 $y(0.1)$ 應該會是 $1.04134$
###### tags: `數值分析`