特征值和特征向量是矩阵的属性,也就是说这是一个变换的属性。对于矩阵A,假设x为A的一个特征向量,则Ax=μx。可见该变换对于特征向量,只缩放了向量,而没有改变向量的方向,特征值的就是缩放的系数,是一个倍数关系。如果我们有一个向量,我们想设计一个变换,使得该向量经过该变换后不改变方向,只改变大小。那么特征值和特征向量就可以用来作为我们设计变换的依据,即我们要使该变换的特征向量和这个向量的方向相同。
雅可比(Jacobi)算法
雅可比(Jacobi)算法是一个用于计算实对称矩阵的所有特征值和特征向量的经典算法。在以下示例中,A为一个实对称矩阵,U为对应的特征向量构成的矩阵,D为对应的特征值。该算法的代码可参照这个代码中的函数jacobi_4x4
。
雅可比算法的基本原理
1.实对称矩阵
雅可比算法处理的是实对称矩阵,这意味着矩阵等于其转置矩阵(即,A[i][j] = A[j][i]对所有i,j都成立)。实对称矩阵的特征值都是实数,且存在一组正交特征向量。
2.轮换法
算法的核心思想是通过一系列的旋转操作,逐步将矩阵转化为对角矩阵,而对角线上的元素即为矩阵的特征值。每次旋转操作都会选取矩阵的一个非对角元素,并通过旋转使该元素变为0,同时保持矩阵的对称性和特征值不变。
3.旋转矩阵
每次旋转都使用一个旋转矩阵,该旋转矩阵是通过计算旋转角度θ来定义的。旋转的目的是使得在某个特定的非对角位置的元素被置为0。旋转矩阵是正交的,这意味着它不会改变原矩阵的特征值。
关键步骤
1.初始化
方法开始时,将输出矩阵U初始化为单位矩阵,这是因为旋转矩阵的乘积将会累积在这个矩阵中,最终U将包含原矩阵A的特征向量。同时,将A的对角元素复制到D中,作为特征值的初始近似。
2.旋转阈值
对于前几次迭代,算法使用一个非零的旋转阈值,以便于早期更积极地进行旋转。随着迭代的进行,这个阈值会被设置为0,从而减少不必要的旋转。
3.旋转操作
对于矩阵A中的每个非对角元素,如果其绝对值大于旋转阈值,则计算一个旋转矩阵X使得该元素被旋转为0。这个旋转同时会影响到矩阵的其他元素,以保持矩阵的对称性和特征值不变。该旋转矩阵根据上一次迭代得到的D计算。
4.更新特征值和特征向量
每次旋转后,都会更新近似的特征值以及累积在U中的特征向量,即U=UX,D=DX。
5.收敛检查
如果所有非对角元素的绝对值之和接近于0,这意味着矩阵已经接近对角化,算法则认为已经收敛,返回真。如果经过预设的迭代次数后仍未收敛,则返回假。此时得到的U即为特征向量构成的矩阵,已经变换为对角矩阵的A的对角元素即为特征值。