蒟蒻 nanjo_qi 前天考了一次試……第一題就華麗麗地爆零了。
解一次方程組我會啊,但是解一千個有百來八十個未知數的……棄了棄了orz。
考完了才知道有高斯消元這個神奇的東西,於是就去簡單了解了一下。
高斯消元法是線性代數規劃中的乙個演算法,可用來為線性方程組求解,還可以求出矩陣的秩,以及求出可逆方陣的逆矩陣。消元法就是將方程組中的一方程的未知數用含有另一未知數的代數式表示,並將其代人到另一方程中,這就消去了一未知數,得到一解;或將方程組中的一方程倍乘某個常數加到另外一方程中去,也可達到消去一未知數的目的(其實就是中小學最常用的解二元,三元一次方程組的思想嘛)。我們把構成n個未知數的,含n個方程的方程組,亂搞一下,乙個乙個未知數求解,求出乙個就再代入回去求其它的,這樣就能解出所有的來啦(也有可能會無解或有多組解)!
那該怎麼搞呢?
我們舉個栗子,有這樣乙個三元一次方程組:
5x + 4y + 7z = 8
3x + 9y – 1z = -2
8x + 3y + 2z = 9
我們預設每一列上的未知數是相同的,如果沒有就補個0,這樣拋除未知數,我們就得到了乙個n*(n+1)的矩陣,然後以後我們規定未知數用x1(x),x2(y),x3(z)等表示:
5 4 7 8
3 9 -1 -2
8 3 2 9
下面到了演算法的核心:
如果我們正在求解xi,那麼首先我們選取乙個方程j>=i,使a[j][i]不為0,然後把這個方程和第i行方程互換一下。隨後對於每一行j>i,我們把這個方程通過加減方程i的倍數,將其中的xi的係數化為0,即進行消元操作。
這個地方建議手動拿例子模擬一下,**長這樣:
1然後外面套一層迴圈i = 1 ~ n,完成每乙個消元的操作,這時對矩陣的操作就完成啦。int p =i;
2for(int j=i; j<=n; ++j) if( fabs(a[p][i]) ) //選取乙個方程使a[j][i]不為0
3for(int j=i; j<=n+m; ++j) swap(a[i][j], a[p][j]);
4for(int j=i+1; j<=n; ++i)
這時這個矩陣被搞成了這樣,去掉常數那一邊的話會是乙個嚴格上三角矩陣(保留兩位小數):
在高斯消元演算法中,當且僅當它是嚴格上三角矩陣時,才是有唯一解的。
5.00 4.00 7.00 8.00
0.00 6.60 -5.20 -6.80
0.00 0.00 -11.88 -7.30
也就是:
5x + 4y + 7z = 8
6.6y – 5.2z = -6.8
-11.88z = -7.3
此時從後往前看,我們容易解出z!然後就容易解出y!然後代入解出x,就做完了。
其實還是很簡單的,這一步可以這樣解決:
1 x[n] = a[n][n+i] /a[n][n]; //未知數x[n]這樣,高斯消元法求解線性方程組的時間是o(n^3)的。2for(int j=n-1; j>=1; --j)
那無解的時候怎麼辦呢?
只需要判斷是否出現某時對xi進行消元時,能否找到找到乙個xi的係數不為零就可以了,就是:
1下面是考試題目:if( fabs(a[p][i])return
0;
pear上數學課(equation.pas/c/cpp)
題目描述:
pear 被一群長得很像的一次方程組圍住了,快去拯救他!
pear 最近的作業之一,就是練習解一次方程組,老師給了他 m 個方程組,每個方程組未知數個數一樣(n 個),未知數的係數一樣,唯一不同的是每個方程的常數項。
比如 n=2,m=3,pear 手上有這樣的 3 個方程組:
線性方程組(高斯消元)
acm模版 列主元gauss消去求解a x b 返回是否有唯一解,若有解在b中 define fabs x x 0 x x define eps 1e 10 const int maxn 100 int gausscpivot int n,double a maxn double b if fabs...
高斯消元解線性方程組
高斯消去法是消去法的一種特殊形式,它包括消元和回帶兩個過程。高斯消去法求解線性方程組分為以下兩大步 1 將係數矩陣a經過一系列的初等行變換程式設計右上三角矩陣,其常數向量b也同時做相應的變換,即 在變換過程中,採用原地工作,即經變換後的元素仍存放在原來的儲存單元中。為了實現上述目標,對於k從1到n ...
高斯消元解線性方程組
高斯消元可以通過初等行列變化把 增廣矩陣 轉換成 階梯型矩陣,進而求解 n 個線性方程組的解,其時間複雜為o n 3 初等行列變換 對乙個方程組進行以下三個操作不會影響方程的解 例如線性方程組為 a11x1 a12x2 a13x3 a1nxn b1 a21x1 a22x2 a23x3 a2nxn b...