列主元高斯消元算法

列主元高斯消元算法
#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  e;
int  n;

void  ColGaussianElimination()
{
    
int i,j,k,kmi;
    
double T;
    
for(k=1;k<=n-1;k++)
    
{
        
//选主元
        T=0;
        
for(i=k;i<=n;i++)
            
if( fabs(A[i][k])> T ){ T=A[i][k];kmi=i;}
        
if( T<=e) { printf("Error!\n"); return ;}
        
if(kmi!=k)
        
{
            T
=B[k];B[k]=B[kmi];B[kmi]=T; //swap B[k] and B[kmi]
            for(j=k;j<=n;j++//swap row kmi and k of A
            {
                T
=A[k][j];
                A[k][j]
=A[kmi][j];
                A[kmi][j]
=T;
            }

        }

        
//消元
        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( fabs(A[n][n])<=e ) { printf("Error!\n"); return ;}

    X[n]
=B[n]/A[n][n];

    
double S_Aij_Xj;
    
for(i=n-1;i>=1;i--)
    
{
        S_Aij_Xj
=0;
        
for(j=i+1;j<=n;j++)
            S_Aij_Xj
+=A[i][j]*X[j];

        X[i]
=(B[i]-S_Aij_Xj)/A[i][i];
    }

}

void  print( double  X[])
{
    
int i;
    printf(
"X[]:\n");
    
for(i=1;i<=n;i++)
        printf(
"%f\n",X[i]);
}


int  main()
{
    
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);

    ColGaussianElimination();
    print(X);
    system(
"pause");
    
return 0;
}


你可能感兴趣的:(列主元高斯消元算法)