LU分解求线性方程组的解 - 范文中心

LU分解求线性方程组的解

09/16

LU分解是矩阵分解的一种,可以将一个矩阵分解为一个上三角矩阵和一个下三角矩阵的乘积。

LU分解可以用来求逆矩阵,解线性方程组等。本文将介绍LU分解求线性方程组的解。

1.定义

如果A是一个方阵,A的LU分解是将A分解成如下形式:

其中L,U分别为下三角矩阵和上三角矩阵。

2.例子

对于如下矩阵A,对A进行LU分解

首先将矩阵第一列对角线上元素A11下面的元素通过矩阵初等行变换变为0,

然后再将矩阵第二列对角线上元素A22 下面的元素通过矩阵初等行变换变为0。

则得到的上三角矩阵就是U。这个时候,L也已经求出来了。通过将下三角形主对角线上的元素

都置为1,乘数因子放在下三角相应的位置(放在消元时将元素变为0的那个元素的位置),就

可以得到下三角矩阵L。如下:

对于L的构造,举个例子。如将第一列的元素2变为0时,第二行减去第一行乘以2,于是A21

就变成了0。这个乘数因子将元素A21变成了0,对应的,下三角矩阵L中对应位置的元素L21就为

乘数因子2。其它的与之类似。

3.LU分解程序实现(java实现)

通过上面举的例子,我们应该对LU分解的过程有了一个大致的了解。接下来可以看看程序

是怎么实现LU分解的,进一步加深对LU分解的了解。

[java] view plain copy

/**

* Get matrix L and U. list.get(0) for L, list.get(1) for U

* @param a - Coefficient matrix of the equations

* @return matrix L and U, list.get(0) for L, list.get(1) for U

*/

private static List decomposition(double[][] a) {

final double esp = 0.000001;

double[][] U = a;

double[][] L = createIdentiyMatrix(a.length);

for(int j=0; j

if(Math.abs(a[j][j])

throw new IllegalArgumentException("zero pivot encountered.");

}

for(int i=j+1; i

double mult = a[i][j] / a[j][j];

for(int k=j; k

U[i][k] = a[i][k] - a[j][k] * mult;

}

L[i][j] = mult;

}

}

return Arrays.asList(L, U);

}

上面函数中出现的 createIdentiyMatrix 函数就是创建一个 a.length()行a.length()列的单位矩阵。

Math.abs(a[j][i])

的作用是当主元为0时,经典的LU分解算法不再适用,后面将进一步谈论这个。

4.LU分解解线性方程组

通过上面的介绍,我们已经知道,一个方阵A可以分解成 A=LU的形式(这里假设矩阵A能够进行LU分解)。

对于一个线性方程组 Ax=b,则由 A=LU 有 LUx = b。

为了求出x,我们可以先将Ux看成一个整体V(V=UX),通过求解线性方程组 LV=b 得到V,即Ux,

再通过求解线性方程组 Ux=V 即可求出 x。

看到这里,你可能会觉得这样求解很麻烦。但是,别忘了L和U分别是下三角矩阵和上三角矩阵,

求解释很容易,不需要通过高斯消去法等求线性方程组的算法来求解。

首先来看一下 LV=b 求解V的程序代码:

[java] view plain copy

/**

* Get U multiply X

* @param a - Coefficient matrix of the equations

* @param b - right-hand side of the equations

* @param L - L of LU Decomposition

* @return U multiply X

*/

private static double[] getUMultiX(double[][] a, double[] b, double[][] L) {

double[] UMultiX = new double[a.length];

for(int i=0; i

double right_hand = b[i];

for(int j=0; j

right_hand -= L[i][j] * UMultiX[j];

}

UMultiX[i] = right_hand / L[i][i];

}

return UMultiX;

}

然后是 Ux=V 求解的程序代码:

[java] view plain copy

/**

* Get solution of the equations

* @param a - Coefficient matrix of the equations

* @param U - U of LU Decomposition

* @param UMultiX - U multiply X

* @return Equations solution

*/

private static double[] getSolution(double[][] a, double[][] U,

double[] UMultiX) {

double[] solutions = new double[a[0].length];

for(int i=U.length-1; i>=0; i--) {

double right_hand = UMultiX[i];

for(int j=U.length-1; j>i; j--) {

right_hand -= U[i][j] * solutions[j];

}

solutions[i] = right_hand / U[i][i];

}

return solutions;

}

这两个求解过程 是不是很简单 ?

如果觉得整个LU分解求解方程组的解过程 还没有连接起来的话,可以看看下面整个程序的完整代码。

[java] view plain copy

import java.util.Arrays;

import java.util.List;

public class LUDecomposition {

/**

* Get solutions of the equations

* @param a - Coefficient matrix of the equations

* @param b - right-hand side of the equations

* @return solution of the equations

*/

public static double[] solve(double[][] a, double[] b) {

List LAndU = decomposition(a);  //LU decomposition

double[][] L = LAndU.get(0);

double[][] U = LAndU.get(1);

double[] UMultiX = getUMultiX(a, b, L);

return getSolution(a, U, UMultiX);

}

/**

* Get solution of the equations

* @param a - Coefficient matrix of the equations

* @param U - U of LU Decomposition

* @param UMultiX - U multiply X

* @return Equations solution

*/

private static double[] getSolution(double[][] a, double[][] U,

double[] UMultiX) {

double[] solutions = new double[a[0].length];

for(int i=U.length-1; i>=0; i--) {

double right_hand = UMultiX[i];

for(int j=U.length-1; j>i; j--) {

right_hand -= U[i][j] * solutions[j];

}

solutions[i] = right_hand / U[i][i];

}

return solutions;

}

/**

* Get U multiply X

* @param a - Coefficient matrix of the equations

* @param b - right-hand side of the equations

* @param L - L of LU Decomposition

* @return U multiply X

*/

private static double[] getUMultiX(double[][] a, double[] b, double[][] L) {

double[] UMultiX = new double[a.length];

for(int i=0; i

double right_hand = b[i];

for(int j=0; j

right_hand -= L[i][j] * UMultiX[j];

}

UMultiX[i] = right_hand / L[i][i];

}

return UMultiX;

}

/**

* Get matrix L and U. list.get(0) for L, list.get(1) for U

* @param a - Coefficient matrix of the equations

* @return matrix L and U, list.get(0) for L, list.get(1) for U

*/

private static List decomposition(double[][] a) {

double[][] U = a;

double[][] L = createIdentityMatrix(a.length);

for(int j=0; j

if(a[j][j] == 0) {

throw new IllegalArgumentException("zero pivot encountered.");

}

for(int i=j+1; i

double mult = a[i][j] / a[j][j];

for(int k=j; k

U[i][k] = a[i][k] - a[j][k] * mult;

}

L[i][j] = mult;

}

}

return Arrays.asList(L, U);

}

private static double[][] createIdentityMatrix(int row) {

double[][] identityMatrix = new double[row][row];

for(int i=0; i

for(int j=i; j

if(j == i) {

identityMatrix[i][j] = 1;

} else {

identityMatrix[i][j] = 0;

}

}

}

return identityMatrix;

}

}

      5. LU分解的不足及改进

经典的LU分解算法当方阵中主元(主对角线上的元素) 出现0时,上面介绍的经典LU分解算法将失效,

上面的算法中也已经体现出来了。不过,我们可以在A=LU分解的基础上做出比较小的改动,就可以

使这个算法在上述情况下来能适用。随人 PA=LU 方法也可以解决这一问题,但是计算的耗费较大,

我们可以 将  decomposition 函数中的 对主元是否为0进行判断的 if 语句

if(a[j][j] == 0) {......}

改为

if(a[j][j] == 0) { a[j][j] = 1e-20; }

这样就可以方便的解决主元为0的问题,而且不需要额外的计算。

       6.参考文献

1.  维基百科,http://zh.wikipedia.org/zh-cn/LU%E5%88%86%E8%A7%A3

2.  Numerical Analysis, 2nd edition,  Timothy Sauer.


相关内容

  • 第1章 解线性代数方程组的直接法
    第一章 解线性代数方程组的直接法 1.1 引 言 在自然科学与社会科学的研究中,常常需要求解线性代数方程组,如实验数据的曲线.曲面的拟合和用差分法或有限元法解偏微分方程等都要用到线性代数方程组的求解.由于从不同的问题导出的线性代数方程组的系 ...
  • 20世纪十大算法
    20世纪十大算法 本世纪初,美国物理学会(AmericanInstitute of Physics)和IEEE计算机社团(IEEE Computer Society)的一本联合刊物<科学与工程中的计算>发表了由田纳西大学的Jac ...
  • 外贸对经济增长贡献的计算方法初探
    第25卷第1期Vol.25 No.1 统计与信息论坛 Statistics&InformationForum 2010年1月Jan.,2010 统计理论与方法 外贸对经济增长贡献的计算方法初探 刘亚军 (西安交通大学经济与金融学院, ...
  • 第七章 矩阵特征值的计算
    第7章矩阵特征值和特征向量的计算引言 很多工程计算中,会遇到特征值和特征向量的计算,如:机械.结构或电磁振动中的固有值问题,如桥梁或建筑物的振动,机械机件.飞机机翼的振动:物理学中的各种临界值等.这些特征值的计算往往意义重大. 求解线性方程 ...
  • 医科类本科数学基础课程教学基本要求
    高等学校理工科 教学指导委员会通讯 2006年第4期(总第35期) 2006年4月 医科类本科数学基础课程教学基本要求 数学与统计学教学指导委员会 一.前 言 数学是研究客观世界数量关系和空间形式的科学.它不仅是一种工具,而且是一种思维模式 ...
  • 计量经济学复习重点
    1 计量经济学复习重点 第一章 1. 计量经济学的性质 计量经济学是以经济理论和经济数据的事实为依据运用数学和统计学的方法 通过建立数学模型来研究经济数量关系和规律的一门经济学科. 研究的主体出发点.归宿.核心经济现象及数量变化规 ...
  • 复盐法制备无水氯化镁的热解机理及动力学研究
    第l期 2007年1月 无 CHINESE 机化学学报 V01.23No.1 霾 中图分类号:TQl74:0614.22 JOURNALOFINORGANICCHEMISTRYJan.,2007 复盐法制备无水氯化镁的热解机理及动力学研究 ...
  • 华北电力大学电子技术基础二考纲
    华北电力大学(保定) 2015年硕士研究生入学考试初试学校自命题科目考试大纲 (招生代码:10079) <820 信号与系统> 一.考试内容范围: 1. 信号与系统的基础知识 (1)信号的概念.描述及分类: (2)信号的基本运算 ...
  • 现代控制理论试卷B
    陕西理工学院考试试卷(B 卷)-考试日期:测. ()二.填空题(15 分) 1. 描述系统的状态空间表达式由______________方程和______________方程组成.学年第学期科目:现代控制理论 电气工程 系题号 线 得分 阅 ...
  • 芦丁分解速度与加热温度的相关性
    芦丁分解速度与加热温度的相关性 赵宇新 (国家药典委员会,北京 100061) [摘要]目的:分析芦丁分解速度与加热温度的相关性.方法:在120-250℃每间隔10℃对芦丁单体分别加热30min,得到14份受热样品,采用高效液相色谱法测定这 ...