研究雜記01. Numerical Methods

--

此篇教學將快速代入數值方法之概念並著重在實作方法,可能沒有嚴謹之內容證明與描述。

Buck converter numerical methods examples (with Python)
https://colab.research.google.com/drive/1D6QX3_nmWHTLyygglZMVZ3SbrC1nC4Cb?usp=sharing

前言

在工程上需要數值方法(Numerical Methods)之原因在於,我們通常能夠使用微分方程式來對系統建模,需要知道系統動態響應時,就必須求解微分方程,但一般可能很難甚至無法求解出微分方程式之解析解(顯解或隱式解)。或者在特殊情況下,我們只需要數值結果,並不需要解析解的形式。另一是得力於近年電腦計算機功能強大,可以快速做數值運算,相較於人力解出解析解,利用電腦求得數值解之速度可能快上很多。綜上,我們就會使用數值方法來幫助我們進行求解。

常見的數值方法有尤拉法(Euler’s Method)、改進尤拉法(Improved Euler’s Method)、龍格-庫塔法 (Runge–Kutta Method),這三種屬於一階方法,即只需要建立一次導數就可以進行運算。本文也將針對三種方法進行介紹。

Euler’s Method

首先,方法本身都是離散近似的概念,所以結果必定有誤差。離散時間間隔,或者說取樣週期(sampling period)越短,則結果越接近真實解。但相對來說,同一時間窗框下運算量越大。是必要在求解精度以及運算時間兩者間進行trade-off。

聽到Euler應該就知道這個方法不一般,肯定很巧妙。它本質上是利用了泰勒展開式的概念去對一函數做一階近似(即利用二維空間斜率之概念)。而微分方程的意義本身就是變化量,所以我們知道了微分方程,基本上就掌握了未來的資訊量,可以在給定的條件下(初值,Initial condition以及邊界,Boundary condition)預測出函數未來的長相,這也是為甚麼可以不需要知道解析解,即可找出系統動態的原因。

以下這條就是Euler’s method的關鍵公式:

再來只要設定好取樣週期(sampling period, td)與初值(initial condition)
透過演算法疊代,即可得到n個時間間隔後的數值。

若使用圖解可以很明確的知道每次疊代之間的關係,也可以了解到error是如何產生的,因為error將影響到下次疊代之起始點,所以error會累積,若誤差過大有可能導致系統發散。

若想提高精度,最簡單的方式是減小取樣間隔td,但此法會導致運算量上升,有沒有不減小td但仍能提升精度的方法呢 ?

答案是有的,從圖解中可看出誤差發生的原因為用此時刻的斜率估算下一組點,但由於系統不是線性的,所以斜率估算不準確,若仍夠修正斜率,或者找到一個能夠代表"真實兩點"之間斜率情況的數學運算,我們便可以降低誤差,達到更準確的數值解,故此衍生出Improved Euler’s Method。

Improved Euler’s Method

剛剛有提到的關鍵在於修正斜率,Improved Euler’s Method便是使用滾動式修正,利用新預測出來的點,得到一組新的斜率,再與起始點的斜率平均,獲得一組可以代表兩點間斜率的一種方法(先預測斜率的概念),最後以此修正過的斜率預測出新的點。等於重複做兩次Euler’s Method。

Runge–Kutta Method

簡稱RK Method,也是一樣利用修正斜率的概念達到更準的數值解。開始引入統計的感覺,利用加權平均觀念得到修正後斜率,來預測新的點。

一般式如下:

Euler’s Method 稱為 First-order Runge-Kutta method (RK1)

Improved Euler’s Method 稱為 Second-order Runge-Kutta method(RK2)

常用之RK4方法:

通常使用到RK4就很準了

--

--