急求高斯若当消去法的C++程序

2025-02-27 07:39:39
推荐回答(1个)
回答1:

//这个是我以前写的,vc编译器编译通过
#include
#include
#include
#include
using namespace std;

void swap(double &a,double &b)
{
double temp=a;
a=b;
b=temp;
}

/**********************************************
*函数名:InverseMatrix
*函数介绍:求逆矩阵(高斯—约当法)
*输入参数:矩阵首地址(二维数组)matrix,阶数row
*输出参数:matrix原矩阵的逆矩阵
*返回值:成功,0;失败,1
*调用函数:swap(double &a,double &b)
*作者:
*完成时间:2009-10-04
**********************************************/
int InverseMatrix(double *matrix,const int &row)
{
double *m=new double[row*row];
double *ptemp,*pt=m;

int i,j;

ptemp=matrix;
for (i=0;i{
for (j=0;j {
*pt=*ptemp;
ptemp++;
pt++;
}
}

int k;

int *is=new int[row],*js=new int[row];

for (k=0;k{
double max=0;
//全选主元
//寻找最大元素
for (i=k;i {
for (j=k;j {
if (fabs(*(m+i*row+j))>max)
{
max=*(m+i*row+j);
is[k]=i;
js[k]=j;
}
}
}

if (0 == max)
{
return 1;
}

//行交换
if (is[k]!=k)
{
for (i=0;i {
swap(*(m+k*row+i),*(m+is[k]*row+i));
}
}

//列交换
if (js[k]!=k)
{
for (i=0;i {
swap(*(m+i*row+k),*(m+i*row+js[k]));
}
}

*(m+k*row+k)=1/(*(m+k*row+k));

for (j=0;j {
if (j!=k)
{
*(m+k*row+j)*=*((m+k*row+k));
}
}

for (i=0;i {
if (i!=k)
{
for (j=0;j {
if(j!=k)
{
*(m+i*row+j)-=*(m+i*row+k)**(m+k*row+j);
}
}
}
}

for (i=0;i {
if(i!=k)
{
*(m+i*row+k)*=-(*(m+k*row+k));
}
}
}

int r;
//恢复
for (r=row-1;r>=0;r--)
{
if (js[r]!=r)
{
for (j=0;j {
swap(*(m+r*row+j),*(m+js[r]*row+j));
}
}
if (is[r]!=r)
{
for (i=0;i {
swap(*(m+i*row+r),*(m+i*row+is[r]));
}
}
}

ptemp=matrix;
pt=m;
for (i=0;i{
for (j=0;j {
*ptemp=*pt;
ptemp++;
pt++;
}
}
delete []is;
delete []js;
delete []m;

return 0;
}
int main()
{
double a[6*6];
int i;

for(i=0;i<36;i++)
{
a[i] = rand()%1000+1;
}
for(i=0;i<36;i++)
{
cout< if ((i+1)%6 == 0)
{
cout< }
}
cout< InverseMatrix(a,6);
for(i=0;i<36;i++)
{
cout< if ((i+1)%6 == 0)
{
cout< }
}
cout< system("pause");
return 0;
}