发布网友 发布时间:2024-09-25 18:36
共1个回答
热心网友 时间:2024-09-25 20:29
通过LU分解可以简化线性方程组的求解过程。
在求解线性方程组的时候,我们知道可以把线性方程组写成矩阵相乘的形式:[公式],那么按照最直接的方案,我们肯定是想着先计算矩阵 [公式] 的逆矩阵,得到解 [公式] 的向量。
但是这并不是最为高效的计算方法,实际上在线性代数中我们学习过,更好的方法是对系数矩阵[公式] 进行 [公式] 分解,即表示为 [公式],其中 [公式] 矩阵是下三角矩阵,而 [公式] 矩阵式上三角矩阵,那么得到了两个三角矩阵 [公式] 和 [公式] 之后,具体该怎么办呢?很简单:
第一步通过正向替换求解[公式],得到 [公式] 矩阵;
第二步通过反向替换求解[公式],即得到了我们实际要求的未知数矩阵 [公式]。
有读者可能会问了,之前我们通过一步计算[公式] 就可以算出结果,而你这里却需要两步,谈何简化呢?要知道,这里的矩阵 [公式] 和 [公式] 是两个三角矩阵,三角矩阵的计算是非常高效的。
在python当中,可以利用SymPy里面的sympy.Matrix类的LUdecomposition方法来进行[公式] 分解,这个方法可以简便的文创分解工作,依次返回 [公式] 矩阵、 [公式] 矩阵和一个行交换矩阵,这个行交换矩阵我们暂时用不到。还是看这个例子:
[公式]
[公式]
写成:[公式] 的形式, [公式]
那么,下面我们就来看如何对矩阵[公式]进行 [公式] 分解:
代码片段:
运行结果:
从运行结果来看,我们完成了[公式] 分解,依次得到了 [公式] 矩阵 [公式]和 [公式] 矩阵[公式],当然,这这是一个过程的展示,实际求解方程的时候,我们不用自己显式的去进行 [公式] 分解,A.LUsolve(b)直接解决问题,python在解方程的过程中,就自动的完成了 [公式] 分解的过程。
另外,使用scipy中的线性代数模块la,也可以完成[公式] 分解,利用la.lu可以完成,不过返回的值有所不同,他返回的是三个矩阵:置换矩阵 [公式] 、矩阵 [公式] 和矩阵 [公式],满足 [公式] 总体思路是一样的,不过这里的矩阵 [公式] 和矩阵 [公式]自然就和sympy得到的略有区别。看看代码:
代码片段:
运行结果:
从结果中,我们看出,我们得到了矩阵[公式] 和矩阵 [公式],通过scipy的方法,同样得到了正确的方程解。并且最后我们还小小验证了一把,发现[公式]