高斯消元法

来源:互联网 发布:java开发项目案例 编辑:程序博客网 时间:2024/06/08 00:52

根据数值分析的高斯消元算法,可写出C++的实现代码,如下所示:

#include<bits/stdc++.h>using namespace std;const int maxn=105;double a[maxn][maxn],m[maxn][maxn],b[maxn],x[maxn],det=1.0;int n;void input_data(){freopen("data.txt","r",stdin);cin>>n;for(int i=1;i<=n;i++){for(int j=1;j<=n;j++){cin>>a[i][j];}}for(int i=1;i<=n;i++) {cin>>b[i];}}void print(){for(int i=1;i<=n;i++){for(int j=1;j<=n;j++){printf("%.4lf ",a[i][j]);}printf("%.4lf\n",b[i]);}}void gauss(){for(int k=1;k<n;k++)//枚举每一行 {printf("===========\n");//我是分割线 print();//打印出消元过程,系数矩阵的变化 det*=a[k][k];for(int i=k+1;i<=n;i++)//利用第k行消第i行 {m[i][k]=a[i][k]/a[k][k];a[i][k]=0;for(int j=k+1;j<=n;j++)// 消第i行的第k列 {a[i][j]=a[i][j]-m[i][k]*a[k][j];}b[i]=b[i]-m[i][k]*b[k];}}x[n]=b[n]/a[n][n];//得到解x[n] for(int i=n-1;i>=1;i--)//依次求出解 {double sum=0.0;for(int j=i+1;j<=n;j++){sum+=a[i][j]*x[j];}x[i]=(b[i]-sum)/a[i][i];}printf("===========\n");print();det*=a[n][n];}void output_ans(){cout<<"ans is :"<<endl;for(int i=1;i<=n;i++) cout<<x[i]<<" ";cout<<endl;}void output_LU()//得到LU矩阵 {cout<<"Lower triangular matrix is :"<<endl;for(int i=1;i<=n;i++){for(int j=1;j<=n;j++){if(i==j) cout<<1<<" ";else if(i>j) cout<<m[i][j]<<" ";else cout<<0<<" ";}cout<<endl;}cout<<"Upper triangular matrix"<<endl;for(int i=1;i<=n;i++){for(int j=1;j<=n;j++){if(i<=j) cout<<a[i][j]<<" ";else cout<<0<<" ";}cout<<endl;}}void output_det()//得到行列式的值 {cout<<"the det value of matrix is :"<<endl;cout<<det<<endl;}int main(){//from text input data input_data();gauss();output_ans();return 0;} 

进一步,优化高斯消元法,可以得到列主元消元法

#include<bits/stdc++.h>using namespace std;const int maxn=105;double a[maxn][maxn],m[maxn][maxn],b[maxn],x[maxn],det=1.0;int n;void input_data(){freopen("data2.txt","r",stdin);cin>>n;for(int i=1;i<=n;i++){for(int j=1;j<=n;j++){cin>>a[i][j];}}for(int i=1;i<=n;i++) cin>>b[i];}void print(){for(int i=1;i<=n;i++){for(int j=1;j<=n;j++){printf("%.4lf ",a[i][j]);}printf("%.4lf\n",b[i]);}}void column_main_element(){for(int k=1;k<n;k++){printf("===========\n");print();int pos=k;for(int i=k+1;i<=n;i++)if(a[i][k]>a[pos][k]) pos=i;for(int i=k;i<=n;i++)swap(a[k][i],a[pos][i]);swap(b[k],b[pos]);det*=a[k][k];if(pos!=k) det*=-1;if(fabs(a[k][k])<1e-6){det=0.0;return ;}printf("==========\n");print();for(int i=k+1;i<=n;i++){m[i][k]=a[i][k]/a[k][k];a[i][k]=0;for(int j=k+1;j<=n;j++){a[i][j]=a[i][j]-m[i][k]*a[k][j];}b[i]=b[i]-m[i][k]*b[k];}}x[n]=b[n]/a[n][n];for(int i=n-1;i>=1;i--){double sum=0.0;for(int j=i+1;j<=n;j++){sum+=a[i][j]*x[j];}x[i]=(b[i]-sum)/a[i][i];}det*=a[n][n];printf("===========\n");print();}void output_ans(){for(int i=1;i<=n;i++) cout<<x[i]<<" ";cout<<endl;}int main(){input_data();column_main_element();output_ans();return 0;}
最后,利用高斯消元法,可以求逆矩阵。即gauss-jordan算法

#include<bits/stdc++.h>using namespace std;const int maxn=105;double a[maxn][maxn],m[maxn][maxn],b[maxn],x[maxn],det=1.0;int n;void input_data(){freopen("data4.txt","r",stdin);cin>>n;for(int i=1;i<=n;i++){for(int j=1;j<=n;j++){cin>>a[i][j];}a[i][n+i]=1;}for(int i=1;i<=n;i++) cin>>b[i];}void print(){for(int i=1;i<=n;i++){for(int j=1;j<=2*n;j++){printf("%.4lf ",a[i][j]);}printf("%.4lf\n",b[i]);}}void column_main_element(){for(int k=1;k<n;k++){//printf("===========\n");//print();int pos=k;for(int i=k+1;i<=n;i++)if(a[i][k]>a[pos][k]) pos=i;for(int i=k;i<=2*n;i++)swap(a[k][i],a[pos][i]);swap(b[k],b[pos]);det*=a[k][k];if(pos!=k) det*=-1;if(fabs(a[k][k])<1e-6){det=0.0;return ;}m[k][k]=1.0/a[k][k];for(int i=k+1;i<=n;i++){m[i][k]=a[i][k]/a[k][k];a[i][k]=0;for(int j=k+1;j<=2*n;j++){a[i][j]=a[i][j]-m[i][k]*a[k][j];}b[i]=b[i]-m[i][k]*b[k];}for(int j=k;j<=2*n;j++){a[k][j]=a[k][j]*m[k][k];}b[k]=b[k]*m[k][k];printf("===========\n");print();}m[n][n]=1.0/a[n][n];a[n][n]=a[n][n]*m[n][n];b[n]=b[n]*m[n][n];x[n]=b[n]/a[n][n];for(int p=n+1;p<=2*n;p++) {a[n][p]*=m[n][n];}//for(int i=n-1;i>=1;i--)//{//double sum=0.0;//for(int j=i+1;j<=n;j++)//{//sum+=a[i][j]*x[j];//}//x[i]=(b[i]-sum)/a[i][i];//}for(int i=n-1;i>=1;i--){for(int j=i;j>=1;j--){double tmp=-a[j][i+1];b[j]+=tmp*b[i+1];a[j][i+1]=0;for(int p=n+1;p<=2*n;p++){a[j][p]+=tmp*a[i+1][p]; } } x[i]=b[i];}det*=a[n][n];printf("===========\n");print();}void output_ans(){for(int i=1;i<=n;i++) cout<<x[i]<<" ";cout<<endl;}int main(){input_data();printf("==========\n");print();column_main_element();output_ans();return 0;}

实验数据1,解线性方程组,C++代码的输入:

3
1 1 1
0 4 -1
2 -2 1
6 5 1

其含义是

 x11   +   x12  +  x13=6

            4*x22  -  x23=5

2*x31 - 2*x32 +  x33=1

其得到的输出为:

===========
1.0000 1.0000 1.0000 6.0000
0.0000 4.0000 -1.0000 5.0000
2.0000 -2.0000 1.0000 1.0000
===========
1.0000 1.0000 1.0000 6.0000
0.0000 4.0000 -1.0000 5.0000
0.0000 -4.0000 -1.0000 -11.0000
===========
1.0000 1.0000 1.0000 6.0000
0.0000 4.0000 -1.0000 5.0000
0.0000 0.0000 -2.0000 -6.0000
ans is :
1 2 3



原创粉丝点击