雅克比旋转

数值线性代数中,雅可比旋转n内积空间的二维线性子空间的旋转Qk,在用做相似变换的时候,被选择来置零n×n 实数对称矩阵A 的非对角元素的对称对:

 A \mapsto Q_{k\ell}^T A Q_{k\ell} = A' . \,\!
\begin{bmatrix} {*} &   &   & \cdots &   &   & * \\   & \ddots &   &   &   &   &   \\   &   & a_{kk} & \cdots & a_{k\ell} &   &   \\ \vdots &   & \vdots & \ddots & \vdots &   & \vdots \\   &   & a_{\ell k} & \cdots & a_{\ell\ell} &   &   \\   &    &   &   &   & \ddots &   \\ {*} &   &   & \cdots &   &   & *\end{bmatrix}\to\begin{bmatrix} {*} &   &   & \cdots &   &   & * \\   & \ddots &   &   &   &   &   \\   &   & a'_{kk} & \cdots & 0 &   &   \\ \vdots &   & \vdots & \ddots & \vdots &   & \vdots \\   &   & 0 & \cdots & a'_{\ell\ell} &   &   \\   &    &   &   &   & \ddots &   \\ {*} &   &   & \cdots &   &   & *\end{bmatrix}

它是雅可比特征值算法的核心运算,它是数值上稳定的并适合用并行计算实现。

注意到只有 A 的行 k 和 ℓ 与列 k 和 ℓ 受到影响,并且 A′ 将保持对称。还有给Qk 的明显的矩阵很少被计算,转而计算辅助值,A 也有效率和数值上稳定的方式更新。但是,为了引用,我们写矩阵为

Q_{k\ell} = \begin{bmatrix} 1 &   &   &   &   &   &   \\   & \ddots &   &   &   & 0 &   \\   &   & c & \cdots & s &   &   \\   &   & \vdots & \ddots & \vdots &   &  \\   &   & -s & \cdots & c &   &   \\   & 0 &   &   &   & \ddots &   \\   &   &   &   &   &   & 1\end{bmatrix} .

就是说,除了四个元素之外,Qk 是一个单位矩阵,两个在对角线上(qkkqℓℓ 都等于 c) 而两个位于远离对角的位置上(qkQk 分别等于 s 和 −s)。这里的 c = cos ϑ 而s = sin ϑ 对于某个角度 ϑ;但是对于应用这种旋转,这个角度自身是不需要的。使用克罗内克δ符号,矩阵元素可以写为

 q_{ij} = \delta_{ij} + (\delta_{ik}\delta_{jk} + \delta_{i\ell}\delta_{j\ell})(c-1) + (\delta_{ik}\delta_{j\ell} - \delta_{i\ell}\delta_{jk})s . \,\!

假设 h 是不为 k 或 ℓ 的索引(它们自身必须是不同的)。类似的更改过程在代数上写为

 a'_{hk} = a'_{kh} = c a_{hk} - s a_{h\ell} \,\!
 a'_{h\ell} = a'_{\ell h} = c a_{h\ell} + s a_{hk} \,\!
 a'_{k\ell} = a'_{\ell k} = (c^2-s^2)a_{k\ell} + sc (a_{kk} - a_{\ell\ell}) = 0 \,\!
 a'_{kk} = c^2 a_{kk} - s^2 a_{\ell\ell} - 2 s c a_{k\ell} \,\!
 a'_{\ell\ell} = c^2 a_{kk} - s^2 a_{\ell\ell} + 2 s c a_{k\ell} \,\!

数值稳定计算

要确定需要更改的数量,我们必须解远离对角的元素为零的方程(Golub & Van Loan 1996,§8.4)

。这蕴涵了

 \frac{c^2-s^2}{sc} = \frac{a_{\ell\ell} - a_{kk}}{a_{k\ell}} .

设 β 是这个数量的一半,

 \beta = \frac{a_{\ell\ell} - a_{kk}}{2 a_{k\ell}} .

如果 ak 是零,我们可以停止而不需要进行更改,因此我们永不除以零。设 t 是 tan ϑ。则通过一些三角恒等式我们简约这个方程为

 t^2 + 2\beta t - 1 = 0 . \,\!

为了稳定性我们选择解

 t = \frac{\sgn(\beta)}{|\beta|+\sqrt{\beta^2+1}} .

以此我们可以获得 cs

 c = \frac{1}{\sqrt{t^2+1}} \,\!
 s = c t \,\!

尽管我们可以使用前面给出的代数更改等式,重写它们会更好。设

 \rho= \frac{s}{1+c} ,

所以 ρ = tan(ϑ/2)。则修订后的修改方程为

 a'_{hk} = a'_{kh} = a_{hk} - s (a_{h\ell} + \rho a_{hk}) \,\!
 a'_{h\ell} = a'_{\ell h} = a_{h\ell} + s (a_{hk} - \rho a_{h\ell}) \,\!
 a'_{k\ell} = a'_{\ell k} = 0 \,\!
 a'_{kk} = a_{kk} - t a_{k \ell} \,\!
 a'_{\ell\ell} = a_{\ell\ell} + t a_{k \ell} \,\!

如前面提及的,我们永不需要明确的计算旋转角度 ϑ。事实上,我们可以通过只保留三个值 k, ℓ 和 t 来重新生成由 Qk 确定的对称更改,带有 t 对零旋转设置为零。

posted on 2013-11-13 09:50  代码王子  阅读(492)  评论(0编辑  收藏  举报

导航