C语言实现方阵的LU分解.doc

  1. 1、本文档共4页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
C语言实现方阵的LU分解

对n阶方阵A的LU分解 实验目的 掌握对n阶方阵A的LU分解方法,并用C语言编程实现;观察L、U矩阵的特征,并在此基础上得出求解方程方程组AX=b的方法。 实验原理 设矩阵的各阶顺序主子式均不为零,即:,则由定理: 设n阶方阵A的顺序主子式均不为零,则A的LU分解存在且唯一。 可得:A有分解式 =LU (1) 对比等式左边和右边乘积矩阵LU的第r行主对角元(含主对角元)的对应元素,得 (2) 再对比等式两边第r列主对角元以下(不含主对角元)的对应元素,得 (3) 当r=1时,由(2)和(3)式分别解出 (4) (5) 假设已求出U的第1至r-1行,L的第1至r-1列,由式(2)和式(3)分别得出计算U的第r行、L的第r列元素的计算公式: (6) (7) 称由(4)~(7)式所表示的矩阵分解为Doolittle分解,也称为LU分解。 程序实现过程 以下均为程序的关键部分: 输入矩阵A for(i=1;iN+1;i++) %控制行数 { printf(请输入矩阵第%d行元素:\n,i); for(j=1;jN+1;j++) %控制列数 scanf(%f,A[i][j]); %输入每行的矩阵元素 } 输入矩阵A后先判断A的各阶顺序主子式(即)是否全大于0,若不成立则不能进行LU分解 for(t=1,k=d[1][1];tN+1;t++) %控制阶数 { if(d[1][1]==0) 判断矩阵第一行是否为0,若为0则不分解 break; eLse { for(i=t+1;iN+1;i++) %进行第t次(行优先)所有元素的消元 { m=d[i][t]/d[t][t]; %计算行乘数 for(j=t+1;jN;j++) d[q][j]=d[q][j]-m*d[t][j]; %计算每次不为0的元素的值 m=0; %将m归零 } n=d[t+1][t+1]; %取主元n k*=n; %计算各阶的顺序主子式 } } 若可分解,进行LU分解。L为单位下三角矩阵,U为上三角矩阵。 for(r=2;rN+1;r++) %控制U的行数(L的列数) { for(j=r;jN+1;j++) %控制U的第r行的j列变化 { x=0; %初始化中间变量x for(k=1;kr;k++) x+=L[r][k]*U[k][j]; %待求元素之前对应的行和列的元素和 U[r][j]=c[r][j]-x; %计算U的第r行元素 } %往下是对L的第r列进行分解 for(i=r+1;iN+1;i++) %控制L的第r列的i行变化 { y=0; %初始化中间变量y for(k=1;kr;k++) y+=L[i][k]*U[k][r]; %待求元素之前对应的行和列的元素和 L[i][r]=(c[i][r]-y)/U[r][r]; %计算L的第r列元素 } } 实验结果及分析 运行程序后,输入待分解矩阵A(4*4) A=, 得到如下结果: 重新运行程序,输入待分解矩阵B(4*4) B=, 得到如下结果: 从上述两个不同矩阵的分解,可以看出: 只有矩阵为方阵且其各阶顺序主子式不为0(即为非奇异矩阵),才可以进行LU分解,并且分解式是唯一的;否则,不能进行LU分

文档评论(0)

zhuwenmeijiale + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

版权声明书
用户编号:7065136142000003

1亿VIP精品文档

相关文档