高斯消元
高斯消元是解决线性方程组的方法。
线性方程组,就是n元一次方程组,
\(\left\{\begin{matrix}
a_{11}*x_{1}+a_{12}*x_{2}+……+a_{1n}*x_{n}=b_{1}
& & & & \\
a_{21}*x_{1}+a_{22}*x_{2}+……+a_{2n}*x_{n}=b_{2}
& & & & \\
……
& & & & \\
a_{n1}*x_{1}+a_{n2}*x_{2}+……+a_{nn}*x_{n}=b_{n}
& & & &
\end{matrix}\right.\)
要如何去解,我们可以从二元一次方程组入手。
\(\left\{\begin{matrix}
a_{11}*x_{1}+a_{12}*x_{2}=b_{1}
\\
a_{21}*x_{1}+a_{22}*x_{2}=b_{2}
\end{matrix}\right.\)
解这个方程只需要将下面这个式子减去上面这个式子乘上\((-a_{22}/a_{12})\),求出\(x_{1}\),在将\(x_{1}\)代入上面这个式子求出\(x_{2}\)就可以了
通过二元一次方程组的消元操作,可以发现需要解出n元一次方程组的第一步就是将这个方程组经过一些操作转换为
\(\left\{\begin{matrix}
a_{11}^{`}*x_{1}+a_{12}^{`}*x_{2}+……+a_{1n}^{`}*x_{n}=b_{1}^{`}
& & & & \\
a_{21}^{`}*x_{1}+a_{22}^{`}*x_{2}+……+0=b_{2}^{`}
& & & & \\
a_{31}^{`}*x_{1}+a_{32}^{`}*x_{2}+……+0+0=b_{3}^{`}
& & & & \\
……
& & & & \\
a_{n1}^{`}*x_{1}+0+……0+0=b_{n}^{`}
& & & &
\end{matrix}\right.\)
完成这步操作也不难,从第1行开始向下消元,第i行的消元就是将i+1行到n行的第n+1-i列数消成0。
下一步就是从最后一行开始,一元一次方程求解,每次求出的解还要代入方程组的其余方程中,最终求出\(x_{1}\)到\(x_{n}\)的解。
无解的情况就是操作过程中的任意除数等于零的情况。
代码如下:
#include<iostream>
using namespace std;
int n;
double a[110][110],b[110];
double x[110];
int main(){
cin>>n;
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
cin>>a[i][j];
}
cin>>b[i];
}
for(int i=1;i<=n;i++){
if(a[i][n+1-i]==0){
int p=0;
for(int j=i+1;j<=n;j++){
if(a[j][n+1-i]!=0){
p=1;
for(int k=1;k<=n;k++){
double t=a[i][k];
a[i][k]=a[j][k];
a[j][k]=t;
}
double t=b[i];
b[i]=b[j];
b[j]=t;
break;
}
}
if(p==0){
cout<<"No Solution";
return 0;
}
}
for(int j=i+1;j<=n;j++){
double t=a[j][n+1-i]/a[i][n+1-i];
for(int k=1;k<=n;k++){
a[j][k]-=t*a[i][k];
}
b[j]-=t*b[i];
}
}
for(int i=1;i<=n;i++){
if(a[n+1-i][i]==0){
cout<<"No Solution";
return 0;
}
x[i]=b[n+1-i]/a[n+1-i][i];
for(int j=1;j<n+1-i;j++){
b[j]-=a[j][i]*x[i];
}
}
for(int i=1;i<=n;i++){
printf("%.2lf\n",x[i]);
}
return 0;
}
浙公网安备 33010602011771号