当只有少数常数项发生变化时,如何有效地解决大型线性方程组。例如:
我目前有系统Ax = b。我计算A的逆矩阵,将其存储在矩阵中,并且每次b中的任何条目更新执行矩阵向量乘法A ^ -1(b)以重新计算x。
这是低效的,因为只有几个条目会在b中更新。当A-1保持不变但特定的已知值在b?
中发生变化时,是否有更有效的方法来解决该系统?我使用uBlas和Eigen,但不知道解决这个选择性重新计算问题的解决方案。谢谢你的指导。
答案 0 :(得分:3)
计算A^-1
。如果b_i
是b
的第i个分量,那么检查d/db_i A^-1 b
(A ^ -1相对于b
的第i个分量的导数) - 它等于A^-1
的列(特别是第i列)。并且线性函数的导数在其域上是恒定的。因此,如果您有b
和b'
,并且它们仅在第i个组件中有所不同,那么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组件的变化。
答案 1 :(得分:1)
您可以利用问题的线性度:
x0 = A_(-1)*b0
x = A_(-1)*b = x0 + A_(-1)*db
其中db是b
和b0
之间的差异矩阵,它应该用零填充:你可以将它压缩为稀疏矩阵。
Eigen lib对于稀疏矩阵(乘法,逆,......)有很多很酷的函数。
答案 2 :(得分:0)
首先,不要计算矩阵逆,而是使用LU分解或QR分解(比LU慢但稳定)。这种分解比基质尺寸的性能反转更好,并且通常更稳定(尤其是QR)。
如果A稍微改变(例如,通过一级矩阵),有很多方法可以更新QR分解,但是如果B改变了,你必须再次使用新的b来解决 - 你无法逃避这一点,这是为O(n ^ 2)。
但是,如果右侧B仅由固定元素改变,即。 B'= B + dB,预先知道dB,你可以一劳永逸地解决A dx = dB,现在Ax'= B'的解x'是x + dX。
如果事先不知道dB但是总是几个dB_i向量的线性组合,你可以求解A dx_i = dB_i,但是如果你有很多这样的dB_i,你最终得到一个^ 2过程(这在事实相当于计算反...)
答案 3 :(得分:0)
首先,不要执行矩阵求逆,而是使用求解器库。其次,将您的初始x
作为第一个猜测传递给库。
库将像LU一样执行某种分解,并使用它来计算x
。如果你选择一个迭代求解器,那么它已经完成了你在解决方案中所描述的内容。它将以更糟糕的猜测开始并产生更好的结果,任何好的例程都会采取初步猜测来加速该过程。在许多情况下,无论如何你都对结果有了很好的了解,因此利用它是有意义的。
如果新的b
靠近旧版b
,那么新的x
应该靠近旧的x
,并且它将作为良好的初始猜测。