当仅恒定项之一变化时,线性系统AX = B的有效解决方案

Efficient solution of linear system Ax= b when only one of the constant term changes

本文关键字:AX 线性系统 解决方案 有效 变化      更新时间:2023-10-16

当仅少数常数术语更改时,如何有效地求解了线性方程的大系统。例如:

i当前有系统ax = b。我计算一次的倒数,将其存储在矩阵中,每次输入更新在B中进行矩阵矢量乘法A^-1(b)以重新计算X。

这效率低下,因为只有几个条目在b中进行更新。当A-1保持恒定但特定的已知值变化时,是否有更有效的方法来解决该系统。

我使用UBLA和EIGEN,但不知道可以解决此选择性重新计算问题的解决方案。感谢您的任何指导。

计算A^-1。如果b_ib的ITH组件,则检查d/db_i A^-1 b(相对于b的ITH组件,A^-1的衍生物) - 它等于A^-1的一列(尤其是ITH列)。线性函数的导数在其域上是恒定的。因此,如果您具有bb',并且它们仅在ITH组件中有所不同,则为A^-1 b - A^-1 b' = [d/db_i A^-1] * (b-b')_i。对于多个组件,只需添加它们(因为A^-1是线性的)。

或简而言之,您可以对零的输入组件进行一些优化计算A^-1 (b'-b)(如果只有某些组件更改,将是大多数组件)。A^-1 b' = A^-1 (b'-b) + A^-1 (b)。而且,如果您知道只有某些组件会更改,则可以获取A^-1的适当列的副本,然后将其乘以B。

的该组件的更改。

您可以利用问题的线性:

x0 = A_(-1)*b0 
x = A_(-1)*b = x0 + A_(-1)*db

db是a bb0之间的差异矩阵,应填充零:您可以将其压缩到稀疏矩阵中。

特征lib具有许多稀疏矩阵(乘法,倒数,...)的酷功能。

首先,不要执行矩阵倒置,而是使用求解器库。其次,将您的初始x作为第一个猜测传递到库。

库将执行某种分解,例如LU,并使用它来计算x。如果您选择一个迭代求解器,那么它已经在做您在解决方案中所描述的几乎要做的事情。它将以更糟糕的猜测开始,并产生更好的猜测,任何良好的例程都将需要一个初始猜测来加快过程。在许多情况下,无论如何,您都对结果有一个好主意,因此利用它是有意义的。

如果新的b在旧的b附近,则新的x应该在旧的x附近,它将是一个很好的初始猜测。

首先,请勿计算矩阵逆,而是使用lu分解或QR分解(比LU较慢,但Stabler慢)。这种分解比矩阵大小更好地缩放比反演性能,通常是稳定器(尤其是QR)。

如果A稍微更改(例如,排名一个矩阵),则有多种方法可以更新QR分解o(n^2)。

但是,如果右侧B仅通过固定元素变化,即。B'= B db,并提前已知DB,您可以一劳永逸地解决DX = DB,现在解决方案X'of AX'= B'为x dx。

如果不提前知道db,但始终是一些db_i矢量的线性组合,则可以解决dx_i = db_i,但是如果您有很多这样的db_i事实等于计算逆)...