逆矩阵怎么求?

逆矩阵怎么求?,第1张

逆矩阵的求法

1、利用定义求逆矩阵

设A、B都是n阶方阵, 如果存在n阶方阵B 使得AB=BA=E, 则称A为可逆矩阵, 而称B为A的逆矩阵。

2、运用初等行变换法

将一n阶可逆矩阵A和n阶单位矩阵I写成一个nX2n的矩阵B=(A,I])对B施行初等行变换,即对A与I进行完全相同的若干初等行变换,目标是把A化为单位矩阵。当A化为单位矩阵I的同时,B的右一半矩阵同时化为了A的逆矩阵。

3、增广矩阵法

如果要求逆的矩阵是A,则对增广矩阵(A E)进行初等行变换,E是单位矩阵,将A化到E,此时此矩阵的逆就是原来E的位置上的那个矩阵,原理是 A逆乘以(A E)= (E A逆)初等行变换就是在矩阵的左边乘以A的逆矩阵得到的。

4、待定系数法

待定系数法顾名思义就是对未知数进行求解。用一个新的包含未定因子的多项式来表达多项式,从而获得一个恒等式。接着,利用恒等式的特性,推导出一类系数必须满足的方程或方程,再由方程组或方程组得到待确定的系数,或确定各系数之间的对应关系,称为待定系数法。

//源程序如下#include<stdio.h>

#include<conio.h>

#include<string.h>

#include<iostream.h>

#include<stdlib.h>

#include<math.h>

#define max 100void inputstyle(int *) //输入函数

void input(int **,int) //输入函数

long danx(int **,int)

int sgnx(int)

void martx(int **,int)int main(void)

{

int style=0,i=0

int matrix[max][max],*p[max]

for(i=0i<maxi++)*(p+i)=matrix[i] //*(p+i)是指针,指向第i个字符串

char exit1=' '

while(exit1!='E'&&exit1!='e'){ printf("求n阶矩阵的逆\n") inputstyle(&style)

input(p,style)

printf("原矩阵为:\n")

for(i=0i<stylei++){

for(int j=0j<stylej++){

printf("%4d",matrix[i][j])

}

printf("\n")

}

martx(p,style)

printf("\n")

printf("Exit=e Continue=Press any key\n")

cin>>exit1

fflush(stdin)

printf("\n\n")}

return(0)

} void input(int **p,int n){

for(int i=0i<ni++){

for(int j=0j<nj++){

printf("输入矩阵(%d行,%d列)元素:",j+1,i+1)

*(*(p+j)+i)=0

scanf("%d",*(p+j)+i)

fflush(stdin)

}

}

}void inputstyle(int *style){

do{

printf("输入矩阵n*n阶数n(0<n<%d):",max)

fflush(stdin)

scanf("%d",style)

fflush(stdin)

}while(*style<=0 &&*style>max)

}long danx(int **p,int n){

int i=0,j1=0,k1=0,j2=0,k2=0

long sum=0

int operate[max][max],*po[max]

for(i=0i<maxi++)*(po+i)=operate[i]if(n==1)return *(*(p+0)+0)

else{

for(i=0i<ni++){

for(j1=1,j2=0j1<nj1++,j2++){

k1=-1k2=-1

while(k2<n-1){

k1++

k2++

if(k1==i)k1++

*(*(po+j2)+k2)=*(*(p+j1)+k1)

}

}

/*for(int i1=0i1<n-1i1++){

for(int h1=0h1<n-1h1++){

printf("(%d,%d)%d ",i1,h1,*(*(po+h1)+i1))

}

printf("\n")

}*/

sum+=*(*(p+0)+i) * sgnx(1+i+1) * danx(po,n-1)

}

return sum

}

}int sgnx(int i){

if(i%2==0)return(1)

else return(-1)

}void martx(int **p,int n){

int i=0,j=0,j1=0,k1=0,j2=0,k2=0,num=0

int tramform[max][max]

int operate[max][max],*po[max]

for(i=0i<maxi++)*(po+i)=operate[i]

num=danx(p,n)

if(num==0)printf("矩阵不可逆\n")

else{

if(n==1)printf("矩阵的逆为: 1/%d\n",num)

else{

printf("矩阵的逆为: 系数 1/%d *\n",num)

for(i=0i<ni++){

for(j=0j<nj++){

j1=-1j2=-1

while(j2<n-1){

j1++j2++

if(j1==j)j1++ k1=-1k2=-1

while(k2<n-1){

k1++

k2++

if(k1==i)k1++

*(*(po+j2)+k2)=*(*(p+j1)+k1)

}

}

tramform[i][j]=sgnx(2+i+j) * danx(po,n-1)

}

}

for(i=0i<ni++){

for(j=0j<nj++){

printf("%4d",tramform[i][j])

}

printf("\n")

}

}

}

}

//运行结果//希望对你有帮助


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/8167223.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-14
下一篇 2023-04-14

发表评论

登录后才能评论

评论列表(0条)

保存