Jacobi迭代方法矩阵特征值分解
Jacobi迭代方法概述
先回顾下什么是特征值与特征向量:
对于一个 n × n n \times n n×n 的方阵 A A A,如果存在一个非零向量 x \mathbf{x} x 和一个标量 λ \lambda λ,使得
A
x
=
λ
x
,
A\mathbf{x} = \lambda \mathbf{x},
Ax=λx,
则称
λ
\lambda
λ为矩阵
A
A
A 的特征值,
x
\mathbf{x}
x 称为对应的特征向量。
如果
A
A
A 是对称矩阵(即
A
=
A
T
A = A^T
A=AT),那么它具有以下重要性质:
-
所有特征值都是实数。
-
不同特征值对应的特征向量彼此正交。
-
存在一个正交矩阵 P P P 将 A A A对角化,即
P T A P = D P^T A P = D PTAP=D其中 D D D 是对角矩阵,其对角元素即为 A A A 的特征值。
Jacobi迭代方法是一种用于对称矩阵特征值分解的数值方法。其核心思想是通过一系列旋转矩阵,逐步将原矩阵对角化。每次迭代选取矩阵中最大的非对角元素,构造一个旋转矩阵,使得该元素在旋转后变为零。重复这一过程,直到矩阵近似为对角矩阵,此时对角线上的元素即为特征值,旋转矩阵的乘积给出特征向量。领悟不到没关系,细看下算法实现步骤和两个例子就可以明白了。
在实数域上,对于对称矩阵 A,Jacobi方法通常能够稳定收敛。当矩阵的最大非对角元素小到一定阈值时,便可认为矩阵已基本对角化,停止迭代。
算法实现
-
初始化:设定对称矩阵 A A A 和单位矩阵 V V V 作为特征向量的初始矩阵。
-
查找最大非对角元素:在矩阵 A A A 中找到绝对值最大的非对角元素 A p q A_{pq} Apq。
-
计算旋转角度:
θ = 1 2 arctan ( 2 A p q A q q − A p p ) \theta = \frac{1}{2} \arctan\left(\frac{2A_{pq}}{A_{qq} - A_{pp}}\right) θ=21arctan(Aqq−App2Apq)
计算旋转矩阵的正弦和余弦值:
c = cos ( θ ) , s = sin ( θ ) c = \cos(\theta), \quad s = \sin(\theta) c=cos(θ),s=sin(θ) -
构造旋转矩阵:生成一个单位旋转矩阵 J J J,其中仅在 ( p , p ) (p,p) (p,p), ( p , q ) (p,q) (p,q), ( q , p ) (q,p) (q,p), ( q , q ) (q,q) (q,q) 位置有非单位元素:
J = ( ⋱ c ⋯ s ⋮ 1 ⋮ − s ⋯ c ⋱ ) J = \begin{pmatrix} \ddots & & & & \\ & c & \cdots & s & \\ & \vdots & 1 & \vdots & \\ & -s & \cdots & c & \\ & & & & \ddots \end{pmatrix} J= ⋱c⋮−s⋯1⋯s⋮c⋱ -
更新矩阵和特征向量:
A ′ = J T A J , V ′ = V J A' = J^T A J, \quad V' = V J A′=JTAJ,V′=VJ -
检查停止条件:如果所有非对角元素的绝对值均小于预设阈值 ϵ \epsilon ϵ,则停止迭代;否则,返回步骤 2。
2x2矩阵的例子
考虑矩阵 A = ( 4 1 1 3 ) A = \begin{pmatrix} 4 & 1 \\ 1 & 3 \end{pmatrix} A=(4113)。
-
初始化:
V = ( 1 0 0 1 ) V = \begin{pmatrix} 1 & 0 \\ 0 & 1 \end{pmatrix} V=(1001) -
查找最大非对角元素: A 12 = 1 A_{12} = 1 A12=1,唯一的非对角元素。
-
计算旋转角度:
θ = 1 2 arctan ( 2 × 1 3 − 4 ) = 1 2 arctan ( − 2 ) ≈ − 0.4636 弧度 \theta = \frac{1}{2} \arctan\left(\frac{2 \times 1}{3 - 4}\right) = \frac{1}{2} \arctan(-2) \approx -0.4636 \text{ 弧度} θ=21arctan(3−42×1)=21arctan(−2)≈−0.4636 弧度c = cos ( − 0.4636 ) ≈ 0.8944 , s = sin ( − 0.4636 ) ≈ − 0.4472 c = \cos(-0.4636) \approx 0.8944, \quad s = \sin(-0.4636) \approx -0.4472 c=cos(−0.4636)≈0.8944,s=sin(−0.4636)≈−0.4472
-
构造旋转矩阵:
J = ( 0.8944 − 0.4472 0.4472 0.8944 ) J = \begin{pmatrix} 0.8944 & -0.4472 \\ 0.4472 & 0.8944 \end{pmatrix} J=(0.89440.4472−0.44720.8944) -
更新矩阵:
A ′ = J T A J = ( 4.2361 0 0 2.7639 ) A' = J^T A J = \begin{pmatrix} 4.2361 & 0 \\ 0 & 2.7639 \end{pmatrix} A′=JTAJ=(4.2361002.7639)
更新特征向量:
V ′ = V J = ( 0.8944 − 0.4472 0.4472 0.8944 ) V' = V J = \begin{pmatrix} 0.8944 & -0.4472 \\ 0.4472 & 0.8944 \end{pmatrix} V′=VJ=(0.89440.4472−0.44720.8944) -
检查停止条件:所有非对角元素为 0,满足条件,迭代结束。
特征值为 4.2361 和 2.7639,特征向量分别为
(
0.8944
0.4472
)
\begin{pmatrix} 0.8944 \\ 0.4472 \end{pmatrix}
(0.89440.4472)
和
(
−
0.4472
0.8944
)
\begin{pmatrix} -0.4472 \\ 0.8944 \end{pmatrix}
(−0.44720.8944)。
3x3矩阵的例子
考虑矩阵 A = ( 4 1 2 1 3 1 2 1 3 ) A = \begin{pmatrix} 4 & 1 & 2 \\ 1 & 3 & 1 \\ 2 & 1 & 3 \end{pmatrix} A= 412131213 。
-
初始化:
V = ( 1 0 0 0 1 0 0 0 1 ) V = \begin{pmatrix} 1 & 0 & 0 \\ 0 & 1 & 0 \\ 0 & 0 & 1 \end{pmatrix} V= 100010001 -
查找最大非对角元素: A 13 = 2 A_{13} = 2 A13=2 是最大的非对角元素。
-
计算旋转角度:
θ = 1 2 arctan ( 2 × 2 3 − 4 ) = 1 2 arctan ( − 4 ) ≈ − 1.1903 弧度 \theta = \frac{1}{2} \arctan\left(\frac{2 \times 2}{3 - 4}\right) = \frac{1}{2} \arctan(-4) \approx -1.1903 \text{ 弧度} θ=21arctan(3−42×2)=21arctan(−4)≈−1.1903 弧度c = cos ( − 1.1903 ) ≈ 0.3624 , s = sin ( − 1.1903 ) ≈ − 0.9320 c = \cos(-1.1903) \approx 0.3624, \quad s = \sin(-1.1903) \approx -0.9320 c=cos(−1.1903)≈0.3624,s=sin(−1.1903)≈−0.9320
-
构造旋转矩阵(对第1和第3列进行旋转):
J = ( 0.3624 0 − 0.9320 0 1 0 0.9320 0 0.3624 ) J = \begin{pmatrix} 0.3624 & 0 & -0.9320 \\ 0 & 1 & 0 \\ 0.9320 & 0 & 0.3624 \end{pmatrix} J= 0.362400.9320010−0.932000.3624 -
更新矩阵:
A ′ = J T A J ≈ ( 5.0 1.7321 0 1.7321 3 1 0 1 1 ) A' = J^T A J \approx \begin{pmatrix} 5.0 & 1.7321 & 0 \\ 1.7321 & 3 & 1 \\ 0 & 1 & 1 \end{pmatrix} A′=JTAJ≈ 5.01.732101.732131011
更新特征向量:
V ′ = V J = ( 0.3624 0 − 0.9320 0 1 0 0.9320 0 0.3624 ) V' = V J = \begin{pmatrix} 0.3624 & 0 & -0.9320 \\ 0 & 1 & 0 \\ 0.9320 & 0 & 0.3624 \end{pmatrix} V′=VJ= 0.362400.9320010−0.932000.3624 -
下一步迭代:重复上述步骤,继续查找更新后的最大非对角元素,直至所有非对角元素小于阈值。
Jacobi迭代方法在对称矩阵下保证收敛,即逐步将矩阵对角化。停止条件通常设定为所有非对角元素的绝对值均小于预设的阈值 ϵ \epsilon ϵ,如 1 0 − 6 10^{-6} 10−6。收敛速度依赖于矩阵的初始形式和选择旋转顺序,但在实践中通常能较快达到所需精度。
MATLAB代码示例
以下是使用MATLAB实现Jacobi迭代方法的简洁代码。
function [D, V] = jacobi_eigen(A, tol, max_iter)
% 检查是否为方阵和对称矩阵
[n, m] = size(A);
V = eye(n);
iter = 0;
while true
iter = iter + 1;
% 查找最大的非对角元素
off = A - diag(diag(A));
[max_val, ind] = max(abs(off(:)));
[p, q] = ind2sub(size(A), ind);
if max_val < tol || iter > max_iter
break;
end
if A(p,p) == A(q,q)
theta = pi/4;
else
theta = 0.5 * atan(2*A(p,q)/(A(q,q) - A(p,p)));
end
c = cos(theta);
s = sin(theta);
% 构造旋转矩阵
J = eye(n);
J(p,p) = c;
J(q,q) = c;
J(p,q) = s;
J(q,p) = -s;
% 更新A和V
A = J' * A * J;
V = V * J;
end
D = A;
end
% 2x2矩阵示例
A2 = [4, 1; 1, 3];
tol = 1e-6;
max_iter = 100;
[D2, V2] = jacobi_eigen(A2, tol, max_iter);
disp('2x2矩阵特征值:');
disp(diag(D2));
disp('2x2矩阵特征向量:');
disp(V2);
% 3x3矩阵示例
A3 = [4, 1, 2; 1, 3, 1; 2, 1, 3];
[D3, V3] = jacobi_eigen(A3, tol, max_iter);
disp('3x3矩阵特征值:');
disp(diag(D3));
disp('3x3矩阵特征向量:');
disp(V3);
matlab计算结果如下