我正在尝试解决
给定一个向量和一个大的、对称的正定、稀疏、带状矩阵有一个非常差的条件数。
我知道几种可用于此任务的迭代方法(但尚未全部实现):
a)(预处理)共轭梯度。
b) 简单梯度下降。
c) SSOR/高斯-赛德尔。
d) 上述的多重网格风格。
另外,我知道有稀疏的直接求解器,但我一直不愿意尝试,因为它们看起来非常复杂且难以实现。
那么这里的选择方法是什么呢?
我正在尝试解决
给定一个向量和一个大的、对称的正定、稀疏、带状矩阵有一个非常差的条件数。
我知道几种可用于此任务的迭代方法(但尚未全部实现):
a)(预处理)共轭梯度。
b) 简单梯度下降。
c) SSOR/高斯-赛德尔。
d) 上述的多重网格风格。
另外,我知道有稀疏的直接求解器,但我一直不愿意尝试,因为它们看起来非常复杂且难以实现。
那么这里的选择方法是什么呢?
如果您的带宽很小,那么直接方法将是迄今为止最快的方法,并且如果通过迭代细化实现可以提供几乎工作精度的解决方案,除非条件太差以至于没有方法提供任何精度。
由于您的矩阵是正定的,因此很容易实现直接带状方法 - 由于条件不佳,在继续分解以增加数值稳定性之前,将小于最大对角元素 13-8 倍的所有枢轴增加到该值。我会使用得到的分解作为共轭梯度方法的预处理器,然后你会得到两全其美的效果。
还有其他几种更好更复杂的迭代方法(gmres、bicgstab等),例如这里是Matlab支持的方法列表。如果矩阵非常大,直接方法的效果可能会很差,具体取决于稀疏结构。
但是,为什么您首先要自己实现该方法呢?如果系统很大并且条件很差,那么您自己不太可能比使用成熟库中已经包含的高度优化的方法做得更好。
最好的方法是 MG 预处理 CG。我相信这是这个案子的最终解决者。如果您知道系统是如何生成的,即几何形状已知,则可以应用几何多重网格。如果不是,则应使用代数多重网格。当然,对于小问题 - 直接方法可能更受青睐,但即使在这种情况下,MG+PCG 也非常快 - 当然,如果实施得当。