1. 程式人生 > >數值分析(一) 演算法和誤差

數值分析(一) 演算法和誤差

寫在前面:最近看的比較多的主要都關於數學方面主要是數學分析,就想寫部落格記錄一下,給自己做個筆記。並想把數學相關方法與智慧計算相關方向一定結合。很多教材基本都使用的Matlab進行程式設計、我這邊主要用C++/java來做(主要是不會Matlab,微笑)也會對相關類進行封裝。如矩陣類,包括其特徵值、奇異值求解:

數值分析屬於計算數學範疇。數值分析的研究內容就是求解各種數學問題數值解的數值計算方法,以及建立數值計算方法、編寫程式,並用計算機計算得出的問題的數值解。

我們將從以下方面進行展開:

(1)線性方程的求根---- 包括《數值分析》中的Gauss消元法、Chlesky分解、Jacobi迭代法等還包括運用遺傳演算法求解限定條件下的線性方程。

(2)多項式插值和函式的數值逼近/曲線擬合

(3)數值積分和導數---- 牛頓-柯特斯公式、Romberg公式、Gauss型求積公式等

(4)常微分方程的數值解法---- 泰勒級數方法、改進尤拉等---------------------正式開始:---------------------------------------------------------------------------------------

概念:

推導和演算得出的結果為其解析解(精確解)

數值方法求出的解為其數值解(近似解/計算解)

對同一數學問題可能有多種方法計算,方法的選擇上我們要求:

(1)計算效率高----時間/空間複雜度

(2)數值穩定性好----持續的計算中,微小的計算誤差對最終結果的準確性影響不大。否則稱演算法是不穩定的。Ps.這是很要命的,特別是在遞推中,誤差如滾雪球一般....

-------------------誤差:----------------------------------------------------------------------------------------------

誤差一般有建立數學模型時產生的誤差、確定初始資料時產生的誤差、截斷誤差和舍入誤差。後兩種是數值分析中討論研究的誤差。

截斷誤差是指某數學問題的精確解與用數值方法求出的近似解之差。例如極限運算就存在截斷誤差:求級數的和。這個和等於π。當用數值演算法計算S時,顯然不能在程式中使n無窮大,通常辦法是讓n足夠大即可。例如n取1000,則求得Sn=3.1420924,截斷誤差為π-Sn=-0.0004998。

舍入誤差不用講了就是數值在計算過程中四捨五入產生的誤差。

假設xx的近似值,則:

ε=|x-x| 稱為絕對誤差。比值(x-x/x為近似值的相對誤差。若準確值x未知,為了便於計算,可以取(x-x/x。前提條件是(x-x/x較小。

同樣,稱(x-x/x<r中的r為相對誤差限

函式誤差估計:

若數有小的變化,引起函式值大的變化,則稱這個計算是病態的,反之稱為良態的。例如常見的:病態矩陣。

--------------------防止誤差傳播:--------------------------------------------------------------------------------------------

(1)避免相近的數相減

(2)避免絕對值很小的數作除數

(3)避免大數加(減)小數---浮點數的儲存精度導致

(4)簡化計算步驟,減少運算次數