算法名称:LU分解法
算法描述:
假定能够把矩阵A写成两个矩阵相乘的形式
                                                     (1)
其中L下三角矩阵U上三角矩阵
例如,4×4矩阵A的情况,(1)式如下:
 (2)
可以用如(1)式分解来求解线性方程组
                                  (3)
首先求解向量y使得
                                                                               (4)
然后再来求解
                                                      (5)
此拆分方法的优点在于求解一个三角形方程组相当容易,这样,(4)式可用向前替代过程求解,如下:
                                                (6)
(5)式可用回代过程求解,这与(2)式~(3)式一样,
                        (7)
(6)式和(7)式共需执行N2次内层循环(对每个右端项b),每个内层循环包括一次乘法和一次加法。如果有N个右端项,它们是单位列向量(在求矩阵逆时就是这种情况),考虑这些零元素可把(6)式的总执行次数从N3/2减少到N3/6,而(7)式的执行次数不变,仍为N3/2。
       注意:一点对A进行了LU分解,就可以一次求解所有要解的右端项。
 
算法实现:
首先,写出(1)式或(2)式的第i,j分量。它总是一个和式,开始部分形式如下:
和式中的项数依赖于i和j中较小的数。事实上有三种形式:
                         (8,9,10)
显然,(8)~(10)式共有N2个方程,而要求N2+N个未知的α和β(因对角线的未知元素有两套),既然未知数的个数比方程个数多,就人为指定N各位指数,然后再来求解其他的未知数。事实上,总是令
                                                                          (11)
有一个算法称为Crout算法,它仅按某种次序排列方程,就能容易的求出(8)式~(11)式的N2+N各方程中的所有α和β。步骤如下:

    ,即(11)式
对每个j=0,1,2,...,N-1进行以下两步:
第一步,对每个i=0,1,...,j用(8)式、(9)式和(11)式来解βij,即
                                                                          (12)
第二步,对每个i=j+1,j+2,...,N-1用(10)式来求解αij,即
                              (13)
在求解下一个j之前要保证进行了以上两步。
 
如果按上述过程进行几次迭代后,就会发现(12)式和(13)式右端的α和β在需要时已经得到,还会发现,每一个aij仅被使用一次就不再使用了。这意味着分解是“同址”进行的。简言之Crout算法得到的矩阵是混合矩阵,对本例排列如下:
注:不是把矩阵A分解成LU形式,而是将其按行置换的方式分解。
 
Crout算法的精妙之处:
l         (12)式,在i=j(最后一次应用)时,与(13)式(除后者还要做一次除法外)是完全一样的,这两种情况要求和的上线都是k=j-1(=i-1)。这意味着,不必费心去考虑对角线元素βjj是否会正落在对角线上,也不必考虑该列中,它下面的某个元素(未做除法的)αij,i=j+1,j+2,...,N-1是否会提升成为对角线元素β。
l         它首先找到每行的最大元素,而后(在找最大主元时)乘以一个比例系数,这就实现了“隐式主元法”。
 
运行示例:
Origin coefficient matrix:
 | 0.0 2.0 0.0 1.0 |
 | 2.0 2.0 3.0 2.0 |
 | 4.0 -3.0 0.0 1.0 |
 | 6.0 1.0 -6.0 -5.0 |
-----------------------------------------------
LU mixed matrix:
 | 6.0 1.0 -6.0 -5.0 |
 | 0.0 2.0 0.0 1.0 |
 | 0.3333333333333333 0.8333333333333334 5.0 2.833333333333333 |
 | 0.6666666666666666 -1.8333333333333333 0.8 3.8999999999999995 |
-----------------------------------------------
Origin left-hand vector b:
 | 0.0 |
 | -2.0 |
 | -7.0 |
 | 6.0 |
-----------------------------------------------
Final solution vector:
 | -0.5000000000000003 |
 | 1.0000000000000002 |
 | 0.33333333333333337 |
 | -2.0000000000000004 |
-----------------------------------------------
 
示例程序: 
package com.nc4nr.chapter02.lu;

public class LU ...{

    // 4 * 4 coefficient matrix a
    double[][] a = ...{
            ...{0.0, 2.0, 0.0, 1.0},
            ...{2.0, 2.0, 3.0, 2.0},
            ...{4.0, -3.0, 0.0, 1.0},
            ...{6.0, 1.0, -6.0, -5.0}
    };
    
    // 4 * 1 coefficient matrix b
    double[] b = ...{
            0.0,
            -2.0,
            -7.0,
            6.0
    };
    
    int anrow = 4;
    int[] indx = new int[anrow];
    int parity = 1;
    
    private void lucmp() ...{
        final double tiny = 1.0e-20;
        int imax = 0, n = anrow;
        double big, dum, sum, temp;
        double[] vv = new double[n];
        
        System.out.println("Origin coefficient matrix:");
        output(a,4);
        
        for (int i = 0; i < n; i++) ...{
            big = 0.0;
            for (int j = 0; j < n; j++) ...{
                if ((temp = Math.abs(a[i][j])) > big) big = temp;
            }
            if (big == 0.0) System.out.println("lu: singular matrix in lucmp.");
            vv[i] = 1.0/big;
        }
        
        for (int j = 0; j < n; j++) ...{
            for (int i = 0; i < j; i++) ...{
                sum = a[i][j];
                for (int k = 0; k < i; k++) sum -= a[i][k]*a[k][j];
                a[i][j] = sum;
            }
            big = 0.0;
            for (int i = j; i < n; i++) ...{
                sum = a[i][j];
                for (int k = 0; k < j; k++)    sum -= a[i][k]*a[k][j];
                a[i][j] = sum;
                if ((dum = vv[i]*Math.abs(sum)) >= big) ...{
                    big = dum;
                    imax = i;
                }
            }
            if (j != imax) ...{
                for(int k = 0; k < n; k++) ...{
                    dum = a[imax][k];
                    a[imax][k] = a[j][k];
                    a[j][k] = dum;
                }
                parity = -parity;
                dum = vv[imax];
                vv[imax] = vv[j];
                vv[j] = dum;
            }
            indx[j] = imax;
            if (a[j][j] == 0.0) a[j][j] = tiny;
            if (j != n - 1) ...{
                dum = 1.0/a[j][j];
                for (int i = j+1; i < n; i++) a[i][j] *= dum;
            }
        }
        
        System.out.println("LU mixed matrix:");
        output(a,4);
    }
    
    private void lubksb() ...{
        double sum;
        int n = anrow, ii = 0;
        
        System.out.println("Origin left-hand vector b:");
        output(b,4);
        
        for (int i = 0; i < n; i++) ...{
            int ip = indx[i];
            sum = b[ip];
            b[ip] = b[i];
            if (ii != 0)
                for (int j = ii - 1; j < i; j++) sum -= a[i][j]*b[j];
            else if (sum != 0.0) 
                ii = i + 1;
            b[i] = sum;
        }
        for (int i = n-1; i >= 0; i--) ...{
            sum = b[i];
            for(int j = i + 1; j < n; j++) sum -= a[i][j]*b[j];
            b[i] = sum / a[i][i];
        }
        System.out.println("Final solution vector:");
        output(b,4);
    }
    
    private void output(double a[][], int anrow) ...{
        for (int i = 0; i < anrow; i++) ...{
            System.out.println(" | " + a[i][0] + " " + 
                    a[i][1] + " " + 
                    a[i][2] + " " + 
                    a[i][3] + " | ");
        }
        System.out.println("-----------------------------------------------");
    }
    
    private void output(double[] b, int bnrow) ...{
        for (int i = 0; i < bnrow; i++) ...{
            System.out.println(" | " + b[i] + " | ");
        }
        System.out.println("-----------------------------------------------");
    }
    
    public LU() ...{
        lucmp(); // 分解
        lubksb(); // 回代
    }
    
    public static void main(String[] args) ...{
        new LU();
    }

}

LU分解法求解线性方程组相关推荐

  1. matlab lu解线性方程,MATLAB报告用LU分解法求解线性方程组.doc

    MATLAB报告用LU分解法求解线性方程组 <MATLAB>期末大报告 报告内容:用LU分解法求解线性方程组 学院(系): 专 业: 班 级: 学 号: 学生姓名: 2014 年 6 月 ...

  2. Matlab实现 LU分解法解线性方程组(全选主元列选主元)

    选主元LU分解 实验内容:列选主元LU分解和全选主元LU分解求解线性方程组 计算方法: 全选主元消元法 1.1 初始化 根据参数A.b,记录下矩阵.右端项的尺寸n: 以得到的尺寸n初始化解向量x: 同 ...

  3. 数值分析3-解线性方程组的高斯消去法、LU分解法及列主元消去法的matlab程序和调试方法

    对于形如Ax=b的线性方程组,在线性代数中是通过求逆的方式求解的,即x=A-1b,而在数值分析中,解线性方程组的方法是通过直接法或者迭代法来实现的,今天写的三个程序都属于直接法,分别为高斯消去法.LU ...

  4. 紧凑存储的杜利特尔分解法Doolittle(LU分解法)_解线性方程组的直接解法

    紧凑存储的杜利特尔分解法Doolittle(LU分解法)_解线性方程组的直接解法 标签:计算方法实验 /* 紧凑存储的杜利特尔分解法Doolittle:如果初始矩阵不要求保留的话,可以紧凑存储.因为每 ...

  5. 解线性方程组的直接方法:LU分解法及其C语言算法实现

    在上一篇博客里面,笔者介绍了解线性方程组的列主元Guass消元法,这篇将介绍LU分解法及其算法实现. 什么是LU分解? 对于一个线性方程组Ax=b,其中A是非奇异系数矩阵,b是线性方程组右端项,在列主 ...

  6. Doolittle分解法(LU分解法)的Python实现

    在解一般的非奇异矩阵线性方程组的时候,或者在迭代改善算法中,需要使用LU分解法. 对于一个一般的非奇异矩阵A=(a11, a12,-,a1n,a21,-ann),可分解为一个下三角矩阵L和一个上三角矩 ...

  7. Matlab | Lab4——用LU 分解法、 Jacobi 迭代、 Gauss-Seidel 迭代 解线性病态方程组(系数矩阵为Hilbert矩阵)

    1.要求 考虑线性方程组Hx=b,其中H为n阶Hilbert矩阵,即 通过先给定解(例如取x的各个分量为1),再计算出右端向量b的办法给出一个精确解已知的问题. (1)分别编写Doolittle LU ...

  8. 乔列斯基分解法求线性方程组的MATLAB程序实现

    编写的 乔列斯基分解算法的MATLAB 程序如下: 功能:LL分解法求线性方程组AX=b的解调用格式:[X,L]= SymPosl (A,b) 其中, A:线性方程组的系数矩阵: b:线性方程组的常数 ...

  9. LU分解法 | matlab

    % LU分解法 % M为输入的增广矩阵 % precision为输入的精度要求,如不输入或输入有误,则默认为10位if nargin == 2trydigits(precision);catchdis ...

  10. Python02 雅克比迭代法 Gauss-Seidel迭代法 列选主元法 LU分解法(附代码)

    1. 实验结果 (1)在定义的矩阵类中设置需要求解的方程为: (2)在 test.py 中选择雅克比迭代法求解: 输入:最大容许迭代次数和精度要求: 输出:根据谱半径判断方法是否收敛,收敛时得到满足精 ...

最新文章

  1. C++ 函数模板和排序的函数模板——学习笔记
  2. html5语音对讲,c#语音对讲demo
  3. 弱引用使用场景桌面_吃透Java基础十五:强引用、软引用、弱引用、虚引用
  4. Linux原始套接字学习总结
  5. SAP收发存报表程序
  6. 数学猜想验证步骤_高中数学解题思路与技巧汇总,19种解题方法,实用!
  7. 在PS中如何进行图文互排,且层的使用……
  8. LaTex ——P4 字体字号设置
  9. oracle添加联合主键
  10. python中怎样划分时间段_如何划分重叠的日期时间间隔(组织模式时钟时间)?...
  11. 工具分享:xampp-windows-x64-7.3.2-1-VC15-installer.exe 请自行下载(附下载链接)
  12. Java飞机大战 项目-源码
  13. bootstrap实现树节点、树结构
  14. Web前端学习路线笔记(六)html5
  15. 用易升升级到Win10后在第三方浏览器无法打开网页的解决办法
  16. python去除pdf水印_聊聊 Python 操作PDF的几种方法(合并、拆分、水印、加密)
  17. Python实现自动给视频打码,减少不宜画面出现...
  18. android gms认证之run host test,Android GMS认证项总结
  19. numpy.arange()参数含义
  20. 安卓app单webview改为多webview加载网页

热门文章

  1. 免费开源BI工具DataEase实现了SQL数据集动态传参?冲冲冲!!!
  2. kali netstat使用教程
  3. 计算机与材料物理,南京邮电大学材料物理专业
  4. SQL注入(持续更新中)
  5. websockets 和 socketio 的比较
  6. DH算法原理深入详解
  7. CART剪枝算法详解
  8. c语言程序中延时函数作用,51单片机C语言延时函数怎么定义和使用 - 全文
  9. 用户体验测试一样很重要
  10. SPSS统计分析常用知识点