我需要一些帮助解决这个问题。
我想解决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。
我可以用什么样的方法解决这类问题?谢谢:))
答案 0 :(得分:1)
我要猜测你的麻烦来自于矩阵矢量产品的不准确计算。 (我从未见过共轭梯度完全不能减少残差,除非矩阵矢量产品很差。重启后的第一次迭代只是最陡下降。)
您可以尝试再次运行共轭渐变,但在计算矩阵向量积时使用扩展精度或Kahan summation等。
或者,如果您的矩阵具有某种已知结构,您可能会尝试找到一种不同的方法来编写矩阵向量乘积,从而减少计算结果中的舍入。如果我能看到你的矩阵,我可能会在这里提出更具体的建议。
答案 1 :(得分:1)
查看您上传的矩阵,有些事情似乎有点奇怪:
K
是一个相对较小的(400 x 400
)密集矩阵。 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'
的伪最优稀疏性。
存在许多实现高性能稀疏因子分解的良好包,包括上述重新排序方案的实现。我建议您查看戴维斯的CHOLMOD package。
如果你仍然发现你的方程系统太大而无法使用直接因子分解来有效处理,你应该研究preconditioning your iterative PCG
solver。
良好的预处理可以减少线性系统的有效条件数 - 在大多数情况下大大增强了收敛性。
你应该始终至少使用简单的对角线Jacobi preconditioner,尽管使用更复杂的方法(例如incomplete Cholesky factorisation或可能{{3})通常可以实现更好的性能}。您可能会发现algebraic multi-grid or multi-level methods在这方面很有帮助,因为它包含许多迭代求解器和预处理方案的高性能实现。
希望这有帮助。
答案 2 :(得分:0)
我已经看过(但并未真正接受)最近的工作,例如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的一个特例。
如果推动推进你总是可以降低一个级别(找到更快的实现或在问题上投入更多的硬件)或提升一个级别(尝试找到另一种方法来实现你的目标,而不涉及解决大问题线性系统,或经常解决它们。)