首页 > 编程知识 正文

c语言矩阵求逆代码,c语言上三角矩阵编写

时间:2023-05-04 01:00:25 阅读:60323 作者:2889

根据代数中的知识,可以使用伴随矩阵,也可以使用初等行变换进行求解,但是这样矩阵的维数大的情况下,该方法中矩阵的维数变大,计算量就会急剧变大,计算时间和使用存储器也会呈指数级急剧上升。 这种算法的生命力是不行的。

使用以下算法的计算量和使用存储器,特别是矩阵维数大时不会急剧变化。

求出高斯约旦法(选择所有主元)相反的步骤如下。

首先,k从0到n - 1如下所示。

从第k行、第k行开始

从列开头右下角的子模式中选择绝对值最大的元素,记住子元素所在的行号和列号,然后通过行交换和列交换将其替换为主元素的位置。 这一步称为全选主控。

m(k,k )=1/m,k ) ) )。

m(k,j )=m ) k,j ) *m ) k,k ),j=0,1,n-1; j!=k

m(I,j )=m ) I,j )-m ) I,k ),j ),I,j=0,1,n-1; I,j!=

K

m(I,k )=-m ) I,k ) *m ) k,k ),I=0,1,n-1; I!=k

最后,根据在全部选择主机的过程中记录的行、列交换的信息进行恢复。 恢复原则如下。 在全部选择母版的过程中,先更换的行、列稍后恢复; 原始行(列)的交换通过列(行)的交换恢复。

#include'stdio.h '

#include'malloc.h '

#include'math.h'//数学函数

Void主() )

{ int inv (双* p,int n );

双精度

a [4] [4]={ 1,2,0,0 },{ 2,5,0,0 },{ 0,0,0,0,1 },*ab;

ab=a[0];

int n=4,i=0,j;

I=inv(ab,n ); //调用矩阵求逆

if(I!=0(//返回值不为0时

for(I=0; I

{putchar((n );

for(j=0; Jj

printf('%f ',a[i][j];

}

}

int n (双精度* p,int n ) ) )。

{

void swap (双精度* a,双精度* b );

int *is,*js,I,j,k,l;

for(I=0; I

{putchar((n );

for(j=0; Jj

printf('%f ',* ) *(p i*n j );

}

puts((nnn ) n ) );

双精度模板,传真;

is=(int* ) malloc ) n * sizeof (int );

js=(int* ) malloc ) n * sizeof (int );

for(k=0; K

{

fmax=0.0;

for(I=k; I

for(j=k; Jj

{temp=Fabs(* ) pI*nj ); //查找最大值

是临时传真(if )

{ fmax=temp;

is[k]=i; js[k]=j;

}

}

if () fmax1.0 )==1.0 ) )。

{free(is ); free(js;

printf(noinv );

返回(0;

}

if () I=is[k]!=k )

for(j=0; Jj

SWAP(p ) k*nj )、p ) p(i*n j ); //更换指针

if () j=js[k]!=k )

for(I=0; I

SWAP(p(I*nk ),p ) p(i*n j ); //更换指针

p[k*n k]=1.0/p[k*n k];

for(j=0; Jj

if(j!=k )

p[k*n j]*=p[k*n k];

for(I=0; I

if(I!=k )

for(j=0; Jj

if(j!=k )

p [ I * NJ ]=p [ I * NJ ]-p [ I * NK ] * p [ k * NJ ];

for(I=0; I

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