演算法初探 高斯消元

2022-05-25 11:30:17 字數 3502 閱讀 3300

2020.07.30-16:36

千萬不要將行的意義和列的意義搞混!!!

以下稱為矩陣的初等行變換

也就是說,高斯消元就是通過初等行變換去求解變化為增廣矩陣的線性方程組

例如下面這個方程組:

\(\begin2x_0+x_1+5x_2+x_3=23\\-x_0+2x_1+8x_2-4x_3=11\\3x_0+x_1-x_2+2x_3=10\\x_0+6x_1+x_2x_3=20\end\)

我們把它寫成增廣矩陣的形式就是:

\(\begin2&1&5&1&23\\-1&2&8&-4&11\\3&1&-1&2&10\\1&6&1&1&20\end\)

那麼如何求解這個方程組呢?

普通的就是進行加減消元,之後將每個解寫成 \(kx_n=y\) 的形式

那麼高斯消元就是通過將增廣矩陣進行初等行變換求解

變換過程:

\(\begin0&-11&3&-1&-17\\0&8&9&-3&31\\0&-17&-4&-1&-50\\1&6&1&1&20\end\)

\(\begin1&6&1&1&20\\0&-11&3&-1&-17\\0&8&9&-3&31\\0&-17&-4&-1&-50\end\)

\(\begin1&6&1&1&20\\0&1&-\dfrac&\dfrac&\dfrac\\0&8&9&-3&31\\0&-17&-4&-1&-50\end\)

\(\begin1&0&\dfrac&\dfrac&\dfrac\\0&1&-\dfrac&\dfrac&\dfrac\\0&0&\dfrac&-\dfrac&\dfrac\\0&0&-\dfrac&\dfrac&-\dfrac\end\)

\(\begin1&0&\dfrac&\dfrac&\dfrac\\0&1&-\dfrac&\dfrac&\dfrac\\0&0&\dfrac&-\dfrac&\dfrac\\0&0&-\dfrac&\dfrac&-\dfrac\end\)

\(\begin1&0&0&\dfrac&\dfrac\\0&1&0&0&2\\0&0&1&-\dfrac&\dfrac\\0&0&0&-\dfrac&\dfrac\end\)

\(\begin1&0&0&\dfrac&\dfrac\\0&1&0&0&2\\0&0&1&-\dfrac&\dfrac\\0&0&0&1&4\end\)

\(\begin1&0&0&0&1\\0&1&0&0&2\\0&0&1&0&3\\0&0&0&1&4\end\)

解得(對不起我選的例子不太好計算,但是上面的過程我是一步步計算來的qaq):

\(\beginx_0=1\\x_1=2\\x_2=3\\x_3=4\end\)

所以就解得了

那麼用來**來寫就是(用題目說明):

為啥不用模板呢?因為模板資料太弱了

這道題也是板子,相比於模板加了無解的判斷

因為會存在某些毒瘤卡行的資料,所以我們一切小心

不信你可以試試下面這個資料

in:

20 2 3

0 0 0

out:0
最外面的迴圈i控制消元的列數

\(np\)則是選擇這一列係數不為\(0\)的乙個

因為前\(i\)個都已經進行過消元了嘛,所以一開始我寫的是\(np=i\)

但是這就沒有想到前\(i\)個會出現無解或無窮解的情況

所以當出現無解或無窮解的情況時,我們操作不變,看下一,用變數\(line\)統計

然後迴圈\(line+1\to n\)發現係數不為零的就選它,為了方便實現,我們一般取最大值

至於取絕對值的原因是有可能方程組的係數集合裡面沒有正數

判斷係數是否為零,不是就讓這一行回到該到的位置

後面就全是初等行變換進行加減消元了

迴圈出來之後,看看這個\(line\)是否小於等於\(n\)

如果是,就說明了存在係數為0的情況

必然是無解或者無窮解

迴圈看看\(n+1\),也就是等式的結果是否為零,如果不是,無解

沒有無解就肯定是無窮解啦

最後輸出來個判斷,防止出現\(-0.00\)的情況

#include#includeusing namespace std;

int n,np,line=1,y;

double c,eps=1e-16;

struct matrixm[10010];

inline double abs(double a)

int main()

}} line+=1;

} if(line<=n)

} printf("0\n");

return 0;

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

每個點的座標為(以 \(a_1\) 為例) \(a_,a_,\dots,a_\)

球心的座標為 \(b_1,b_2,\dots ,b_n\)

分析題目,每個點到球心的距離相等,也就是說:

\(\sum\limits_^n (a_-b_i)^2=\sum\limits_^n (a_-b_i)^2=\dots =\sum\limits_^n (a_-b_i)^2\)

我們將每個等號兩邊的式子作差,就會得到\(k=n\)個等式:

\(\sum\limits_^n (a_-b_i)^2-(a_-b_i)^2=0\)

\(\sum\limits_^n [a_^2-a_^2-2b_i(a_-a_)]=0\)

因為只有 \(b_i\) 是未知數,所以我們化為 \(kb_i=y\) 的形式:

\(\sum\limits_^n 2b_i(a_-a_)=\sum\limits_^n (a_^2-a_^2)\)

清晰明了,所以增廣矩陣為:

\(\begin2(a_-a_)&2(a_-a_)&\cdots&2(a_-a_)&\sum\limits_^n (a_^2-a_^2)\\2(a_-a_)&2(a_-a_)&\cdots&2(a_-a_)&\sum\limits_^n (a_^2-a_^2)\\\vdots&\vdots&\ddots&\vdots&\vdots\\2(a_-a_)&2(a_-a_)&\cdots&2(a_-a_)&\sum\limits_^n (a_^2-a_^2)\end\)

然後用及不嚴謹的高斯消元解就彳亍

#include#includeusing namespace std;

int n,np;

double c;

struct matrixm[110];

int main()

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

} if(i!=np) swap(m[i],m[np]);

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

}} }

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

}

高斯消元 浮點高斯消元

浮點數高斯消元 問題描述 給出乙個線性方程組,有n個方程組,m個未知數。解這個線性方程組。輸入格式 第1行 2個整數n和m,n,m 400,且n不一定等於m 接下來n行,每行m 1個整數,表示乙個方程的m個未知數的係數和常數 輸出格式 如果無解,輸出 no solution 如果有唯一解,輸出m行,...

矩陣消元 高斯消元

安利一波高斯消元的部落格,內容很詳細。看完這個相信你已經理解了大概,高斯消元求線性方程組,在學習線性代數 大學課程 的時候我們都接觸過。原理是先把執行緒組轉換成矩陣,然後把它等價變換成上三角矩陣,這樣從下到上依次可以求出解集。高斯消元模板 模板題 include define n 205 using...

高斯消元法c語言程式 演算法趣談 高斯消元

最近的數學課上,我們學習了高斯消元 gauss elimination 也就是解多元一次方程的一種通用解法。在講解計算機實現解多元一次方程前,我們先用人類的思維來解以下三元一次方程組 如果要解出這個方程x y z未知數的值,我們需要通過消元的方法減少未知數,從而得到乙個未知數的解,再將此未知數往原先...