什么是检查共轭梯度算法中是否发生任何数值错误的好方法。另外,为什么不建议通过检查搜索方向的 A 正交性或检查残差的正交性来检查错误?
注意:这里的错误是指 CPU 浮点单元的错误,因为计算不正确(可能是由于缓存中的数据损坏等)而不是由于舍入错误。在某些情况下,错误可能是由于矩阵向量积的计算不正确(在矩阵 A 不明确可用的情况下)。
什么是检查共轭梯度算法中是否发生任何数值错误的好方法。另外,为什么不建议通过检查搜索方向的 A 正交性或检查残差的正交性来检查错误?
注意:这里的错误是指 CPU 浮点单元的错误,因为计算不正确(可能是由于缓存中的数据损坏等)而不是由于舍入错误。在某些情况下,错误可能是由于矩阵向量积的计算不正确(在矩阵 A 不明确可用的情况下)。
您正在寻找的是所谓的容错计算。对于高度敏感的例程,传统上使用冗余计算:每个基本步骤执行两次,如果结果一致,则继续;否则再次重复并选择出现两次的结果(通常在独立机器上)。有更近期的方法具有更少的开销,但除了非常特定类型的错误之外,需要某种额外的计算(校验和、概率重复以及检查点)来捕获错误。对于迭代线性求解器尤其如此,因为它们非常脆弱(它们可能无法收敛甚至计算错误的解)。对于共轭梯度,这在http://www.emcl.kit.edu/preprints/emcl-preprint-2011-10.pdf。在这里,共轭梯度(以缺陷校正形式)经常重新启动,并且残差未能减少的迭代被丢弃,因为错误已损坏。
另一方面(并且由于您在问题中提到了这种情况),还调查了由于矩阵向量积计算不正确引起的错误;关键字是不精确的共轭梯度。见,例如,
如果您尝试使用 CG 寻求最小二乘解, 在哪里不是对称的,甚至不是正方形的,你将解决正规方程.
在这种情况下,根据我的经验,检查是否确实是伴随通过使用伴随(内积)的定义,尤其是当您隐式计算时和. 每次我发现我的 CG 没有收敛,都是由于错误,即它不是严格的伴随.