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