首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >部分旋转的LU分解是如何工作的?

部分旋转的LU分解是如何工作的?
EN

Stack Overflow用户
提问于 2016-12-12 21:01:02
回答 1查看 863关注 0票数 0

我使用的方法是,最初将L的主对角线上的元素设置为1(我认为这是杜利特尔的方法,但不确定,因为我看到它的名称不同)。我知道有大量的文献、论文和书籍,但我找不到不使用高斯消元法来寻找L的简单例子。

EN

回答 1

Stack Overflow用户

发布于 2018-06-05 00:25:56

与完全透视相比,部分透视仅使用行交换,而完全透视也可透视列。如下图和代码所示的部分旋转的主要目的是交换行以找到最大的u,以避免在for循环中被一个非常小的1除以,这将导致一个很大的条件数。

如果你尝试LU分解和一些病态矩阵的天真实现,比如一些任意的对角占优矩阵,它应该会爆炸。

代码语言:javascript
复制
function [L,U,P] = my_lu_piv(A)
n = size(A,1);
I = eye(n);
O = zeros(n);
L = I;
U = O;
P = I;
    function change_rows(k,p)
        x = P(k,:); P(k,:) = P(p,:); P(p,:) = x;
        x = A(k,:); A(k,:) = A(p,:); A(p,:) = x;
        x = v(k); v(k) = v(p); v(p) = x;
    end

    function change_L(k,p)
        x = L(k,1:k-1); L(k,1:k-1) = L(p,1:k-1);
        L(p,1:k-1) = x;
    end
for k = 1:n
    if k == 1, v(k:n) = A(k:n,k);
    else
        z = L(1:k-1,1:k -1)\ A(1:k-1,k);
        U(1:k-1,k) = z;
        v(k:n) = A(k:n,k)-L(k:n,1:k-1)*z;
    end
    if k<n
        x = v(k:n); p = (k-1)+find(abs(x) == max(abs(x))); % find index p
        change_rows(k,p);
        L(k+1:n,k) = v(k+1:n)/v(k);
        if k > 1, change_L(k,p); end
    end
    U(k,k) = v(k);
end
end
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41101504

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档