線性方程組之高斯消元

2022-04-30 18:36:09 字數 1728 閱讀 5357

\(\begin

a_x_ + a_x_ + ......+a_x_=b_ \\

a_x_ + a_x_ + ......+a_x_=b_\\

......

a_x_ + a_x_ + ......+a_x_=b_

\end\)

上列方程組:

\(a=\)

\(\begin

a_ & \cdots & a_ \\

\vdots & \vdots & \vdots \\

a_ & \cdots & a_

\end\)

\(b=\)

\(\begin

b_ \\

\vdots \\

b_\end\)

\(x=\)

\(\begin

x_ \\

\vdots \\

x_\end\)

可以看作為:\(ax=b\)

1.將某行同乘或同除乙個數(非0)

2.將某行加到另一行

3.將任意兩行互換

值都不變(相信大家都知道)

大家可以發現,解線性方程其實相當於解小學方程,於是我們的步驟就是相當於模擬小學方程解法

1.消元

我們考慮對於第\(i\)個方程,我們消元消掉\(x_\)

於是我們需要找到每乙個方程中,找到對於\(x_i\)的最大係數\(maxn\)以及其對應的方程,將它與第\(i\)個方程調換,這樣能夠保證最大係數的\(x_i\)處理次數最少,時間最少。

找到最大係數後,我們需要判斷一下\(maxn\)是否等於0,如果等於0就代表沒有解。但是因為使用\(double\)型別,要考慮下精度問題,所以判斷條件為小於\(eps\),

for(int i=1;i<=n;i++)

}}

這樣我們就可以一直迴圈,處理出最後的\(x_n\)

ans[n]=a[n][n+1]/a[n][n];
2.回代

回代也很好理解,每次都從\(n\)往回模擬方程代入,處理出每個\(x_i\)

for(int i=n-1;i>=1;i--)

#includeusing namespace std;

typedef double dl;

const int n=110;

const dl eps=1e-9;

dl a[n][n],ans[n],x[n][n];

int n;

int main()

} for(int i=1;i<=n;i++) }

for(int i=1;i<=n;i++)

for(int i=1;i<=n;i++)printf("%.3lf ",ans[i]);

return 0;

}

\(a、有唯一解:\)最後處理出來的\(x_i\)的係數不為0並且過程中得出係數不為0

\(b、無解:\)在處理過程中發現對於\(x_i\)的\(maxn=0\)

\(c、無窮解:\)最後處理出來的\(x_i\)的係數為0並且等式右邊也為0

題目:p3389 【模板】高斯消元法

p2455 [sdoi2006]線性方程組

其實可以發現,高斯消元還是很好理解的,主要難的是前面的怎樣推導線性方程組的過程,推導出來後就直接套模板就好了

線性方程組(高斯消元)

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...