fortran求逆矩阵的函数,python 矩阵求逆
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)是一个递归过程。
#包括
#定义N 10
Intdet(intARCS[n][n],int n)/第一行展开计算A
{
if(n==1).
{
返回圆弧[0][0];
}
int ans=0;
int temp[N][N];
int i,j,k;
for(I=0;我
{
for(j=0;姐姐
{
for(k=0;K
{
TEMP[j][k]=ARCS[j1][(k=I)?k1:k];
}
}
intt=det(temp,n-1);
if(I%2==0)))))).
{
ans=arcs[0][I]* t;
}
其他
{
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;我
{
for(j=0;姐姐
{
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);
小调(a,iA,4);
for(I=0;i4;我)
{
for(j=0;j4;j)
{
printf(%d ,A[I][j]);
}
print((n);
}
print((n);
for(I=0;i4;我)
{
for(j=0;j4;j)
{
printf(%f),)double)iA[I][j]/dA);
}
print((n);
}
0;
}
2高斯-乔丹消去法
它的优点是计算量大。但是你必须用实数。
#包括
#包括
#包括
#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 }
双b[N][N];
int n=4;
//用高斯消元法求这个矩阵的逆矩阵并输出。
if(inv ) a、b、n))
{
Printf(这个方阵的逆矩阵是:(n);
for(I=0;I n;我)
{
for(j=0;j n;j)
{
printf(%lf ,b[I][j]);
}
print((n);
}
}
0;
}
请参考。
//函数:用部分主成分的高斯消去法求方阵A的逆矩阵B
//Entry参数:输入方阵、输出方阵、方阵的顺序。
//返回值:真或假
请参考。
intinv(doublea () [n],doubleb ([ n ],int n))))))))))).
{
int i,j,k;
双倍最大温度;
双t[N][N];//临时矩阵
//A容纳假设矩阵t[n][n]中的矩阵
for(I=0;I n;我)
{
for(j=0;j n;j)
{
t[I][j]=A[I][j];
}
}
将//b矩阵初始化为单位数组。
for(I=0;I n;我)
{
for(j=0;j n;j)
{
b[I][j]=(I==j)?(双精度)1:0;
}
}
for(I=0;I n;我)
{
//找到主成分
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条线路时,进行线路交换。
如果(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行
{
如果(j!=not line=i//i。
{
temp=t[j][I];
for(k=0;k n;第k行的元素//第I行的元素*第j列和第I行的元素
{
t[j][k]=t[j][k]-t[I][k]* temp;
B[j][k]=B[j][k]-B[I][k]* temp;
}
}
}
}
1;
}
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。