我正在尝试实现一些基本的线性代数运算,其中一个运算是三角(上和/或下)矩阵的求逆。有没有简单稳定的算法来做到这一点?
谢谢你。
我正在尝试实现一些基本的线性代数运算,其中一个运算是三角(上和/或下)矩阵的求逆。有没有简单稳定的算法来做到这一点?
谢谢你。
是的,使用反向替换。矩阵求逆的标准算法是求其 LU 分解(分解为下三角矩阵和上三角矩阵),对三角块使用反代换,然后将结果组合得到原始矩阵的逆矩阵。
如果可以,请不要颠倒它。它是数值线性代数的基本戒律之一。
将矩阵 L 本身保存在内存中并计算
inv(L)b
每当您需要使用 inv(L) 做其他事情时,使用反向替换。
请注意,用于反转它的惯用算法需要求解系统
inv(L)[1 0 0 ...],
inv(L)[0 1 0 ....],
inv(L)[0 0 1 ....]
依此类推,因此您会发现根本不反转它要容易得多。
给定一个下三角矩阵 L,反向代换可以让您快速求解系统 L x = b 的任意右侧 b。
要反转 L,您可以求解此系统的右侧 e1=(1,0,...,0), e2=(0,1,...,0), ..., en=(0 ,0,...,1) 并将得到的解向量组合成一个(必须是下三角)矩阵。
如果您对封闭形式的解决方案感兴趣,则逆的对角元素是原始对角元素的逆元素,并且当您远离对角线时,逆元素的其余元素的公式会变得越来越复杂.
作为三角矩阵 A 的 B 逆,您可以使用以下 MATLAB 代码:
n = size(A,1);
B = zeros(n);
for i=1:n
B(i,i) = 1/A(i,i);
for j=1:i-1
s = 0;
for k=j:i-1
s = s + A(i,k)*B(k,j);
end
B(i,j) = -s*B(i,i);
end
end
哇,这几乎是数值分析课程内容的一半。标准算法会做,这里有一堆固定代码。这个问题和大多数其他常见数值分析问题的最终来源是Numerical Recipes。