首页 > 编程知识 正文

fortran矩阵求逆算法,python求逆

时间:2023-05-04 23:13:26 阅读:138538 作者:1645

1根据矩阵展开法

计算量很大。 但是,int型很方便,不需要使用浮点数。 以第一行的展开为例,求n*n方阵的逆。 这里,$A_{ij}$是减去I行和I列后剩下的方阵。

$$a^{-1}=FRAC{a^*}{det(a ) }$$

请求$A^{-1}$,先请求$A^*$和$det(a ) $。 求法如下。

$$a^*=((-1 ) ^{I1}det ) a_{ij} ) $$

$$det(a ) ) sum_{I=1}^n(-1 ) ^{1I}a_{1I}det ) a_{1I} ) $ $

可见,求det(a )是一个递归过程。

#包含

#define N 10

intdet(intARCS[n][n],int n ) /第一行展开计算|A|

{

if(n==1) )。

{

return arcs[0][0];

}

int ans=0;

int temp[N][N];

int i,j,k;

for(I=0; I

{

for(j=0; Jj

{

for(k=0; K

{

TEMP[j][k]=ARCS[j1][(k=I )? k 1:k];

}

}

intt=det(temp,n-1 );

if(I%2==0) ) ) ) ) )。

{

ans =arcs[0][i]*t;

}

else

{

ans -=arcs[0][i]*t;

}

}

返回ans;

}

voidminor(intARCS[n][n],intans[n],int n ) /计算每行中每个元素的馀数表达式,A*

{

if(n==1) )。

{

ans[0][0]=1;

返回;

}

int i,j,k,t;

int temp[N][N];

for(I=0; I

{

for(j=0; Jj

{

for(k=0; K

{

for(t=0; t

{

temp[k][t]=arcs[k=i? k 1:k][t=j? t 1:t];

}

}

ans[j][I]=det(temp,n-1 );

if () Ij ) %2==1) ) ) ) ) )。

{

ans[j][i]=- ans[j][i];

}

}

}

}

int main () )

{

int A[N][N]={{201,- 71,68,60 }、{-71,166,-49,-43}、{-68,-49,-208,-88}、{-60、-43

int iA[N][N];

int i,j,dA;

da=det(a,4 );

minor(a,iA,4 );

for(I=0; i4; I )

{

for(j=0; j4; j )

{

printf('%d ',A[i][j] );

}

打印((n );

}

打印((n );

for(I=0; i4; I )

{

for(j=0; j4; j )

{

printf('%f ),) double ) iA[i][j]/dA );

}

打印((n );

}

返回0;

}

2 Gauss-Jordan消元

优点是运算量好。 但是必须使用实数。

#包含

#包含

#包含

#define N 10 //定义方阵的最大阶数为10

//函数的声明部分

intinv(doublea[n][n],double B[N][N],int n ); //用部分主元的高斯消去法求方阵a的逆矩阵b

int main () )

{

double *buffer,*p; //定义数组开头地址指针变量

int row,num; //定义矩阵的行数和矩阵元素的个数

int i,j;

双细节; //定义矩阵的行列式

doublea [ n ] [ n ]={ 1,0.7,0.67,0.59 }、{ 0.7,1,0.47,0.42 }、{ 0.59,0.42,0 }

double b[N][N];

int n=4;

//用高斯消去法求该矩阵的逆矩阵并输出

if(inv ) a、b、n ) )

{

printf (该方阵的逆矩阵为:(n );

for(I=0; i n; I )

{

for(j=0; j n; j )

{

printf('%lf ',b[i][j] );

}

打印((n );

}

}

返回0;

}

请参见-------------------------------------------------

//功能:用部分主元的高斯消去法求方阵a的逆矩阵b

//入口参数:输入方阵、输出方阵、方阵的阶数

//返回值: true or false

请参见-------------------------------------------------

intinv(doublea () [n],doubleb ([ n ],int n ) ) ) ) ) ) ) ) ) )。

{

int i,j,k;

双最大,temp;

double t[N][N]; //临时矩阵

//A将矩阵容纳在假设矩阵t[n][n]中

for(I=0; i n; I )

{

for(j=0; j n; j )

{

t[i][j]=A[i][j];

}

}

将//b矩阵初始化为单位数组

for(I=0; i n; I )

{

for(j=0; j n; j )

{

b[I][j]=(I==j )? (双精度)1 : 0;

}

}

for(I=0; i n; I )

{

//寻找主元

max=t[i][i];

k=i;

for(j=I1; j n; j )

{

if(Fabs(t[j][I] ) fabs (max ) )

{

max=t[j][i];

k=j;

}

}

//主站所在的行不是第I行时,进行行交换

if(k!=i )

{

for(j=0; j n; j )

{

temp=t[i][j];

t[i][j]=t[k][j];

t[k][j]=temp;

//B伴有更换

temp=B[i][j];

B[i][j]=B[k][j];

B[k][j]=temp;

}

}

//判断主元是否为0,如果是,则矩阵a不是满秩矩阵,不存在逆矩阵

if(t ) I ) I )==0) ) ) )。

{

打印(thereisnoinversematrix! ' );

返回0;

}

//A的第I列删除I行以外的各行的要素

temp=t[i][i];

for(j=0; j n; j )

{

t[i][j]=t[i][j]/temp; //主对角线上的元素为1

B[i][j]=B[i][j]/temp; //伴有计算

}

for(j=0; j n; 第j//0行-第n行

{

if(j!=不是第=I//I行

{

temp=t[j][i];

for(k=0; k n; 第k//j行元素-第I行元素*第j列第I行元素

{

t[j][k]=t[j][k] - t[i][k] * temp;

B[j][k]=B[j][k] - B[i][k] * temp;

}

}

}

}

返回1;

}

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。