预览加载中,请您耐心等待几秒...
1/10
2/10
3/10
4/10
5/10
6/10
7/10
8/10
9/10
10/10

亲,该文档总共13页,到这已经超出免费预览范围,如果喜欢就直接下载吧~

如果您无法下载资料,请参考说明:

1、部分资料下载需要金币,请确保您的账户上有足够的金币

2、已购买过的文档,再次下载不重复扣费

3、资料包下载后请先用软件解压,在使用对应软件打开

题目要求 给定一个多维矩阵,实现该矩阵的求逆运算。 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.2L矩阵和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<stdio.h> #include<string.h> #defineN4 voidmain() {floata[N][N]; floatL[N][N],U[N][N],out[N][N],out1[N][N]; floatr[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)); intn=N; intk,i,j; intflag=1; floats,t; ////////////////////inputamatrix//// printf("\ninputA="); for(i=0;i<n;i++) for(j=0;j<n;j++) scanf("%f",&a[i][j]); //////////////////figuretheinputmatrix////////////////////////// printf("输入矩阵:\n"); for(i=0;i<n;i++) { for(j=0;j<n;j++) { printf("%lf",a[i][j]); } printf("\n"); } for(j=0;j<n;j++) a[0][j]=a[0][j];//计算U矩阵的第一行 for(i=1;i<n;i++) a[i][0]=a[i][0]/a[0][0];//计算L矩阵的第1列 for(k=1;k<n;k++) { for(j=k;j<n;j++) { s=0; for(i=0;i<k;i++) s=s+a[k][i]*a[i][j];//累加 a[k][j]=a[k][j]-s;//计算U矩阵的其他元素 } for(i=k+1;i<n;i++) { t=0; for(j=0;j<k;j++) t=t+a[i][j]*a[j][k];//累加 a[i][k]=(a[i][k]-t)/a[k][k];//计算L矩阵的其他元素 } } for(i=0;i<n;i++) for(j=0;j<n;j++) {if(i>j) {L[i][j]=a[i][j];U[i][j]=0;}//如果i>j,说明行大于列,计算矩阵的下三角部分,得