逆矩阵的求法主要有以下两种:
1、利用定义求逆矩阵。
定义:设A、B都是n阶方阵,如果存在n阶层方阵B使得AB=BA=E。则称A为可逆矩阵,而称B为A的逆矩阵。
2、是初等变换法
求元素为具体数字的矩阵的逆矩阵,常用初等变换法。如果A可逆,则A通过初等变换,化为单位矩阵I,即存在矩阵P1、P2、Ps使得:
(1)P1P2PsA=I,用A的负一次方右乘上式两端。
(2)P1P2PsI=A的负一次方。
比较(1)(2)两式,可以看到当A通过初等变换华为单位矩阵的同时,对单位矩阵I作同样的初等变换,就化为A的逆矩阵A的负一次方。这就是初等变换法在求逆矩阵中的应用。它是实际应用中比较简单的一种方法,需要注意的是,在作初等变换时只允许作行初等变换。同样,只作列初等变换也可以求逆矩阵。
#include <stdlibh>
#include <mathh>
#include <stdioh>
int brinv(double a[], int n)
{ int is,js,i,j,k,l,u,v;
double d,p;
is=malloc(nsizeof(int));
js=malloc(nsizeof(int));
for (k=0; k<=n-1; k++)
{ d=00;
for (i=k; i<=n-1; i++)
for (j=k; j<=n-1; j++)
{ l=in+j; p=fabs(a[l]);
if (p>d) { d=p; is[k]=i; js[k]=j;}
}
if (d+10==10)
{ free(is); free(js); printf("errnot inv\n");
return(0);
}
if (is[k]!=k)
for (j=0; j<=n-1; j++)
{ u=kn+j; v=is[k]n+j;
p=a[u]; a[u]=a[v]; a[v]=p;
}
if (js[k]!=k)
for (i=0; i<=n-1; i++)
{ u=in+k; v=in+js[k];
p=a[u]; a[u]=a[v]; a[v]=p;
}
l=kn+k;
a[l]=10/a[l];
for (j=0; j<=n-1; j++)
if (j!=k)
{ u=kn+j; a[u]=a[u]a[l];}
for (i=0; i<=n-1; i++)
if (i!=k)
for (j=0; j<=n-1; j++)
if (j!=k)
{ u=in+j;
a[u]=a[u]-a[in+k]a[kn+j];
}
for (i=0; i<=n-1; i++)
if (i!=k)
{ u=in+k; a[u]=-a[u]a[l];}
}
for (k=n-1; k>=0; k--)
{ if (js[k]!=k)
for (j=0; j<=n-1; j++)
{ u=kn+j; v=js[k]n+j;
p=a[u]; a[u]=a[v]; a[v]=p;
}
if (is[k]!=k)
for (i=0; i<=n-1; i++)
{ u=in+k; v=in+is[k];
p=a[u]; a[u]=a[v]; a[v]=p;
}
}
free(is); free(js);
return(1);
}
void brmul(double a[], double b[],int m,int n,int k,double c[])
{ int i,j,l,u;
for (i=0; i<=m-1; i++)
for (j=0; j<=k-1; j++)
{ u=ik+j; c[u]=00;
for (l=0; l<=n-1; l++)
c[u]=c[u]+a[in+l]b[lk+j];
}
return;
}
int main()
{ int i,j;
static double a[4][4]={ {02368,02471,02568,12671},
{11161,01254,01397,01490},
{01582,11675,01768,01871},
{01968,02071,12168,02271}};
static double b[4][4],c[4][4];
for (i=0; i<=3; i++)
for (j=0; j<=3; j++)
b[i][j]=a[i][j];
i=brinv(a,4);
if (i!=0)
{ printf("MAT A IS:\n");
for (i=0; i<=3; i++)
{ for (j=0; j<=3; j++)
printf("%137e ",b[i][j]);
printf("\n");
}
printf("\n");
printf("MAT A- IS:\n");
for (i=0; i<=3; i++)
{ for (j=0; j<=3; j++)
printf("%137e ",a[i][j]);
printf("\n");
}
printf("\n");
printf("MAT AA- IS:\n");
brmul(b,a,4,4,4,c);
for (i=0; i<=3; i++)
{ for (j=0; j<=3; j++)
printf("%137e ",c[i][j]);
printf("\n");
}
}
}
这个行么?不知道是不是你要的,希望对你有用
逆矩阵求法有三种,分别是伴随矩阵法、初等变换法和待定系数法。
一、伴随矩阵法。根据逆矩阵的定义(对于n阶方阵A,如果有一个n阶方阵B满足AB=BA=E,则A是可逆的。),可以得出逆矩阵的计算公式:A^(-1)=1/|A|乘以A,其中,A为矩阵A的伴随矩阵。例题如下:
伴随矩阵法解题过程
注:用伴随矩阵法计算逆矩阵时需要运用代数余子式和余子式的相关知识,即代数余子式(Aij)和余子式(Mij),其中,i表示第几行,j表示第几列。
二、初等变换法。根据矩阵初等行变换的计算方式,然后引入单位矩阵E(矩阵对角线所对应的三个数字均为1,其他数字均为0的矩阵)。矩阵 A与单位矩阵E组成一个大矩阵,而后通过行变换将原来A的位置转变为E,此时,变换后的E就是所求的逆矩阵。
本人手写笔记
三、待定系数法。根据矩阵定义的推论,利用矩阵A乘以它的逆矩阵A^(-1)等于单位矩阵E的计算公式求得逆矩阵的方法。这种计算过程繁琐,需要列多组方程组,耗时,不建议使用。
题主可根据以上三种计算方法计算逆矩阵,希望对题主有帮助。
main()
{
int i,a[5]={1,2,3,4,5};
printf("juzhen ni zhen is:\n");
for (i=4;i>=0;i--)
printf("%d ",a[i]);
}
输出结果:5 4 3 2 1
满足题目要求吧,我相信你是初学者才会问这样的问题,所以我才没有搞那么复杂,如果是复杂化的话你就不会问了,对吧!
以上就是关于逆矩阵怎么求全部的内容,包括:逆矩阵怎么求、矩阵求逆 C程序、怎么求一个矩阵的逆矩阵等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)