www.pudn.com > gauss_xxx.rar > Gauss.cpp
#include "stdafx.h"
#include "memory.h"
#define _FABS(x) (x>0?x:(-x))
bool guass(double *g, double *b, double *x, int n)
{
int i,j,k,p;
int *flag;
double l;
flag = new int[n];
if( !flag )return false;
memset(flag,0,sizeof(int)*n);
//按列循环
for (i=0;i1e-8)
{
if(p==-1) p=j;
else if( _FABS((g[p*n+i]))<=_FABS((g[j*n+i])) ) p=j;
}
}
if (p==-1) return false;
if( _FABS((g[p*n+i]))<1e-8 )return false;
//flag[p]为零,表示p行还没有主元,为1+i,表示此行的主元是在i列上
flag[p]=1+i;
//逐行消去第i列系数元
for (j=0;j1e-8 )return false;
else if( i!=j && _FABS((m[i*n+j]))>1e-8 )return false;
}
}
return true;
}
//求逆矩阵(采用初等变换,高斯列主消元法)
bool matrix_reverse(double *m, int n, double *r)
{
int i,j,k,p;
int *flag;
double l;
double *tm;
flag = new int[n];
tm = new double[n*n];
if( !flag || !tm )
{
if( tm )delete[] tm;
if( flag )delete[] flag;
return false;
}
memset(flag,0,sizeof(int)*n);
memcpy(tm,m,sizeof(double)*n*n);
//将r置为单位方阵
matrix_toIdentity(r,4);
//按列循环
for(i=0;i1e-8)
{
if(p==-1) p=j;
else if( _FABS((m[p*n+i]))<_FABS((m[j*n+i])) ) p=j;
}
}
if( p==-1 ) return false;
if( _FABS((m[p*n+i]))<1e-8 )return false;
//flag[p]为零,表示p行还没有主元,为1+i,表示此行的主元是在i列上
flag[p]=1+i;
//逐行消去第i列系数元(不含拥有列主元的那一行)
for(j=0;j1e-8)
{
if(p==-1) p=j;
else if( _FABS((m[p*n+i]))<_FABS((m[j*n+i])) ) p=j;
}
}
if( p==-1 ) return false;
if( _FABS((m[p*n+i]))<1e-8 )return false;
//flag[p]为零,表示p行还没有主元,为1+i,表示此行的主元是在i列上
flag[p]=1+i;
//逐行消去第i列系数元(不含拥有列主元的那一行)
for(j=0;j=n )return false;
// 与当前行置换
if( j==i )continue;
for(k=0; k