接着上次LU分解的讲解,这次给出使用不同的计算LU分解的方法,这种方法称为基于GaxPy的计算方法。这里需要了解lapapck中的一些函数。lapack中有一个函数名为gaxpy,所对应的矩阵计算公式是:x = Gx + y; 对应的Matlab代码如下:

function[L, U] =zgaxpylu(A)

%calculate LU decomposition based on Gaxpy operation

%the same way as zlu.m but differnt approach

 

[m, n] = size(A);

 

if m ~= n

    error('current support square matrix only')

end

 

L = eye(n);

U = eye(n);

 

for k = 1:n

    

    v = zeros(n, 1);

    if k == 1

        v(k:end) = A(k:end, k);

    else

        U(1:k-1,k) = L(1:k-1,1:k-1)\A(1:k-1,k);

        v(k:end) = A(k:end, k) - L(k:end, 1:k-1)*U(1:k-1,k);

    end

    

    if k < n

        L(k+1:end,k) = v(k+1:end)/v(k);

        L(k, k) = 1;

    end

    

    U(k, k) = v(k);

end

将这段代码运行1500次,每次使用随机生成的高斯矩阵并和Matlab的lu分解结果对比,统计数据如下:

mean of my lu     : 1.7676e-14

variance of my lu : 3.07075e-25

mean of matlab lu     : 3.70416e-16

variance of matlab lu : 2.14989e-32

和前一种方法不同,目前的这个方法显式的计算出L和U,而在前面的方法是计算出L,然后就可以拿到U。

使用部分选主元的方法进行LU分解,对应如下代码:

function [P, L, U] = zgaxpyplu(A)

%compute LU decomposition based on Gaxpy operation with pivoting

%aimed at improve the stability of LU decomposition

 

[m, n] = size(A);

if m ~= n

    error('current support square matrix only')

end

 

P = eye(n);

L = eye(n);

U = zeros(n);

 

for k = 1:n

    

    v = zeros(n, 1);

    

    if k == 1

        v(k:end) = A(k:end, 1);

    else

        U(1:k-1, k) = L(1:k-1, 1:k-1) \ A(1:k-1, k);

        v(k:n) = A(k:n, k) - L(k:n, 1:k-1)*U(1:k-1, k);

    end

    

    %find the largest element in v(k:end)

    [max_value, max_index] = max(v(k:end));

    max_index = max_index + k - 1;

    

    if max_index ~= k

        %exchange the max_index-th row and k-th row

        A([k max_index], k+1:n) = A([max_index k], k+1:n);

        %exchange the max_index-th row and k-th row in L

        if k > 1

            L([k max_index], 1:k-1) = L([max_index k], 1:k-1);

        end

        P([k max_index], :) = P([max_index k], :);

        v([k max_index]) = v([max_index k]);

    end

    

    if (abs(v(k)) > 1e-6) && (k < n)

        v(k+1:end) = v(k+1:end) / v(k);

        L(k+1:end, k) = v(k+1:end);

    end

    

    U(k, k) = v(k);

end

运行这段代码1500次,每次都使用随机生成的矩阵和Matlab的LU分解做对比,结果如下:

mean of my lu : 2.02547e-15
variance of my lu : 9.06349e-29
mean of matlab lu : 3.65765e-16
variance of matlab lu : 1.98304e-32

将每个算法和同类型的算法相比,使用gaxpy的算法都比之前的方法要好。但是现在有一个问题是使用pivot的算法居然比不使用pivot的算法没有足够显著的改进,当然这也证明了使用基于gaxpy运算可以提高LU分解的稳定性。

 

总结:LU分解是用于求解线性方程组最基本的矩阵分解方法,对于LU分解可以使用高斯消元法,也可以使用基于gaxpy的运算方法。但是从目前的结果来看,使用gaxpy运算可以极大的提高LU分解的稳定性。但是作为成熟的方法,使用lapack中对应的方法是最好的选择。

LU分解(2)的更多相关文章

  1. matlab 求解线性方程组之LU分解

    线性代数中的一个核心思想就是矩阵分解,既将一个复杂的矩阵分解为更简单的矩阵的乘积.常见的有如下分解: LU分解:A=LU,A是m×n矩阵,L是m×m下三角矩阵,U是m×n阶梯形矩阵 QR分解: 秩分解 ...

  2. LU分解,Javascript代码

    ///A 为矩阵,这里写成一维数组,如 [1],[1,2,3,4] function GetLU(a) { var n = a.length;//矩阵的总数据数目 var s = Math.sqrt( ...

  3. matlab实现高斯消去法、LU分解

    朴素高斯消去法: function x = GauElim(n, A, b) if nargin < 2 for i = 1 : 1 : n for j = 1 : 1 : n A(i, j) ...

  4. LU分解(1)

    1/6 LU 分解          LU 分解可以写成A = LU,这里的L代表下三角矩阵,U代表上三角矩阵.对应的matlab代码如下: function[L, U] =zlu(A) % ZLU ...

  5. MATLAB矩阵的LU分解及在解线性方程组中的应用

    作者:凯鲁嘎吉 - 博客园http://www.cnblogs.com/kailugaji/ 三.实验程序 五.解答(按如下顺序提交电子版) 1.(程序) (1)LU分解源程序: function [ ...

  6. 线性代数笔记10——矩阵的LU分解

    在线性代数中, LU分解(LU Decomposition)是矩阵分解的一种,可以将一个矩阵分解为一个单位下三角矩阵和一个上三角矩阵的乘积(有时是它们和一个置换矩阵的乘积).LU分解主要应用在数值分析 ...

  7. 矩阵分解---QR正交分解,LU分解

    相关概念: 正交矩阵:若一个方阵其行与列皆为正交的单位向量,则该矩阵为正交矩阵,且该矩阵的转置和其逆相等.两个向量正交的意思是两个向量的内积为 0 正定矩阵:如果对于所有的非零实系数向量x ,都有 x ...

  8. 计算方法 -- 解线性方程组直接法(LU分解、列主元高斯消元、追赶法)

    #include <iostream> #include <cstdio> #include <algorithm> #include <cstdlib> ...

  9. 矩阵LU分解分块算法实现

    本文主要描述实现LU分解算法过程中遇到的问题及解决方案,并给出了全部源代码. 1. 什么是LU分解? 矩阵的LU分解源于线性方程组的高斯消元过程.对于一个含有N个变量的N个线性方程组,总可以用高斯消去 ...

随机推荐

  1. 【JavaScript】我的JavaScript技术总结第一篇——编程细节

    遍历数组 for (var i=0, l=arr.length; i<l; i++) 这样写的一个好处就是让每次循环少一步获取数组对象长度的操作,数组长度越长,价值越明显. 判断变量的真假 if ...

  2. Java NIO中核心组成和IO区别

    1.Java NIO核心组件 Java NIO中有很多类和组件,包括Channel,Buffer 和 Selector 构成了核心的API.其它组件如Pipe和FileLock是与三个核心组件共同使用 ...

  3. Java基础知识强化之IO流笔记13:递归之不死神兔问题(斐波那契数列)

    1.这个问题是如下的:    有一对兔子,从出生后第3个月起,每个月都生一对兔子,小兔子长到第3个月又生一对兔子,加入兔子都不死,问第20个月兔子的对数? 分析:我们找规律 兔子对数第1个月:   1 ...

  4. dispatch的几种队列

    dispatch的几种队列   dispatch队列的生成可以有这几种方式: 1. dispatch_queue_t queue = dispatch_queue_create("com.d ...

  5. 0_Linux_虚拟机安装

    虚拟机的安装0Snapshot和clone 系统分区(由硬盘的性能所限制的) 1分区类型: 主分区:最多有4个 扩展分区:最多只能有1个:主分区加扩展分区最多有4个:不能写入数据,只能包含逻辑分区,不 ...

  6. 提示用户体验的最佳免费 Jquery 表单插件

    网页表单是一个老生常谈的话题.出于这样或那样的目的,一些示例中都会包括用户注册,电子商务结算,用户设置甚至联系人表格.而输入栏是非常容易用现代的CSS3技术来应用样式.但是到底什么决定整体用户体验? ...

  7. 手动导出Excel及Excel导出原理探究

    前言:不知道大家有没碰到过,官方大型网站(例如中国移动)上很多地方查询列表是不提供数据导出的,而且界面上的筛选也无法满足我们的需求. 这时候我就想,如果能导出成Excel并借助自带的数据筛选方便多了. ...

  8. iOS开发之通知中心(NSNotificationCenter)

    前言 面向对象的设计思想是把行为方法封装到每一个对象中,以用来增加代码的复用性.正是这种分散封装,增加了对象之间的相互关联,总是有很多的对象需要彼此了解以及相互操作! 一个简单示例说明这种交互产生的对 ...

  9. (转)xcode报Could not find a storyboard named...错误的解决办法

    首先确定是否有用到storyboard 如果没有用到的话,需要将涉及到storyboard的地方修改: 1 删除plist文件里的设置 2 修改程序中使用到storyboard的地方 如果确实有使用s ...

  10. 解决java访问.netWebService的常见问题

    到公司没多久,写了一个java调用.net写的webService结果期间用各种方法测试都没有完成,总是抛出异常,最后直接使用SOAP消息去进行调用才成功了,具体代码如下,仅供参考:import ja ...