最近的數學課上,我們學習了高斯消元(gauss elimination),也就是解多元一次方程的一種通用解法。 在講解計算機實現解多元一次方程前,我們先用人類的思維來解以下三元一次方程組:
如果要解出這個方程x、y、z未知數的值,我們需要通過消元的方法減少未知數,從而得到乙個未知數的解,再將此未知數往原先的方程帶,從而得到所有未知數的解。
對於這個三元一次方程組,我們可以把解未知數的步驟列出來:
1、通過r1與r2的加減消元,將x消去,新的方程叫做r4,形式為:
ay+bz=k(a、b、k均為引數)
2、通過r1與r3的加減消元,將x消去,新的方程叫做r5,形式為:
ay+bz=k(a、b、k均為引數)
到此,原本的三元一次方程組就被化為了二元一次方程組。
3、通過r4與r5的加減消元,將y消去,新的方程叫做r6,形式為:
az=b(z、b均為引數)
到此,二元一次方程又被化簡為了一元一次方程。
4、求解z,再將z帶入r4中,求解y。
5、求解y,再帶入r1中,求解x
按照上面的步驟,我們就可以順利地求出方程的三個未知數的解。
但是,當方程的規模越來越龐大,或者方程的係數變得十分難算時,僅僅依靠雙手,是完成不了計算的。這時,我們就需要借助計算機力量。
可是計算機並不是像我們一樣好說話,用中文說明一下就完了。要求計算機做事,就需要計算機能理解的東西。比如在c++語言中,計算機並不理解方程是什麼東西,因此,我們需要將方程轉化為它所理解的矩陣:
這是乙個3*(3+1)的矩陣(3為方程組未知數數量),其中的3行分別代表原方程組的三個方程,前3列每個數分別代表每個方程中x、y、z的係數,最後一列每個數分別代表所在行方程等號右邊的常數。
而我們又需要把原來求解方程的步驟轉化到矩陣上。
第一步,用r1和r2加減消元消去x。具體消去x的方式是,將r1除以r1中x的係數,這樣讓x的係數變為1。
然後,我們讓r2減去乘上r2的x的係數的r1(也就是r2-1*r1),得出的結果替換原來r2的位置。
第二步,我們用r1和r3進行加減消元,把x項消去。方法同第一步,讓r3減去乘上r3的x的係數的r1(也就是r3-3*r1),替換原來r3的位置。
第三步,用r2和r3的加減消元把y消去,先把r2除以自己的y的係數。
然後,讓r3減去乘以r3的y的係數的r2(也就是r3-r2*(-5/2))
第四步,很顯然最後乙個方程就是-3z=9, 能解出z等於3,於是把z=3帶入上面的式子,得出y=2。最後,把z=3、y=2帶入第乙個式子,得出x=1。這樣,我們就求出了方程的解是:
到現在,有的同學會問,在解這個方程的過程中,很多步驟是很蠢的,比如加減消元r2和r3時,我們把r2先乘-2/5再除以-2/5。確實,這種步驟在人工解這道題時很多餘。但是,既然是程式設計,我們需要找的是一種通用的解法,不是只針對於這個方程,而是全部的多元一次方程。比如說,如果另乙個方程的x係數的最小公倍數很大,或者他們根本就是一些分數,我們平時用的尋找最小公倍數等簡便的加減消元法就不起作用了,而這種通用解法卻可以一直使用下去。
回到正題,既然解決了這個方程,那麼我們就可以擴充套件到解乙個n元一次方程了。令乙個n元一次方程的矩陣形式為:
我們只需要按照剛才的步驟化簡這個矩陣就ok了
第一步,讓r1除以a(1,1),然後從第二行到第n行,每一行式子都減去r1乘以這個式子的x的係數,也就是令ri變成ri-r1*a(i,1)。
第二步,讓r2除以a(2,2),然後從第三行到第n行,每個式子都減去r2乘以這個式子的y的係數,也就是令ri變成ri-r2*a(i,2)
第三步,就是處理r3,以此類推,一共進行n-1步,共消去n-1個未知數,剩下的是乙個一元一次方程,能順利求解。再將這個解依次帶到前面的方程中,求出每個未知數的解。
那麼,我們用c++來實現這個演算法。
#include #include #include #include #include #define in(a) a=read()#define rep(i,k,n) for(int i=k;i<=n;i++)#define inf 2147483646using namespace std;inline int read()double matrix[110][110];//這個陣列是用來儲存矩陣的double x[110];//這個陣列是用來儲存答案的int n; int main() } x[n]=matrix[n][n+1];//最後一行的一元一次方程求解 for(int i=n-1;i>=1;i--) rep(i,1,n) cout
輸入資料:
輸出資料:
程式成功地計算出了方程的解。只要改變n的值,此程式就能解n元一次方程。通過**的迴圈層數,能看出此演算法的時間複雜度是o(n³)。也就是程式在1s內可以解出1000元一次方程。
以上就是高斯消元的全部內容了,大家學會以後可以寫在電腦上,以後做數學作業時就可以秒出答案了。
高斯消元法的C 簡單實現
高斯消元法 首先,我們匯入幾個概念。定義1 乙個矩陣稱為階梯形 行階梯形 若它有以下三個性質 1.每一非零行在每一零行之上 2.某一行的先導元素所在的列位於前一行先導元素的後面 3.某一行先導元素所在列下方元素都是零。比如,定義2 若乙個階梯形矩陣還滿足以下性質,稱它為簡化階梯形 簡化行階梯形 1....
高斯 約當消元法(隨機程式,UVA 10828)
就是有一類題目 就是給你乙個圖,和乙個起始點 可以很抽象,比如uva 11762需要你自己建模。也可以很具體,比如就是乙個網格 然後每個節點都有一定概率轉移到另一些節點。具體解法就是 如果是有向無環圖就用動態規劃或者記憶化搜尋。否則就是高斯消元。本題就是高斯消元。然後如果使用高斯 約當消元法就可以省...
列主元高斯消去法(C語言)
高斯消元法是將方程組中的一方程的未知數用含有另一未知數的代數式表示,並將其代人到另一方程中,這就消去了一未知數,得到一解 或將方程組中的一方程倍乘某個常數加到另外一方程中去,也可達到消去一未知數的目的。消元法主要用於二元一次方程組的求解。核心 1 兩方程互換,解不變 2 一方程乘以非零數k,解不變 ...