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;
}