快速幂迭代法计算矩阵主特征值
题目描述
给定一个 \(n \times n\) 的方阵 \(A\)。我们需要找到其模最大的特征值(称为主特征值)及对应的特征向量。这个问题在线性代数、物理、工程和数据科学中很常见,例如计算矩阵的谱半径、网页排名算法(PageRank)的核心步骤等。快速幂迭代法是一种经典且高效的数值算法,特别适用于大型稀疏矩阵。其核心思想是通过反复将矩阵作用于一个初始向量,使向量方向逐渐收敛到主特征向量,从而计算出主特征值。
解题过程详解
我们将这个过程分解为几个步骤,从基本原理到具体实现细节。
第一步:幂迭代法的基本原理
幂迭代法基于一个直观的观察:假设矩阵 \(A\) 的特征值为 \(\lambda_1, \lambda_2, \dots, \lambda_n\),且满足 \(|\lambda_1| > |\lambda_2| \ge \dots \ge |\lambda_n|\)。对应的特征向量为 \(v_1, v_2, \dots, v_n\),它们线性无关。那么,任意一个非零初始向量 \(x_0\) 可以表示为这些特征向量的线性组合:
\[x_0 = c_1 v_1 + c_2 v_2 + \dots + c_n v_n,\quad 其中\ c_1 \neq 0。 \]
(如果 \(c_1 = 0\),由于数值误差,迭代中通常会引入 \(v_1\) 的分量。)
第二步:迭代过程
将 \(A\) 反复左乘初始向量 \(x_0\),得到迭代序列:
\[x_k = A x_{k-1} = A^k x_0。 \]
代入特征向量展开式:
\[x_k = A^k (c_1 v_1 + c_2 v_2 + \dots + c_n v_n) = c_1 \lambda_1^k v_1 + c_2 \lambda_2^k v_2 + \dots + c_n \lambda_n^k v_n。 \]
两边提取因子 \(\lambda_1^k\):
\[x_k = \lambda_1^k \left[ c_1 v_1 + c_2 \left(\frac{\lambda_2}{\lambda_1}\right)^k v_2 + \dots + c_n \left(\frac{\lambda_n}{\lambda_1}\right)^k v_n \right]。 \]
由于 \(|\lambda_1| > |\lambda_i|\ (i>1)\),随着 \(k\) 增大,括号内从第二项起的所有项都趋于零。因此,当 \(k\) 充分大时,\(x_k\) 的方向逼近主特征向量 \(v_1\)。
第三步:防止数值溢出/下溢
\(\lambda_1^k\) 可能导致向量元素过大(\(|\lambda_1|>1\))或过小(\(|\lambda_1|<1\))。为了数值稳定性,每次迭代后对向量进行归一化(缩放为单位长度)。这不会改变方向,且方便后续计算。修改迭代格式为:
- 选择初始向量 \(x_0\)(通常为随机向量,例如元素服从标准正态分布),并归一化:\(x_0 \leftarrow x_0 / \|x_0\|\)。
- 对于 \(k = 1, 2, \dots\) 直到收敛:
a. 计算 \(y_k = A x_{k-1}\)。
b. 估计特征值:\(\mu_k = x_{k-1}^T y_k\)(瑞利商近似,后面解释)。
c. 归一化向量:\(x_k = y_k / \|y_k\|\)。
第四步:特征值估计
当 \(x_k\) 接近 \(v_1\) 时,有 \(A x_k \approx \lambda_1 x_k\)。特征值 \(\lambda_1\) 可由瑞利商近似:
\[\lambda_1 \approx \frac{x_k^T A x_k}{x_k^T x_k} = x_k^T (A x_k)。 \]
由于已归一化(\(\|x_k\|=1\)),这简化为 \(x_k^T (A x_k)\)。但在迭代中,我们更常用已计算的 \(y_k\) 和归一化前的 \(x_{k-1}\)。观察:当接近收敛时,\(x_{k-1} \approx x_k \approx v_1\),且 \(A x_{k-1} = y_k \approx \lambda_1 x_k\),那么:
\[x_{k-1}^T y_k \approx v_1^T (\lambda_1 v_1) = \lambda_1 (v_1^T v_1) = \lambda_1。 \]
因此,步骤 2(b) 中的 \(\mu_k = x_{k-1}^T y_k\) 是主特征值的一个近似。
第五步:收敛性判断
迭代在满足以下条件之一时停止:
- 向量变化小:\(\|x_k - x_{k-1}\| < \text{tol}\)(例如 \(\text{tol}=10^{-12}\)),表明方向已稳定。
- 特征值变化小:\(|\mu_k - \mu_{k-1}| < \text{tol} \cdot |\mu_k|\)。
- 达到最大迭代次数(防止无限循环)。
第六步:算法伪代码
输入:矩阵 \(A \in \mathbb{R}^{n \times n}\),初始向量 \(x_0 \in \mathbb{R}^n\)(随机生成),容差 \(\text{tol}\),最大迭代次数 \(max\_iter\)。
输出:主特征值近似 \(\lambda\),主特征向量近似 \(v\)。
- 归一化:\(x \leftarrow x_0 / \|x_0\|_2\)。
- \(\lambda_{old} \leftarrow 0\)。
- 对于 \(k = 1\) 到 \(max\_iter\):
a. \(y \leftarrow A x\)。
b. \(\lambda \leftarrow x^T y\)。
c. 如果 \(|\lambda - \lambda_{old}| < \text{tol} \cdot |\lambda|\):跳出循环。
d. \(\lambda_{old} \leftarrow \lambda\)。
e. 如果 \(\|y\|_2 = 0\):跳出循环(矩阵奇异,主特征值可能为0)。
f. \(x \leftarrow y / \|y\|_2\)。 - 返回 \(\lambda\) 和 \(x\)。
第七步:注意事项与扩展
- 收敛速度:收敛速率取决于比值 \(|\lambda_2 / \lambda_1|\)。若比值接近1,收敛会很慢。这时可采用位移技巧(如Rayleigh商位移)加速。
- 多个主特征值:若 \(|\lambda_1| = |\lambda_2|\)(例如符号相反或复共轭),方法可能不收敛或收敛到子空间,需特殊处理。
- 稀疏矩阵:对稀疏 \(A\),计算 \(A x\) 应使用稀疏矩阵乘法,避免显式存储,以节省内存和时间。
- 特征向量符号:迭代得到的特征向量符号不确定(乘以-1仍是特征向量)。
- 后续特征值:可通过收缩(deflation)技术,如减去已得特征分量,再对剩余空间应用幂迭代,求下一个特征值。
总结
快速幂迭代法是一种简单而强大的算法,用于计算矩阵的主特征值和特征向量。其核心是通过迭代和归一化,使向量序列收敛到主特征方向,并用瑞利商估计特征值。虽然它只求主特征值,但在许多应用中已足够,且是更复杂特征值算法(如Arnoldi、Lanczos)的基础构件。