fortran求逆矩阵的函数,python 矩阵求逆

  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的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: