posts - 100,  comments - 15,  trackbacks - 0
#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 阅读(712) 评论(0)  编辑 收藏 引用 所属分类: 数值分析

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理