#include<iostream>
#include<math.h>
using namespace std;
#define MAX 100
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
double A[MAX+1][MAX+1];
double B[MAX+1];
double X[MAX+1];
double Z[MAX+1];
int D[MAX+1]; //未知变量位置的变化
int n;
int e;
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
void input()
![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif)
{
int i,j;
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
printf("n:");
scanf("%d",&n);
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
printf("A[][]:\n");
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
scanf("%lf",&A[i][j]);
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
printf("B[]:\n");
for(i=1;i<=n;i++)
scanf("%lf",&B[i]);
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
printf("e:");
scanf("%lf",&e);
}
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
void SwapE(double a,double b) //swap elements
![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif)
{
double T;
T=a;
a=b;
b=T;
}
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
void SwapR(int k,int kmi)
![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif)
{
int j;
for(j=k;j<=n;j++)
SwapE(A[k][j],A[kmi][j]);
}
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
void SwapC(int k,int kmj)
![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif)
{
int i;
for(i=k;i<=n;i++)
SwapE(A[i][k],A[i][kmj]);
}
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
void AllGaussianElimination()
![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif)
{
int kmi,kmj;//the i and j of the max(abs) element when k
int i,j,k;
double T;
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
for(i=1;i<=n;i++)//初始化位置变量位置
D[i]=i;
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
for(k=1;k<=n-1;k++)
![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
//选主元
T=0;
for(i=k;i<=n;i++)
for(j=k;j<=n;j++)
![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
if(fabs(A[i][j])>T)
{ T=fabs(A[i][j]); kmi=i;kmj=j;}
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
if(T<=e)
{printf("Error!\n"); return ;}
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
if(kmi!=k)
{ SwapR(k,kmi); SwapE(B[k],B[kmi]); }
![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
if(kmj!=k)
{ SwapC(k,kmj); SwapE(D[k],D[kmj]); }
//消元
for(i=k+1;i<=n;i++)
![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
T=A[i][k]/A[k][k];
B[i]-=T*B[k];
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
for(j=k;j<=n;j++)
A[i][j]-=T*A[k][j];
}
//回代
![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
if(A[n][n]<=e)
{printf("Error!\n");return ;}
Z[n]=B[n]/A[n][n];
double S_Aij_Zj;
for(i=n-1;i>=1;i--)
![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
S_Aij_Zj=0;
for(j=i+1;j<=n;j++)
S_Aij_Zj+=A[i][j]*Z[j];
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
Z[i]=(B[i]-S_Aij_Zj)/A[i][i];
}
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
for(j=1;j<=n;j++)
X[D[j]]=Z[j];
}
}
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
void print(double X[])
![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif)
{
int i;
printf("X[]:\n");
for(i=1;i<=n;i++)
printf("%f\n",X[i]);
}
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
int main()
![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif)
{
input();
AllGaussianElimination();
print(X);
system("pause");
return 0;
}
posted on 2009-05-16 16:37
wyiu 阅读(798)
评论(0) 编辑 收藏 引用 所属分类:
数值分析