我有一个应用程序,我正在计算一个数量,该数量由点的平均值近似。为无穷大时,平均值会收敛到正确的量。在实践中,计算涉及一个对称正定矩阵,当增加时,其条件数变得很大。我将条件数计算为selfadjoint eigensolver给出的最大和最小特征值的比率。
时,我计算的平均值似乎并没有达到平稳性真的很大时开始偏离我认为的正确值。
我怎样才能选择最好的?有没有办法根据条件编号在我得到的结果上放置一些错误栏?什么是 cholesky 分解和 SPD 矩阵的坏条件数,例如我应该什么时候开始担心?
我有一个应用程序,我正在计算一个数量,该数量由点的平均值近似。为无穷大时,平均值会收敛到正确的量。在实践中,计算涉及一个对称正定矩阵,当增加时,其条件数变得很大。我将条件数计算为selfadjoint eigensolver给出的最大和最小特征值的比率。
时,我计算的平均值似乎并没有达到平稳性真的很大时开始偏离我认为的正确值。
我怎样才能选择最好的?有没有办法根据条件编号在我得到的结果上放置一些错误栏?什么是 cholesky 分解和 SPD 矩阵的坏条件数,例如我应该什么时候开始担心?
我对你为什么说分解给你特征值感到困惑;人们当然可以从中廉价地计算对称矩阵的行列式(和惯性),但它本身并不直接产生特征值,因为不是相似变换,除非。此外,我建议对 SPD 矩阵使用 Cholesky(即)分解而不是。
如果事实证明条件数真的很糟糕,那么你的状态仍然不错,因为预处理 SPD 矩阵通常不是很有挑战性,尤其是对角占优矩阵。
编辑:既然你更新了你的问题,我会更新我的回复。
如果您的条件数真的变得像一样高(这样您将丢失大约 10 个十进制数字,正如@aeismail 提到的),对于可以在常规机器上计算密集特征解的矩阵,然后我会首先确保没有发生数字暴行。特别是,我会确保您的自伴随矩阵不会形成为矩阵与其自身的对称乘积,例如,因为的条件数将是条件的平方数字。会好得多。
另一方面,通常有一些方法可以廉价地提高解决方案的质量。例如,如果您使用分解来求解线性系统,则可以通过运行少数 GMRES 迭代(或您最喜欢的迭代方法)来“迭代优化”您的解决方案,并将直接求解的解决方案作为初始猜测。你还没有说明你想用你的系统做什么,所以我不能说更多。
评论关于矩阵的误差界限的问题:指定严格界限有点棘手,但是数值线性代数中有一个启发式规则,即条件数将导致损失大约 base-位精度。因此,例如,条件数意味着您将失去位精度。
还有一种蛮力方法来处理不是非常大的矩阵的病态:您可以尝试提高机器算术的精度。如果您使用 C 或其他受支持的语言,显而易见的选择是GNU GMP 库。但它可以在 Mathematica 中使用 SetPrecision[...] 函数变得更简单(并且计算量更大)。
当然,条件数越多,获得满意结果所需的精度位数就越多。
对于严格但可能较弱的误差范围,您可以参考Nick Higham 的Accuracy and Stability of Numerical Algorithms , 2nd edition。后验误差估计可能只适用于一阶,但可能有用。Don Estep 主要研究偏微分方程的解,但他确实在本演示文稿的幻灯片 72 中给出了一个线性代数示例,并且在本演示文稿的幻灯片 53-56 中给出了一个更加充实的示例。如果误差很小,这些估计可以做得很好,但对于较大的误差往往不那么准确。