高斯消元学习笔记
高斯消元似乎没有同余类那么难呢
1.高斯消元有什么用?
高斯消元法,是线性代数规划中的一个算法,可用来为线性方程组求解。
2.是什么?
对于如下一个 \(n\) 元 \(1\) 次方程组:
\(\begin{cases}a_{1,1}x_1+a_{1,2}x_2+\cdots+a_{1,n}x_n=b_1 \\a_{2,1}x_1+a_{2,2}x_2+\cdots+a_{2,n}x_n=b_2\\\vdots\\a_{n,1}x_1+a_{n,2}x_2+\cdots+a_{n,n}x_n=b_n\\\end{cases}\)
我们将它的系数及结果存在一个 \(n\) 行 \(n+1\) 列的矩阵中,叫做增广矩阵,如图:
\(\begin{bmatrix}a_{1,1}&a_{1,2}&\cdots&a_{1,n}&b_1\\a_{2,1}&a_{2,2}&\cdots&a_{2,n}&b_1\\\cdots&\cdots&\cdots&\cdots&\cdots\\a_{n,1}&a_{n,2}&\cdots&a_{n,n}&b_n\end{bmatrix}\)
康不懂 \(QWQ\) ,让我们来举个栗子:
\(\begin{cases}2x-y+3z=1\qquad (1) \\4x+2y+5z=4\qquad(2)\\x+2y=7 \qquad(3)\end{cases}\)
它所对应的增广矩阵为:
\(\begin{bmatrix}2&-1&3&1\\4&2&5&4\\1&2&0&7\end{bmatrix}\)
接下来,我们进行高斯消元:
- \((2)-(1)\times2 , (3)-(1)\times \frac{1}{2}\) ,得:
\(\begin{cases}2x-y+3z=1\qquad (1) \\4y-1z=2\qquad(2)\\2.5y-1.5z=6.5 \qquad(3)\end{cases}\)
对应的,增广矩阵变为:
\(\begin{bmatrix}2&-1&3&1\\0&4&-1&2\\0&2.5&-1.5&6.5\end{bmatrix}\)
- \((3)-(2)\times0.625\) ,得:
\(\begin{cases}2x-y+3z=1\qquad (1) \\4y-1z=2\qquad(2)\\-0.875z=5.25 \qquad(3)\end{cases}\)
一样,增广矩阵变为:
\(\begin{bmatrix}2&-1&3&1\\0&4&-1&2\\0&0&-0.875&5.25\end{bmatrix}\)
现在,就可以回代方程:
\(z=2.25\div(-0.875)=-6\)
\(y=(3-(-1)\times z)\div 4=-1\)
\(x=(1-3\times z-(-1)\times(-1))\div2=9\)
大概思路就是用上面的方程将下面方程的未知数消掉,到最后一个求值回代。
#include<bits/stdc++.h>
using namespace std;
const double eps=1e-5;
int n;
float zg[102][102];
int gaos(){
for(int i=1;i<=n;i++){
int p=i;
for(int j=i+1;j<=n;j++){
p=(abs(zg[j][i])>abs(zg[p][i])?j:p);
}
if(abs(zg[p][i])<eps){
return 0;
}
if(p!=i){
for(int j=i;j<=n+1;j++){
swap(zg[i][j],zg[p][j]);
}
}
for(int j=i+1;j<=n;j++){
float x=zg[j][i]/zg[i][i];
for(int k=i;k<=n+1;k++){
zg[j][k]=zg[j][k]-zg[i][k]*x;
}
}
}
for(int i=n;i;i--){
for(int j=i+1;j<=n;j++){
zg[i][n+1]=zg[i][n+1]-zg[j][n+1]*zg[i][j];
}
zg[i][n+1]=zg[i][n+1]/zg[i][i];
}
return 1;
}
int main(){
cin>>n;
for(int i=1;i<=n;i++){
for(int j=1;j<=n+1;j++){
cin>>zg[i][j];
}
}
if(!gaos()){
cout<<"No Solution\n";
return 0;
}
for(int i=1;i<=n;i++){
printf("%.2lf\n",zg[i][n+1]);
}
return 0;
}

浙公网安备 33010602011771号