高斯消元法解方程--gauss

来源:互联网 发布:中国水污染地图数据库 编辑:程序博客网 时间:2024/06/04 23:30
5月15号的创新班,我们做了两道题,还讲了一个新知识——高斯消元法。
高斯消元法其实就是我们学校里学的加减消元法,也就是通过两条式子通过乘法使两条方程的有一个相同的项,然后两条方程相减(加)来消去未知数。
看个例子吧:
高斯消元法解方程--gauss - 周正华 - 周正华的博客
原理就是这样了。
但是,我们要怎么用编程实现高斯消元法呢?
 我们看一下:
高斯消元法解方程--gauss - 周正华 - 周正华的博客
 但是会有一些特殊情况,比如有多组解,无解,或者是在编程中出现的一些小问题。高斯消元法解方程--gauss - 周正华 - 周正华的博客
所以我们先用一个数组存下整个方程,然后每次取一个绝对值最大的来消下面的式子(上面的已经消了)然后再使要消的元化成相同系数,相减,然后继续下一个元。
程序(还没有处理多解无解的情况):

#include <iostream>
#include <algorithm>
#include <cmath>
#include <fstream>
using namespace std;
ifstream fin("gauss.in");
ofstream fout("gauss.out");
//#define cin fin
//#define cout fout

int n,m;
double x[51][21]; //x[i][j]-> i个方程 j元
double ans[21];

void Read();
void del();
void getMax(int a,int b);
int gcd(int a,int b);
void getans();
void Write();

int main()
{
Read();
del();
Write();

return 0;
}

void Read()
{
cin>>n>>m;
for(int i=0;i<m;i++)
{
for(int j=1;j<=n;j++)
cin>>x[i][j];
cin>>x[i][0];
}
}

void del()
{
for(int i=0,j=1;i<m && j<=n;i++,j++)
{
getMax(i,j);
for(int k=i+1;k<m;k++)
{
int g=abs(gcd(x[i][j],x[k][j]));
int tmp1=abs(x[k][j]/g),tmp2=abs(x[i][j]/g);
int t=1;
if(x[i][j]*tmp1!=x[k][j]*tmp2)
t=-1;
for(int l=j;l<=n;l++)
x[k][l]=x[i][l]*tmp1-t*x[k][l]*tmp2;
x[k][0]=x[i][0]*tmp1-t*x[k][0]*tmp2;
//Write();
//cout<<"gcd:"<<g<<" t:"<<t<<endl;
}
}
getans();
}

void getMax(int a,int b)
{
int p=b;
for(int i=a;i<m;i++)
if(abs(x[p][b])<abs(x[i][b]))
p=i;
for(int i=0;i<=n;i++)
swap(x[p][i],x[a][i]);
}

int gcd(int a,int b)
{
if(a%b==0) return b;
return gcd(b,a%b);
}

void getans()
{
ans[n]=x[n-1][0]/x[n-1][n];
for(int i=n-1;i>=1;i--)
{
double tmp=0;
for(int j=i+1;j<=n;j++)
tmp+=x[i-1][j]*ans[j];
ans[i]=(x[i-1][0]-tmp)/x[i-1][i];
}
}

void Write()
{
/*cout<<endl;
for(int i=0;i<m;i++)
{
for(int j=1;j<=n;j++)
cout<<x[i][j]<<" ";
cout<<x[i][0];
cout<<endl;
}
*/
for(int i=1;i<=n;i++)
cout<<"x"<<i<<": "<<ans[i]<<endl;
}

好吧,现在没时间了,等回家再继续写吧.
 
1 0
原创粉丝点击