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