![]() |
#2
ltyjyufo2010-05-06 15:38
|
#include<stdio.h>
#include<math.h>
#include<stdlib.h>
#include <iostream>
#define M 4
/*********************************************************************************************
函数名:juzhenqiuni
功能:求矩阵(g+jb)(n1*n1阶)的逆矩阵
参数:由g[M][M],b[M][M], n1传递
返回值:由(g+jb)(n1*n1阶)带回
**********************************************************************************************/
void juzhenqiuni(float g[M][M],float b[M][M],int n1)
{
static float Re,Im,t,d;
static float E[M][M]={0.0},g1[M][2*M]={0.0},b1[M][2*M]={0.0};
int i,j,k;
/*********************************************************************************************
以下为形成增广矩阵的过程
**********************************************************************************************/
for(i=1;i<=n1;i++) E[i][i]=1;
for(i=1;i<=n1;i++)
for(j=1;j<=n1;j++)
{
g1[i][j]=g[i][j];g1[i][j+n1]=E[i][j];
b1[i][j]=b[i][j];
}
/********************************************************************************************
以下为求逆的过程
*********************************************************************************************/
k=1;
do{
Re=g1[k][k]/(g1[k][k]*g1[k][k]+b1[k][k]*b1[k][k]);
Im=-b1[k][k]/(g1[k][k]*g1[k][k]+b1[k][k]*b1[k][k]);
for(j=k+1;j<=2*n1;j++)
{t=g1[k][j];d=b1[k][j];
g1[k][j]=t*Re-d*Im;
b1[k][j]=d*Re+t*Im;
}
for(i=k+1;i<=n1;i++)
for(j=k+1;j<=2*n1;j++)
{
g1[i][j]=g1[i][j]-g1[i][k]*g1[k][j]+b1[i][k]*b1[k][j];
b1[i][j]=b1[i][j]-g1[i][k]*b1[k][j]-b1[i][k]*g1[k][j];
}
k++;
}while(k<=n1);
if(k!=1)
{
for(i=n1-1;i>=1;i--)
for(k=n1;k>i;k--)
for(j=n1+1;j<=2*n1;j++)
g1[i][j]=g1[i][j]-g1[i][k]*g1[k][j]+b1[i][k]*b1[k][j];
b1[i][j]=b1[i][j]-g1[i][k]*b1[k][j]-b1[i][k]*g1[k][j];
}
for(i=1;i<=n1;i++)
for(j=1;j<=n1;j++)
{
g[i][j]=g1[i][j+n1];
b[i][j]=b1[i][j+n1];
}
}
void main()
{
float g[4][4]={0,0,0,0,0,1,2,3,0,2,2,1,0,3,4,3};
float b[4][4]={0};
int n1,j,i;
FILE *fp1;
n1=3;
fp1=fopen("output.txt","w");
for(i=1;i<=3;i++)
{
fprintf(fp1,"\n");
for(j=1;j<=3;j++)
fprintf(fp1,"%8.4f+j%8.4f ",g[i][j],b[i][j]);
}
fprintf(fp1,"\n");
juzhenqiuni(g,b,n1);
for(i=1;i<=3;i++)
{
fprintf(fp1,"\n");
for(j=1;j<=3;j++)
fprintf(fp1,"%8.4f+j%8.4f ",g[i][j],b[i][j]);
}
fclose(fp1);
}