假设系数矩阵的维数为A(n,n),常数矩阵的维数为b(n,1),增广矩阵的维数为A_b(n,n+1)
1、选列主元:对系数矩阵主对角线上的每一个元素aii,找到该元素所在列中对角线以下(包括aii)所有元素中的最大值,将aii所在行与最大元素所对应行交换,完成选列主元
2、求比值、初等变换:1e-10,当abs(aii)<eps时,在计算机中就认为aii==0,当abs(aii)>=eps时,即aii!=0,mki=-(aki/aii),k=i+1,…,n,然后对第k行做如下计算,akj=akj+mki*aij,k=i+1,…,n;j=i+1,
…,n+1。
3、经过第二部计算之后,增广矩阵变成一个行阶梯形矩阵,记变换之后的增广矩阵为L,则有Lx=b。从L的第n行开始,回代求解即可。
#include<bits/stdc++.h>
#define maxn 1000+10
#define eps 1e-10
using namespace std;
double A[maxn][maxn],b[maxn],A_b[maxn][maxn],X[maxn];//A表示系数矩阵,b表示常数矩阵,A_b表示增广矩阵,X表示未知数矩阵
int n;//线性方程个数
int main(){
cout<<"Please enter the number of unknown numbers:"<<endl;
cin>>n;
cout<<"Please enter a coefficient matrix and a constant matrix:"<<endl;
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
cin>>A[i][j];
A_b[i][j]=A[i][j];
}
cin>>b[i];
A_b[i][n+1]=b[i];
}
for(int k=1;k<n;k++){//k控制n-1个主元
int maxx=abs(A_b[k][k]);
int row=k;
for(int i=k+1;i<=n;i++){//i控制行
if(maxx<abs(A_b[i][k])){
maxx=abs(A_b[i][k]);
row=i;
}
}
if(abs(maxx)<=eps){
cout<<"该方程无解"<<endl;
return 0;
}
for(int j=k;j<=n+1;j++){//j控制列
double term=A_b[k][j];
A_b[k][j]=A_b[row][j];
A_b[row][j]=term;
}
for(int t=k+1;t<=n;t++){//t控制k+1行->n行
double m=A_b[t][k]/A_b[k][k];
for(int j=k;j<=n+1;j++){//j控制第t行的每一列
A_b[t][j]-=m*A_b[k][j];
}
}
//输出第k次变换之后增广矩阵的状态
cout<<"Output the state of the augmented matrix after the "<<k<<"-th transformation:"<<endl;
for(int i=1;i<=n;i++){
for(int j=1;j<=n+1;j++){
printf("%-10lf",A_b[i][j]);
}
cout<<endl;
}
}
double sum=1;
for(int i=1;i<=n;i++){
sum*=A_b[i][i];
}
if(abs(sum)<=eps){
cout<<"该方程组无解"<<endl;
return 0;
}
//回代
for(int i=n;i>=1;i--){
sum=0;
for(int j=n;j>=i+1;j--){
sum+=A_b[i][j]*X[j];
}
X[i]=(A_b[i][n+1]-sum)/A_b[i][i];
}
cout<<"The solution of this equation is:"<<endl;
for(int i=1;i<=n;i++){
cout<<"x"<<i<<"="<<X[i]<<endl;
}
return 0;
}
测试用例1:
x1-x2+2x3-x4=-8
2x1-2x2+3x3-3x4=-20
x1+x2+x3=-2
x1-x2+4x3+3x4=4
输入未知变量个数、系数矩阵和常数矩阵:
输出第k步消元后增广矩阵的状态:
输出该线性方程的解:
测试用例2:
2.0000x1-2.0000x2+3.0000x3-3.0000x4=-14
0.5000x1+2.0000x2-0.5000x3+1.5000x4=6
0.5000x1+2.5000x3+4.5000x4=4
0.5000x1+0.2000x3-0.4000x4=4
输入未知变量个数、系数矩阵和常数矩阵:
输出第k步消元后增广矩阵的状态:
输出该线性方程的解:
测试用例3:
0.00000008x1+2x2+3x3=1
-1x1+3.712x2+4.623x3=2
-2x1+1.072x2+5.643x3=3
输入未知变量个数、系数矩阵和常数矩阵:
输出第k步消元后增广矩阵的状态:
输出该线性方程的解:
测试用例4:
0.000000000012x1+0.000000000089x2+0.000000000065x3=2
0.000000000008x1+0.000000000007x2+0.000000000025x3=8
0.000000000010x1+0.000000000018x2+0.000000000096x3=6
输入未知变量个数、系数矩阵和常数矩阵:
发现该方程无解