在前幾篇關于math.net的部落格中(見上面連結),主要是介紹了math.net中主要的數值功能,并進行了簡單的矩陣向量計算例子,接着使用math.net的矩陣等對象,對3種常用的矩陣資料交換格式的讀寫。一方面可以了解math.net的使用,另一方面以後也可以直接讀取和儲存資料為這兩種格式,給大家的科研或者工作帶來便利。接下來的文章将繼續對math.net的功能進行講解和示範,并附帶一些數學方面的基礎知識。畢竟很多人沒有精力去研究math.net,那我就把我的研究心得一一寫出來,友善後來人。
數值分析(numerical analysis)是研究分析用計算機求解數學計算問題的數值計算方法及其理論的學科,是數學的一個分支,它以數字計算機求解數學問題的理論和方法為研究對象。為計算數學的主體部分。數值分析有如下特點: 1·面向計算機 2·有可靠的理論分析 3·要有好的計算複雜性 4·要有數值實驗 5.要對算法進行誤差分析 數值分析的主要内容:插值法,函數逼近,曲線拟和,數值積分,數值微分,解線性方程組的直接方法,解線性方程組的疊代法,非線性方程求根,常微分方程的數值解法。
是以我們今天要解決的就是數值分析的一個很小但又最常接觸到的部分,方程(組)的求解。方程(組)的求解有2種方法,一種是直接求解,一種是疊代求解。直接方法比較好了解,相當與使用公式進行直接計算,結果也比較精确。而另外一種是疊代方法。從最初的猜測,疊代方法逐次近似形式收斂隻在極限的精确解。
正如上面所說,方程(組)的形式很多,不同的形式以及實際要求的精度都可以使用不同的方法,而本文主要介紹最簡單,也是最常見的線性方程的直接求解方法。
本文首先對math.net中求解線性方程的相關源碼進行分析,這樣大家碰到了問題,也可以更好的查找源碼解決,或者進行擴充,實作自己的一些特殊需求。math.net中mathnet.numerics.linearalgebra.factorization命名空間下有一個泛型接口:isolver<t>,就是解ax = b類型的線性方程的接口類型。該接口功能很多,看看下面的接口源代碼和注釋(本人進行了簡單的翻譯),就很清楚了。
由于求解線性方程組主要用到了矩陣的分解,math.net實作了5種矩陣分解的算法:lu,qr,svd,evd,cholesky。而gramschmidt是繼承qr的,每一個都是實作了isolver<t>接口,是以就可以直接使用矩陣的分解功能,直接進行線性方程組的求解。為了友善,我們舉一個lu的源碼例子,簡單的看看源碼的基本情況:
大家可能會注意到,上面是抽象類,這和math.net的實作是有關的。最終都是實作相應版本的matrix矩陣,然後實作對應版本的類型的分解方法。下面例子會介紹具體使用,大家有疑問,可以拿着源碼和例子,調試一番,知道上面的2個實作過程,就比較簡單了
假設下面是要求解的線性方程組(ax=b):
5*x + 2*y - 4*z = -7 3*x - 7*y + 6*z = 38 4*x + 1*y + 5*z = 43
測試代碼,由于求解的方法很多,隻列舉了幾種,其他的以此類推:
結果如下:
今天的用法就到此為止,請關注部落格,後續還有更多的分析和使用文章。