2000字范文,分享全网优秀范文,学习好帮手!
2000字范文 > LU分解法c语言程序设计 矩陣LU分解求逆详细分析与C语言实现.doc

LU分解法c语言程序设计 矩陣LU分解求逆详细分析与C语言实现.doc

时间:2024-07-18 20:16:51

相关推荐

LU分解法c语言程序设计 矩陣LU分解求逆详细分析与C语言实现.doc

矩陣LU分解求逆详细分析与C语言实现

题目要求

给定一个多维矩阵,实现该矩阵的求逆运算。

1、理论分析

矩阵的一种有效而广泛应用的分解方法是矩阵的LU三角分解,将一个n阶矩阵A分解为一个下三角矩阵L和一个上三角矩阵U的乘积。所以首先对矩阵进行三角分解,这里采用Doolittle分解,即分解为一个下三角矩阵(对角元素为1),和一个上三角矩阵的乘积。再进行相应的处理。

所以,矩阵求逆的算法流程可表述如下:

图1 矩阵求逆流程图

1)进行LU分解;

2)对分解后的L阵(下三角矩阵)和U阵(上三角矩阵)进行求逆;;

3)L阵的逆矩阵和U阵的逆矩阵相乘,即可求得原来矩阵的逆。即:

(1)

1.1矩阵的LU 分解

若n阶方阵 的各阶顺序主子式不等于零,即:

(2)

则A的LU分解存在且唯一。

(3)

由矩阵的乘法原理, 可推导出LU分解的迭代算法

(4)

(5)

(6)

(7)

矩阵的LU分解是一个循环迭代的过程, U矩阵是从第1行迭代到第n行, 而L矩阵则是从第1列迭代到第n列, 且U矩阵先于L矩阵一个节拍。

1.2 L矩阵和U矩阵求逆

首先假设下三角矩阵L的逆矩阵为,不失一般性,考虑4阶的情况,利用,有:

(1) ,,;

(2)

(3)

(4)。

从而求得下三角矩阵L的逆矩阵R式如下:

, (8)

上三角矩阵U的逆矩阵可以由下式得到:。

, (9)

矩阵求逆是一个迭代的过程,依次循环, 迭代次, 求出整个逆矩阵。其中U矩阵的循环迭代时按行顺序,列倒序进行,L矩阵的循环迭代按列顺序,行顺序进行,直到计算出整个矩阵的所有结果为止。

1.3 矩阵相乘

上三角矩阵U的逆矩阵u与下三角矩阵L的逆矩阵相乘, 最终得到原始矩阵A的逆矩阵, 完成整个矩阵求逆的过程。对于n阶矩阵相乘的迭代形式可表示如下:

(10)

1.4 实例分析

例:给定一4阶矩阵,通过LU分解求逆矩阵。

解:算法过程为:,

第一步:求LU矩阵

设,通过(4)~(7)式可逐步进行矩阵L和U中元素的计算,如下所示:

经迭代计算,最后得到L和U矩阵为:

第二步:求L和U矩阵的逆,

(1)求U矩阵的逆

由式(9)可得矩阵U的逆的各元素计算如下:

(2)求L矩阵的逆

由(8)式可得L矩阵的逆的各元素计算如下

所以得到L和U的逆矩阵为:

(3)求A的逆矩阵

由式(10)可计算得到矩阵A的逆,如下:

由程序计算出的结果如下:

2、C语言程序设计及测试

2.1 算法c程序实现

#include

#include

#define N 4

void main()

{ float a[N][N];

float L[N][N],U[N][N],out[N][N], out1[N][N];

float r[N][N],u[N][N];

memset( a , 0 , sizeof(a));

memset( L , 0 , sizeof(L));

memset( U , 0 , sizeof(U));

memset( r , 0 , sizeof(r));

memset( u , 0 , sizeof(u));

int n=N;

int k,i,j;

int flag=1;

float s,t;

input a matrix

printf("\ninput A=");

for(i=0;i

for(j=0;j

scanf("%f",&a[i][j]);

//figure the input matrix//

printf("输入矩阵:\n");

for(i=0;i

{

for (j = 0; j < n; j++)

{

printf("%lf ", a[i][j]);

}

printf("\n");

}

for(j=0;j

a[0][j]=a[0][j]; //计算U矩阵的第一行

for(i=1;i

a[i][0]=a[i][0]/a[0][0];

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。