# 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: `數值分析`