老师刚教逆矩阵,我就觉得求逆矩阵很难算,假如求四阶以上的逆矩阵,至少也要四五分钟才能解决。于是我想到用C来解决了。顺便为自己上次写的文章升升级也好。说写就写,可我很快发现找求逆矩阵的算法并不轻易。想了很久,没办法,就去图书馆查资料。找是找到了“高斯全选主元法”在一本久版的《c常用算法程序集》上,可是看了半个小时,还是看不明白,想必大师之作不让我这小人物看懂。最后我下决心要自己找一个好的算法。
工夫不负有心人,我终于找到求逆矩阵的算法,而且有两种。这两种的算法都要调用到第一次写的《学数学也要学点偷懒的技术》里的函数。下面我只用了其中的一种算法。
数学依据是:逆矩阵=原矩阵的N阶行列式值的倒数*原矩阵的伴随阵。
条件:原矩阵的N阶行列式的值不能为零
请大家多多指教。
QQ:258220980
#include <stdio.h>
#include <math.h>
#include <conio.h>
#include <stdlib.h>
#define N 10
#define M 10
#define S 10
void njie_valu();
void njief_value();
float Dvalue(float a[N][N],int n);
void juzhench();
void nijuzhen();
void nijuzhen()
{
int i,j,n,m1,m2,n1,n2 ;
int k ;
float x[(N-1)*(N-1)];
float y,s ;
float a1[N][N],b[N][N],a[N][N],A[N][N],p[N][N],c[N][N];
clrscr();
printf("请输入是几阶矩阵: ");
scanf("%d",&n);
printf("请以正确的顺序输入矩阵:\n");
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
{
scanf("%f",&a[i][j]);
}
}
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
{
printf("%f ",a[i][j]);
}
printf("\n");
}
getch();
if(Dvalue(a,n)==0)
{
printf("D=0,没有逆矩阵!");
exit(1);
}
s=1.0/Dvalue(a,n);
for(m1=0;m1<n;m1++)
{
for(n1=0;n1<n;n1++)
a1[m1][n1]=a[m1][n1];
}
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
{
/*位于i行j列的元素变为0*/
for(m1=0;m1<n;m1++)
{
for(n1=0;n1<n;n1++)
if((m1==i)||(n1==j))
a1[m1][n1]=0 ;
}
k=0 ;
for(m1=0;m1<n;m1++)
{
for(n1=0;n1<n;n1++)
{
if(a1[m1][n1]!=0)
{
x[k]=a1[m1][n1];
k++;
}
}
}
k=0 ;
for(m2=0;m2<n-1;m2++)
{
for(n2=0;n2<n-1;n2++)
{
b[m2][n2]=x[k];
k++;
}
}
/*对数组a1从新赋值*/
for(m1=0;m1<n;m1++)
{
for(n1=0;n1<n;n1++)
a1[m1][n1]=a[m1][n1];
}
y=pow(-1,i+j);
A[i][j]=y*Dvalue(b,n-1);
}
}
printf("A:\n");
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
printf("%f ",A[j][i]);
printf("\n");
}
getch();
printf("1/|A|=%f\n ",s);
getch();
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
c[i][j]=0 ;
}
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
c[i][j]=c[i][j]+A[i][j]*s ;
}
printf("要求的逆矩阵是:\n");
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
printf("%f ",c[j][i]);
printf("\n");
}
getch();
}
void juzhench()
{
int i,j,k,m,n,s,s1 ;
float a[M][S],b[S][N],c[M][N];
printf("矩阵A是m*n矩阵。\n");
printf("请分别输入m,s的值:");
scanf("%d,%d",&m,&s);
if(m==0||s==0)
exit(0);
printf("矩阵B是s*n矩阵\n");
printf("请分别输入s,n的值: ");
scanf("%d,%d",&s1,&n);
if(n==0)
exit(0);
if(s!=s1)
{
printf("两次输入的s的值不一样,不能进行运算!\n");
exit(0);
}
for(i=0;i<m;i++)
{
for(j=0;j<n;j++)
c[i][j]=0 ;
}
printf("请输入矩阵A\n");
for(i=0;i<m;i++)
{
for(j=0;j<s;j++)
scanf("%f",&a[i][j]);
}
printf("请输入矩阵B:\n");
for(i=0;i<s;i++)
{
for(j=0;j<n;j++)
scanf("%f",&b[i][j]);
}
for(i=0;i<m;i++)
{
for(j=0;j<n;j++)
{
for(k=0;k<s;k++)
c[i][j]=c[i][j]+a[i][k]*b[k][j];
}
}
printf("相乘后的结果是:\n");
for(i=0;i<m;i++)
{
for(j=0;j<n;j++)
printf("%f ",c[i][j]);
printf("\n");
}
getch();
}
void njie_valu()
{
int i,j,n,k,h=0 ;
float x[N],a[N][N],D=1.0 ;
printf("说明:输入的n阶行列式,必须保证主对角线上的前n-1个元素都不为零!\n");
printf("请输入是几阶行列式:\n");
scanf("%d",&n);
if(n==0)
exit(0);
printf("请以行列式的正确顺序输入个元素:\n");
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
scanf("%f",&a[i][j]);
}
for(i=0,j=i;i<n-1,j<n-1;i++,j++)
if(a[i][j]==0)
h++;
if(h==n-1)
{
printf("请确保主对角线上前n-1个元素都不为零,请您调整!☆\n");
printf("");
exit(0);
}
for(k=0;k<n-1;k++)
{
for(i=k+1;i<n;i++)
x[i]=a[i][k]/a[k][k];
for(i=k+1;i<n;i++)
{
for(j=0;j<n;j++)
a[i][j]=a[i][j]-a[k][j]*x[i];
}
}
/*(for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
printf("%f ",a[i][j]);
printf("\n");
}*/
printf("\n");
for(i=0,j=0;i<n,j<n;i++,j++)
D=D*a[i][j];
printf("D= %f",D);
getch();
}
void njief_value()
{
float D ;
float Dvalue(float[N][N],int n);
int i,j,k,n,h,m ;
float a[N][N],x[N],b[N],D1[N],a1[N][N],vable[N];
printf("说明::输入的n阶行列式,必须保证n阶线性方程的系数及系数和常数项构成的行列式主对角线上的前n-1个元素都不为零!\n");
printf("请输入是几阶线性方程: ");
scanf("%d",&n);
if(n==0)
exit(0);
printf("请以行列式的正确顺序输入个元素:\n");
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
scanf("%f",&a[i][j]);
}
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
printf("%f ",a[i][j]);
printf("\n");
}
printf("按正确顺序输入常数项:\n");
for(i=0;i<n;i++)
scanf("%f",&b[i]);
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
a1[i][j]=a[i][j];
}
D=Dvalue(a1,n);
printf("D= %f",D);
getch();
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
a1[i][j]=a[i][j];
}
for(i=0;i<n;i++)
{
for(k=0;k<n;k++)
a1[k][i]=b[k];
for(m=0;m<n;m++)
{
for(h=0;h<n;h++)
printf("%f ",a1[m][h]);
printf("\n");
}
printf("\n");
D1[i]=Dvalue(a1,n);
printf("D%d= %f\n",i+1,D1[i]);
getch();
for(h=0;h<n;h++)
{
for(m=0;m<n;m++)
a1[h][m]=a[h][m];
}
}
for(i=0;i<n;i++)
vable[i]=D1[i]/D ;
for(i=0;i<n;i++)
{
printf("x%d=%f",i+1,vable[i]);
printf("\n");
}
getch();
}
float Dvalue(float a[N][N],int n)
{
int i,j,k ;
float x[N],D=1.0 ;
for(k=0;k<n-1;k++)
{
for(i=k+1;i<n;i++)
x[i]=a[i][k]/a[k][k];
for(i=k+1;i<n;i++)
{
for(j=0;j<n;j++)
a[i][j]=a[i][j]-a[k][j]*x[i];
}
}
/* for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
printf("%f ",a[i][j]);
printf("\n");
}
printf("\n");
*/
for(i=0,j=0;i<n,j<n;i++,j++)
D=D*a[i][j];
return(D);
}
void main()
{
int i,j=1 ;
do
{
clrscr();
printf("1.解n阶行列式\t2.解n阶线性方程\t 3.求矩阵相乘\t 4.求逆矩阵\t0.退出\n");
printf("请输入所需功能的序号:");
scanf("%d",&i);
switch(i)
{
case 1 :
njie_valu();
break ;
case 2 :
njief_value();
break ;
case 3 :
juzhench();
break ;
case 4 :
nijuzhen();
break ;
case 0 :
j=0 ;
break ;
}
}
while(j);
}
Word教程网 | Excel教程网 | Dreamweaver教程网 | Fireworks教程网 | PPT教程网 | FLASH教程网 | PS教程网 |
HTML教程网 | DIV CSS教程网 | FLASH AS教程网 | ACCESS教程网 | SQL SERVER教程网 | C语言教程网 | JAVASCRIPT教程网 |
ASP教程网 | ASP.NET教程网 | CorelDraw教程网 |