根据代数中的知识,可以使用伴随矩阵,也可以使用初等行变换进行求解,但是这样矩阵的维数大的情况下,该方法中矩阵的维数变大,计算量就会急剧变大,计算时间和使用存储器也会呈指数级急剧上升。 这种算法的生命力是不行的。
使用以下算法的计算量和使用存储器,特别是矩阵维数大时不会急剧变化。
求出高斯约旦法(选择所有主元)相反的步骤如下。
首先,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