当仅恒定项之一变化时,线性系统AX = B的有效解决方案
Efficient solution of linear system Ax= b when only one of the constant term changes
当仅少数常数术语更改时,如何有效地求解了线性方程的大系统。例如:
i当前有系统ax = b。我计算一次的倒数,将其存储在矩阵中,每次输入更新在B中进行矩阵矢量乘法A^-1(b)以重新计算X。
这效率低下,因为只有几个条目在b中进行更新。当A-1保持恒定但特定的已知值变化时,是否有更有效的方法来解决该系统。
我使用UBLA和EIGEN,但不知道可以解决此选择性重新计算问题的解决方案。感谢您的任何指导。
计算A^-1
。如果b_i
是b
的ITH组件,则检查d/db_i A^-1 b
(相对于b
的ITH组件,A^-1的衍生物) - 它等于A^-1
的一列(尤其是ITH列)。线性函数的导数在其域上是恒定的。因此,如果您具有b
和b'
,并且它们仅在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 b
和 b0
之间的差异矩阵,应填充零:您可以将其压缩到稀疏矩阵中。
特征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事实等于计算逆)...
- C++ 本征线性系统求解,数值问题?
- 使用特征 3 线性系统求解器的错误结果
- 使用特征/英特尔 MKL 求解稀疏线性系统
- 犰狳库中线性系统的近似解
- 用SimplicialCholesky Eigen求解大型稀疏线性系统
- 特征 3 断言在求解线性系统时失败 - 据我所知,这是由于特征中的无效索引
- 在C++-GPU中解决稀疏线性系统的最佳方法可能吗
- 如何使用Z_2中的系数求解稀疏线性系统
- 以线性最小二乘方式求解系统 Ax=b,具有复元素和下三角形平方 A 矩阵
- 用拉帕克dgeqrf_求解线性系统
- 定维(N=9)对称半正定稠密线性系统的快速解
- 当仅恒定项之一变化时,线性系统AX = B的有效解决方案
- C++ 用于求解复杂线性系统 Ax=b 的库
- 使用指针和数组求解线性系统
- 无法访问特征线性系统解的元素
- 如何求解复杂的线性系统
- 改进稀疏线性系统的解
- c++中有没有免费的迭代线性系统求解器,可以让我输入任意的初始猜测
- 如何求解非常大的系统的稀疏线性系统
- 在CUDA中求解稀疏定正线性系统