H_+ = Q^* H Q 为海森堡形式取决于表达式中的项 g y^* H R 消失,即
因此当 y 的第一个分量很小时,可能会出现数值困难。具体来说,y^*H = \theta y^* 并且因此在精确算术中 y^* H R = 0。然而,在有限精度下,计算得到的 fl(y^* H) = \theta y^* + z^*。误差 z 相对于 \Vert H \Vert 约为 \epsilon_M,但
解决办法是引入逐步可接受的扰动和向量 y 的重缩放,同时强制满足以下条件:
基本思想如下:如果在第 j 步,计算得到的 fl(y^* H q_j ) 不够小,则通过缩放向量 y_j 和分量 \eta_{j+1} 来调整使其足够小。在计算 q_{j+1} 之前进行这种重缩放,我们有 y_j \leftarrow y_j \phi 和 \hat{y}_j \leftarrow \hat{y}_j \psi,其中 y^* = [ y_j^* , \hat{y}_j^*]。当然,\Vert y \Vert 不应因这种缩放而改变,因此这是必要的。这给出了以下方程组来确定 \phi 和 \psi:如果 \vert y_j^* H_j \hat{q}_j + \rho_j \beta_j \eta_{j+1} \vert >\epsilon_M \tau_{j+1},
算法 7.9 所示的代码实现了这一方案,以计算可接受的 Q。[1] 在实践中,这种变换可以在不存储 Q 的情况下就地计算并应用于 H := Q^* H Q 和 V := VQ。然而,这种实现非常微妙,构造 Q 的细节要求避免了额外的存储。该代码与上述描述略有不同,因为向量 y 仅在确定所有列 2 到 n 之后才被重缩放以具有单位范数。
算法 7.9:IRAM的稳定正交消去变换 (1) 从满足 \|y\|=1 的n维向量y开始,\eta=e_n^* y 以及满足 T y=\theta y 的n阶对称三对角矩阵T (2) Q=0 (3) 当 y(i)=0, y(i)=\epsilon_M / n, i:=i+1,结束循环 (4) \sigma=y(1)^2, \quad \tau_0=|y(1)| (5) 对于 j=2,\ldots, n (6) \sigma=\sigma+y(j)^2, \quad \tau=\sqrt{\sigma} (7) \gamma=-(y(j)/\tau)/\tau_0 (8) \rho=\tau_0/\tau (9) Q(1: j-1, j)=y(1: j-1)\gamma, Q(j, j)=\rho (10) 如果 (j\lt n 且 \tau\lt.05) (11) \tau_p=\sqrt{\sigma+y(j+1)^2} (12) \alpha=y(1: j)^* H(1: j, 1: j) Q(1: j, j) (13) \delta=y(j+1) H(j, j+1)\rho (14) \sigma_0=-1 (15) 如果 \operatorname{sign}(\alpha)\cdot\operatorname{sign}(\delta)\lt 0, \sigma_0=1,结束如果 (16) 如果 |\delta+\alpha|>\epsilon_M\tau_p (17) 如果 \rho<\sqrt{\epsilon_M} / 100 (18) Q(j, j)=Q(j, j)\sigma_0(\epsilon_M\tau_p+|\alpha|)/|\delta| (19) 否则 (20) 如果 |\alpha|>|\delta| (21) \phi=\sigma_0(\epsilon_M\tau_p+|\delta|)/|\alpha| (22) y(1: j)=y(1: j)\phi (23) \sigma=\sigma\phi^2, \quad \tau=\tau|\phi| (24) 否则 (25) \psi=\sigma_0(\epsilon_M\tau_p+|\alpha|)/|\delta| (26) y(j+1: n)=y(j+1: n)\psi (27) 结束如果 (28) 结束如果 (29) 结束如果 (30) 结束如果 (31) \tau_0=\tau (32) 结束循环 (33) Q(:, 1)=y/\|y\|
有几个实现问题需要注意: