lu_factorize返回什么

What does lu_factorize return?

本文关键字:什么 返回 factorize lu      更新时间:2023-10-16

boost::number::ublas包含M::size_type lu_factorize(M& m)函数。它的名称表明它执行给定矩阵mLU分解,即应产生m=L*U的两个矩阵。似乎没有为此功能提供任何文档。

很容易推断,它返回0表示分解成功,当矩阵为奇异时返回非零值。然而,目前还不清楚结果如何。通过引用该矩阵表明它是有效的,但它应该产生两个矩阵(LU),而不是一个

boost中没有文档,但查看SciPy的lu_factor的文档可以看到,对于LU分解,返回一个结果并不罕见。

这就足够了,因为在LU分解的典型方法中,L对角线仅由1组成,例如,如数学中的答案所示。

因此,可以将LU都拟合到一个矩阵中,将L放在结果的下半部分,省略对角线(假设只包含一个),将U放在上半部分。例如,对于3x3问题,结果是:

    u11 u12 u13
m = l21 u22 u23
    l31 l32 u33

这意味着:

     1    0   0
L =  l21  1   0
     l31  l32 1

    u11 u12 u13
U = 0   u22 u23
    0   0   u33

从同一名称空间检查boost的void lu_substitute(const M& m, vector_expression<E>& e)函数似乎证实了这一点。它分两步求解方程LUx=e,其中LU都包含在其m自变量中。

首先求解zLz=e,其中z=Ux使用m:的下部

inplace_solve(m, e, unit_lower_tag ());

然后,在计算出z=Ux(在e修改到位的情况下)后,可以使用m:的上部来求解Ux=e

inplace_solve(m, e, upper_tag ());

文件中提到了inplace_solve,它是

求解具有三角形形式的线性方程组,即a为三角形。

所以一切似乎都有道理。

boost没有LU因子分解的文档(下三角矩阵L和上三角矩阵U),而是与公众共享的源代码。

如果代码很难理解,请查看Nick Higham的网页。它有详细的解释。以下是链接中的一个示例:

假设我们需要求解Ax=b。
(1)根据输入矩阵A生成LU
[3-1 1 1]
[-1 3 1-1]->
[-1-1 3 1]
[11113]


[1 0 0 0]
[-1/3 1 0 0]
[-1/3-1/2 1 0]
[1/3 1/2 0 1]

上部
[3-1 1 1]
[0 8/3 4/3-2/3]
[0 0 4 1]
[0 0 0 3]

这个例子直接面向人类,但在算法方面可能需要许多步骤。这就是LU Factorization出现的原因。方法上,与高斯消去的关系,舒尔补码,和块实现是一些。

(2)求解三角形系统Ly=b和Ux=y,因为那时b=L(Ux)。