Jacobi迭代方法矩阵特征值分解

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方法通常能够稳定收敛。当矩阵的最大非对角元素小到一定阈值时,便可认为矩阵已基本对角化,停止迭代。

算法实现

  1. 初始化:设定对称矩阵 A A A 和单位矩阵 V V V 作为特征向量的初始矩阵。

  2. 查找最大非对角元素:在矩阵 A A A 中找到绝对值最大的非对角元素 A p q A_{pq} Apq

  3. 计算旋转角度
    θ = 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(AqqApp2Apq)
    计算旋转矩阵的正弦和余弦值:
    c = cos ⁡ ( θ ) , s = sin ⁡ ( θ ) c = \cos(\theta), \quad s = \sin(\theta) c=cos(θ),s=sin(θ)

  4. 构造旋转矩阵:生成一个单位旋转矩阵 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= cs1sc

  5. 更新矩阵和特征向量
    A ′ = J T A J , V ′ = V J A' = J^T A J, \quad V' = V J A=JTAJ,V=VJ

  6. 检查停止条件:如果所有非对角元素的绝对值均小于预设阈值 ϵ \epsilon ϵ,则停止迭代;否则,返回步骤 2。

2x2矩阵的例子

考虑矩阵 A = ( 4 1 1 3 ) A = \begin{pmatrix} 4 & 1 \\ 1 & 3 \end{pmatrix} A=(4113)

  1. 初始化
    V = ( 1 0 0 1 ) V = \begin{pmatrix} 1 & 0 \\ 0 & 1 \end{pmatrix} V=(1001)

  2. 查找最大非对角元素 A 12 = 1 A_{12} = 1 A12=1,唯一的非对角元素。

  3. 计算旋转角度
    θ = 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(342×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

  4. 构造旋转矩阵
    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.44720.44720.8944)

  5. 更新矩阵
    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.44720.44720.8944)

  6. 检查停止条件:所有非对角元素为 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

  1. 初始化
    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

  2. 查找最大非对角元素 A 13 = 2 A_{13} = 2 A13=2 是最大的非对角元素。

  3. 计算旋转角度
    θ = 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(342×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

  4. 构造旋转矩阵(对第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.93200100.932000.3624

  5. 更新矩阵
    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.93200100.932000.3624

  6. 下一步迭代:重复上述步骤,继续查找更新后的最大非对角元素,直至所有非对角元素小于阈值。

Jacobi迭代方法在对称矩阵下保证收敛,即逐步将矩阵对角化。停止条件通常设定为所有非对角元素的绝对值均小于预设的阈值 ϵ \epsilon ϵ,如 1 0 − 6 10^{-6} 106。收敛速度依赖于矩阵的初始形式和选择旋转顺序,但在实践中通常能较快达到所需精度。

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计算结果如下

image-20241230134217499

image-20241230134231946

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值