2.5_解的改进
2.5 解的改进*
当矩阵 是病态时, 即使残量 很小, 所求得的数值解 仍可能带有较大的误差. 此时需要通过一些方法来提高解的精度.
2.5.1 高精度运算
在计算中, 尽可能采用高精度的运算. 比如, 原始数据是单精度的, 但在计算时都采用双精度运算, 或者更高精度的运算. 但更高精度的运算会带来更大的开销.
2.5.2 矩阵元素缩放或平衡 (Scaling or equilibration)
在求解线性方程组时, 先对系数矩阵元素进行适当的缩放是一种很常用的技术手段.
一方面, 如果 的元素在数量级上相差很大, 则在计算过程中很可能会出现大数与小数的加减运算, 这样就可能会引入更多的舍入误差. 为了避免由于这种情况而导致的舍入误差, 我们可以在求解之前先对矩阵元素进行缩放 (Scaling), 即在矩阵两边同时乘以两个适当的对角矩阵. 在对矩阵进行缩放时, 需要 运算量, 通常不会产生较大的舍入误差.
另一方面, 由前面的扰动分析可知, 矩阵条件数对数值计算的误差有着很大的影响, 是衡量问题是否病态的一个重要指标. 在实际计算中, 如果遇到病态问题, 我们希望能够通过一些简单的方法降低其条件数. 其中一类简单有效的方法就是在矩阵两边同时乘以一个对角矩阵, 即寻找对角矩阵 和 , 使得 的条件数达到最小 (或者尽可能小). 显然, 寻找这样的对角矩阵是非常困难的, 目前仍然是一个开放问题 [117].
一种比较可行的实用方案是使得缩放后的矩阵的每行或每列具有相同的 -范数.比如取 ,其中 ,这样 的每行的1-范数都一样,但没法使得所有列也具有相同的范数.
如果矩阵
的所有行和所有列都具有相同 (或近似相同) 的范数, 则称为 的均衡化 (equilibration) [117]. 有学者提出了一种迭代方法对 进行均衡化 [82]. 更多信息可参见相关资料, 如 [38].
2.5.3 迭代改进法
设近似解 , 残量 . 当 没达到精度要求时, 可以考虑方程组 . 设 是该方程组的精确解, 则
因此 就是原方程组的精确解
在实际计算中, 我们可能得到的是近似解 , 但通常 应该比较小, 特别地, 比 更小. 因此 应该比 更接近精确解.
如果新的近似解 仍不满足精度要求, 则可重复以上过程
这就是通过迭代来提高解的精度.
算法2.15.通过迭代改进解的精度
1: 设 是 的近似解
2: while 近似解 不满足精度要求, do
3: 计算
4: 求解 ,即
5: 求解 ,即
6: 令
7: end while
由于每次迭代只需计算一次残量和求解两个三角线性方程组, 因此运算量为 . 所以相对来讲还是比较经济的.
为了提高计算精度, 在计算残量 时最好使用原始数据 , 而不是 , 因此对 做PLU分解时需要保留矩阵 , 不能被 和 覆盖.
由于在计算残量时, 可能会存在大量的相近的数相减运算, 因此可以采用更高精度的运算.
实际计算经验表明, 当 病态不是很严重时, 即 , 迭代法可以有效改进解的精度, 最后达到机器精度. 但 时, 一般没什么效果. 这里 表示机器精度.