【问题标题】:iterative linear solver for matrix positive definite and ill conditioned矩阵正定和病态的迭代线性求解器
【发布时间】:2013-08-05 17:08:00
【问题描述】:

我需要一些帮助来解决这个问题。

我要解决Ax = b,

A is n x n (square matrix), b is n x 1 matrix 在哪里。

但是 A 矩阵有这个属性: + 病态 (K >> 1) (可能大于 10 ^ 8) + 对称正定(因为是协方差矩阵)

我已经尝试过 Jacobi 方法,但不幸的是收敛速度很慢。我避免使用 Cholesky 分解。

我已经尝试过Conjugate Gradient,但不幸的是如果矩阵A的条件数太大,它不能收敛。

更新:我需要一种可以在并行框架(如 MPI)中运行的方法。所以我不能在当前迭代中使用需要 x[i] 的 Gauss-seidal。

我可以用什么样的方法来解决这种问题?谢谢:)

【问题讨论】:

    标签: algorithm math parallel-processing numerical-methods discrete-mathematics


    【解决方案1】:

    我猜你的问题是由于矩阵向量乘积的计算不准确造成的。 (我从来没有见过共轭梯度完全不能减少残差,除非矩阵向量乘积很差。重启后的第一次迭代只是做了最陡峭的下降。)

    您可以尝试再次运行共轭梯度,但在计算矩阵向量积时使用扩展精度或Kahan summation 或其他东西。

    或者,如果您的矩阵具有某些已知结构,您可能会尝试找到一种不同的方式来编写矩阵向量积,以减少计算结果中的舍入。如果我能看到你的矩阵,我也许可以在这里给出更具体的建议。

    【讨论】:

    • 是的,我的A矩阵很差……条件数最多10^8 :(……你要什么样的格式?要我把它放进去* .mat 或 *.txt ? thx :)
    • 10^8 甚至不是那么糟糕。第一行为#rows #cols #nonzeros,其余每一行为row col entry,条目至少为17 位有效数字的文本描述对我来说可能是最容易处理的。
    • 你有 matlab / octave 吗?如果我给你 *.mat 怎么办?所以你不会失去数字精度dl.dropboxusercontent.com/u/32191086/gpmat.mat
    • @psuedobot:将 IEEE 双精度数转换为具有 17 个或更多有效数字的十进制时不会丢失精度。
    • 您将条目保留到小数点后六位,而不是 17 位有效数字;这导致它具有负特征值。但是,我加载了您的 mat 文件,我注意到您有一个密集的矩阵,其中包含一些相当小的条目。它的条件数在 1e9 左右。尽管如此,如果您进行足够精确的算术运算,您仍然可以在此矩阵(mat 文件中的那个)上运行未预处理的共轭梯度 --- 只要您仔细评估总和,80 位硬件浮点数应该可以工作。
    【解决方案2】:

    看你上传的矩阵,有一些东西好像有点奇怪:

    1. 您的矩阵 K 是一个相对较小 (400 x 400) 的密集矩阵。
    2. 您的矩阵 K 包含大量接近零的条目,其中 (abs(K(i,j)) < 1.E-16*max(abs(K)))。

    对于这种大小的矩阵,直接计算 Cholesky 分解应该是最有效的方法。我不知道你为什么说你不能这样做?

    迭代技术,例如预处理共轭梯度法,通常仅用于非常大且稀疏的方程组,因此在这里似乎不适用。


    在求解此类稀疏线性方程组时,重要的不是矩阵中的行数/列数,而是矩阵本身的稀疏模式。

    例如,如果您的矩阵A 非常稀疏,则可以直接计算稀疏 Cholesky 分解A = L*L'。但请注意,方程的排序决定了结果因子的稀疏模式,并且为 A 选择糟糕的排序策略可能会导致对 L*L' 的灾难性填充和较差的性能。

    有许多策略,例如Approximate Minimum Degree 和Multi-level Nested Dissection,应该用于对A 重新排序以获得L*L' 的伪最优稀疏性。

    存在许多实现高性能稀疏分解的好包,包括上述重新排序方案的实现。我建议您查看 Davis 的 CHOLMOD package。

    如果您仍然发现您的方程组太大而无法使用直接因式分解进行有效处理,您应该查看preconditioning your iterative PCG solver。 良好的预处理可以减少线性系统的有效条件数 - 在大多数情况下大大提高收敛性。

    您应该始终至少使用简单的对角线Jacobi preconditioner,尽管通常使用更复杂的方法可以实现更好的性能,例如incomplete Cholesky factorisation 或algebraic multi-grid or multi-level methods。您可能会发现 PETSc library 在这方面很有帮助,因为它包含许多迭代求解器和预处理方案的高性能实现。

    希望这会有所帮助。

    【讨论】:

    • @psuedobot:我根据你上传的矩阵做了一些修改。
    • 是的,我只是意识到我的大部分价值都非常小,当我将它们设置为零时,结果仍然可以。也许我会尝试使用稀疏矩阵计算而不是调整/优化我的密集矩阵 Jacobi 方法:)
    【解决方案3】:

    我已经看到(但没有真正接受)最近在这方面的工作,例如 http://www.cs.yale.edu/homes/spielman/precon/precon.html。把你说的和维基百科联系起来,你可能想看看http://en.wikipedia.org/wiki/Gauss%E2%80%93Seidel_method,这是http://en.wikipedia.org/wiki/Successive_Over-relaxation的一个特例。

    如果事与愿违,您总是可以降低一个级别(找到更快的实现或在问题上投入更多的硬件)或提高一个级别(尝试找到另一种方法来实现您的目标,而不涉及解决那么大的问题线性系统,或经常解决它们)。

    【讨论】:

      猜你喜欢
      • 2011-05-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-01-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多