Algorithm 矩阵正定与病态的迭代线性解法

Algorithm 矩阵正定与病态的迭代线性解法,algorithm,math,parallel-processing,numerical-methods,discrete-mathematics,Algorithm,Math,Parallel Processing,Numerical Methods,Discrete Mathematics,我需要一些帮助来解决这个问题 我想求解Ax=b 其中A是nxn(方阵),b是nx1矩阵 但A矩阵具有以下特性: +病态(K>>1)(可能大于10^8) +对称正定(因为它是协方差矩阵) 我已经尝试过雅可比方法,但不幸的是它收敛速度非常慢。我避免使用Cholesky分解 我已经尝试过共轭梯度,但不幸的是,如果矩阵A的条件数太大,它就不能收敛 更新:我需要一个可以在并行框架中运行的方法(比如MPI)。所以我不能使用高斯-塞德尔,它在当前迭代中需要x[I] 我可以用什么方法来解决这类问题?谢谢:)我已

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

我想求解Ax=b

其中
A是nxn(方阵),b是nx1矩阵

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

我已经尝试过雅可比方法,但不幸的是它收敛速度非常慢。我避免使用Cholesky分解

我已经尝试过共轭梯度,但不幸的是,如果矩阵A的条件数太大,它就不能收敛

更新:我需要一个可以在并行框架中运行的方法(比如MPI)。所以我不能使用高斯-塞德尔,它在当前迭代中需要x[I]

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

我已经看到(但没有真正接受)最近在这方面的工作,例如。把你说的和维基百科联系起来,你可能想看看,这是一个特殊的例子


如果遇到紧急情况,您总是可以降低一个级别(找到更快的实现或在问题上投入更多的硬件)或提高一个级别(尝试找到另一种方法来实现您的目标,而不是像大型线性系统那样解算,或经常解算它们).

我猜你的麻烦是由于矩阵向量积的计算不准确引起的。(我从未见过共轭梯度完全无法减少残差,除非矩阵向量积很差。重新启动后的第一次迭代只进行最陡下降。)

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


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

看看你上传的矩阵,很多事情似乎有点奇怪:

  • 矩阵
    K
    是一个相对较小的(
    400x400
    )密集矩阵
  • 您的矩阵
    K
    包含大量接近零的条目,(
    abs(K(i,j))<1.E-16*max(abs(K))
  • 对于这种大小的矩阵,直接计算Cholesky分解应该是最有效的方法。我不知道你为什么说你不能这么做

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


    当求解像这样的稀疏线性方程组时,重要的不是矩阵中的行数/列数,而是矩阵本身的稀疏模式

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

    有许多策略,例如和,应该用于对
    a
    重新排序,以获得
    L*L'
    的伪最优稀疏性

    存在许多实现高性能稀疏因子分解的好包,包括上述重排序方案的实现。我建议你调查一下戴维斯的报告

    如果您仍然发现您的方程组太大,无法使用直接因式分解有效地处理,您应该仔细研究。 良好的预处理可以减少线性系统的有效条件数,在大多数情况下大大提高收敛性

    您应该始终至少使用简单的对角线,尽管通常使用更复杂的方法(如或可能)可以实现更好的性能。您可能会发现这方面的帮助,因为它包含许多迭代解算器和预处理方案的高性能实现


    希望这有帮助。

    是的,我的A矩阵非常差。。。条件编号最多为10^8:(…您想要哪种格式?您希望我将其放在*.mat或*.txt中吗?thx:)10^8甚至没有那么糟糕。第一行是
    #rows#cols#nonzeros
    ,其余每行是
    row col entry
    ,条目至少有17位有效数字,这可能是我最容易处理的文本描述。你有matlab/倍频程吗?如果我把*.mat给你怎么办?因此,您不会丢失@psuedobot的数字精度:将IEEE Double转换为具有17位或更多有效数字的十进制时,您不会丢失精度;这使得它有一个负的特征值。然而,我加载了你的mat文件,我注意到你有一个密集的矩阵,其中有一些非常小的条目。其条件编号约为1e9。尽管如此,您仍然可以在此矩阵(mat文件中的矩阵)上运行未预处理的共轭梯度如果你做了足够精确的算术——只要你仔细计算和,80位硬件浮点值应该可以工作。@psuedobot:我根据你上传的矩阵做了一些编辑。是的,我只是意识到我的大部分值都很小,当我只是将它们设置为零时,结果仍然可以。也许我会尝试使用稀疏矩阵计算,而不是调整/优化密集矩阵雅可比方法:)