1379 字
7 分钟
jacobi
迭代方法矩阵特征值分解
Jacobi迭代方法概述
先回顾下什么是特征值与特征向量:
对于一个 的方阵 ,如果存在一个非零向量 和一个标量 ,使得
则称 为矩阵 的特征值, 称为对应的特征向量。 如果 是对称矩阵(即 ),那么它具有以下重要性质:
-
所有特征值都是实数。
-
不同特征值对应的特征向量彼此正交。
-
存在一个正交矩阵 将 对角化,即
其中 是对角矩阵,其对角元素即为 的特征值。
Jacobi迭代方法是一种用于对称矩阵特征值分解的数值方法。其核心思想是通过一系列旋转矩阵,逐步将原矩阵对角化。每次迭代选取矩阵中最大的非对角元素,构造一个旋转矩阵,使得该元素在旋转后变为零。重复这一过程,直到矩阵近似为对角矩阵,此时对角线上的元素即为特征值,旋转矩阵的乘积给出特征向量。领悟不到没关系,细看下算法实现步骤和两个例子就可以明白了。
在实数域上,对于对称矩阵 A,Jacobi方法通常能够稳定收敛。当矩阵的最大非对角元素小到一定阈值时,便可认为矩阵已基本对角化,停止迭代。
算法实现
- 初始化:设定对称矩阵 和单位矩阵 作为特征向量的初始矩阵。
- 查找最大非对角元素:在矩阵 中找到绝对值最大的非对角元素 。
- 计算旋转角度: 计算旋转矩阵的正弦和余弦值:
- 构造旋转矩阵:生成一个单位旋转矩阵 ,其中仅在 ,,, 位置有非单位元素:
- 更新矩阵和特征向量:
- 检查停止条件:如果所有非对角元素的绝对值均小于预设阈值 ,则停止迭代;否则,返回步骤 2。
2x2矩阵的例子
考虑矩阵 。
- 初始化:
- 查找最大非对角元素:,唯一的非对角元素。
- 计算旋转角度:
- 构造旋转矩阵:
- 更新矩阵: 更新特征向量:
- 检查停止条件:所有非对角元素为 0,满足条件,迭代结束。
特征值为 4.2361 和 2.7639,特征向量分别为 和 。
3x3矩阵的例子
考虑矩阵 。
- 初始化:
- 查找最大非对角元素: 是最大的非对角元素。
- 计算旋转角度:
- 构造旋转矩阵(对第1和第3列进行旋转):
- 更新矩阵: 更新特征向量:
- 下一步迭代:重复上述步骤,继续查找更新后的最大非对角元素,直至所有非对角元素小于阈值。
Jacobi迭代方法在对称矩阵下保证收敛,即逐步将矩阵对角化。停止条件通常设定为所有非对角元素的绝对值均小于预设的阈值 ,如 。收敛速度依赖于矩阵的初始形式和选择旋转顺序,但在实践中通常能较快达到所需精度。
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计算结果如下


部分信息可能已经过时