MATLAB求解矩阵特征值的六种方法

简介: 关于这个特征值的求解一共六种方法幂法反幂法QR方法对称QR方法jacobi方法二分法

接下来就着重讲解这些算法的是如何使用的
幂法
算法如下,
输入:
矩阵A、非零矢量x0、maxit(2000)、tol(1.0e-7)
输出:
模的最大特征量a、模的最大特征量对应的特征向量x

function [a,x,n] = pmethod(A,x0,maxit,tol)
if nargin == 3
    tol = 1.0e-6;
elseif nargin == 2
    maxit = 1000;
    tol = 1.0e-6;
end
a0 = 0;
y = A * x0;
a = max(abs(y));
x = y / a;
n = 1;
while (abs(a - a0) > tol) && (n < maxit)
    a0 = a;
    x0 = x;
    y = A * x0;
    a = max(abs(y));
    x = y / a;
    n = n + 1;
end
if (n > maxit)
    disp(['迭代步数大于',num2str(maxit),'收敛太慢了!']);
else
    disp(['幂法迭代',num2str(n),'步收敛']);
end

反幂法应用幂法于矩阵的反求矩阵的特征值
输入:矩阵A、非零矢量x0、maxit(2000)、tol(1.0e-7)
输出:模的最小特征量a、模的最小特征量对应的特征向量x

function [a,x,n] = vpmethod(A,x0,maxit,tol)
if nargin == 3
    tol = 1.0e-6;
elseif nargin == 2
    maxit = 1000;
    tol = 1.0e-6;
end
[L,U,P] = lu(A);
a0 = 0;
y = utri(U,ltri(L,P*x0));
a = max(abs(y));
x = y / a;
n = 1;
while (abs(a - a0) > tol) && (n < maxit)
    a0 = a;
    x0 = x;
    y = ltri(L,P*x0);
    y = utri(U,y);
    a = max(abs(y));
    x = y / a;
    n = n + 1;
end
a = 1 / a;
if (n >= maxit)
    disp(['迭代步数大于',num2str(maxit),'收敛太慢了!']);
else
    disp(['反幂法迭代',num2str(n),'步收敛']);
end

这里还用到上次的ltri和utri函数,使用时把他们当作函数来使用就可以

%ltri
function y = ltri(L,b)
n=size(b,1);
y=zeros(n,1);
for j = 1:n-1
    y(j) = b(j)/L(j,j);
    b(j+1:n) = b(j+1:n) - y(j) * L(j+1:n,j);
end
y(n) = b(n)/L(n,n);

%utri
function x = utri(U,y)
n=size(y,1);
x=zeros(n,1);
for j = n:-1:2
    x(j) = y(j)/U(j,j);
    y(1:j-1) = y(1:j-1) - x(j) * U(1:j-1,j);
end
x(1) = y(1)/U(1,1);

QR方法利用正交相似变换
输入:
矩阵A、maxit(2000)、tol(1.0e-7)
输出:
所有特征值、所有特征值所对应的特征向量

function [a,x] = qrmd(A,maxit,tol)
%a(i,1)为第i个特征值,x(:,i)为第i个特征值对应的特征向量
if nargin == 2
    tol = 1.0e-6;
elseif nargin == 1
    maxit = 1000;
    tol = 1.0e-6;
end
A0 = A;
a0 =diag(A);
[Q,R] = qr(A);
A = R*Q;
a = diag(A);
n = 1;
while (max(abs(a-a0)) > tol) && (n <= maxit)
    a0 = a;
    [Q,R] = qr(A);
    A = R*Q;
    a = diag(A);
    n = n + 1;
end
if (n > maxit)
    disp(['迭代步数大于',num2str(maxit),'收敛太慢了!']);
else
    disp(['QR方法迭代',num2str(n),'步收敛']);
    n = size(a,1);
    x = zeros(n);
    for i = 1:n
        x0 = ones(n,1);
        [b,x0] = vpmethod(A0-a(i,1)*eye(n),x0,maxit,tol);
        x(:,i) = x0;
        a(i,:) = a(i,:) + b;
    end
end

这里也是运用到了一些常用的计算函数,直接复制在上面就可以

%ltri
function y = ltri(L,b)
n=size(b,1);
y=zeros(n,1);
for j = 1:n-1
    y(j) = b(j)/L(j,j);
    b(j+1:n) = b(j+1:n) - y(j) * L(j+1:n,j);
end
y(n) = b(n)/L(n,n);

%utri
function x = utri(U,y)
n=size(y,1);
x=zeros(n,1);
for j = n:-1:2
    x(j) = y(j)/U(j,j);
    y(1:j-1) = y(1:j-1) - x(j) * U(1:j-1,j);
end
x(1) = y(1)/U(1,1);

%vpmethod
function [a,x,n] = vpmethod(A,x0,maxit,tol)
if nargin == 3
    tol = 1.0e-6;
elseif nargin == 2
    maxit = 1000;
    tol = 1.0e-6;
end
[L,U,P] = lu(A);
a0 = 0;
y = utri(U,ltri(L,P*x0));
a = max(abs(y));
x = y / a;
n = 1;
while (abs(a - a0) > tol) && (n < maxit)
    a0 = a;
    x0 = x;
    y = ltri(L,P*x0);
    y = utri(U,y);
    a = max(abs(y));
    x = y / a;
    n = n + 1;
end
a = 1 / a;
if (n >= maxit)
    disp(['迭代步数大于',num2str(maxit),'收敛太慢了!']);
else
    disp(['反幂法迭代',num2str(n),'步收敛']);
end

对称QR方法
输入:
矩阵A、maxit(2000)、tol(1.0e-7)
输出:
所有特征值、所有特征值所对应的特征向量

function [a,x] = wilkinsonqr(A,maxit,tol)
%a(i,1)为第i个特征值,x(:,i)为第i个特征值对应的特征向量,A为实对称矩阵
if nargin == 2
    tol = 1.0e-6;
elseif nargin == 1
    maxit = 1000;
    tol = 1.0e-6;
end
n = size(A,1);
A0 = A;
A = hess(A);
a0 =diag(A);
d = (A(n-1,n-1) - A(n,n)) / 2;
u = A(n,n) + min(abs([d + sqrt(d^2 + A(n,n-1)^2),d - sqrt(d^2 + A(n,n-1)^2)]));
[Q,R] = qr(A - u * eye(n));
A = R*Q + u * eye(n);
a = diag(A);
m = 1;
while (max(abs(a-a0)) > tol) && (m <= maxit)
    a0 = a;
    d = (A(n-1,n-1) - A(n,n)) / 2;
    u = A(n,n) + min(abs([d + sqrt(d^2 + A(n,n-1)^2),d - sqrt(d^2 + A(n,n-1)^2)]));
    [Q,R] = qr(A - u * eye(n));
    A = R*Q + u * eye(n);
    a = diag(A);
    m = m + 1;
end
if (m >= maxit)
    disp(['迭代步数大于',num2str(maxit),'收敛太慢了!']);
else
    disp(['隐式对称QR方法迭代',num2str(m),'步收敛']);
    n = size(a,1);
    x = zeros(n);
    for i = 1:n
        x0 = ones(n,1);
        [b,x0] = vpmethod(A0-a(i,1)*eye(n),x0,maxit,tol);
        x(:,i) = x0;
    end

这里是要用到已经学过的ltir、utri、 vpmethod函数,直接复制上面就好
jacobi方法最古老的方法
输入:
矩阵A、maxit(2000)、tol(1.0e-7)
输出:
模的最大特征量a、模的最大特征量对应的特征向量x

function [a,V] = jacobi_eig(A,maxit,tol)
%a的元素为A的特征值,V的第j列为对应于特征值a(j,1)的特征向量
if nargin == 2
    tol = 1.0e-6;
elseif nargin == 1
    maxit = 1000;
    tol = 1.0e-6;
end
A0 = A;
n = size(A,1);
V = eye(n);
b = A0 - diag(diag(A0));
w = sqrt(sum(sum(b .* b)));
[r,c] = find(abs(b) > w);
k = 1;
while (w > tol) && (k < maxit)
    if (~isempty(r))
        for i = 1:size(r,1)
            if (r(i,1) > c(i,1))
                if (abs(A0(r(i,1),c(i,1))) < tol)
                    u = 0;
                else
                    u = acot((A0(r(i,1),r(i,1)) - A0(c(i,1),c(i,1)))...
                        / (2 * A0(r(i,1),c(i,1)))) / 2;
                end
                V1 = eye(n);
                V1(r(i,1),r(i,1)) = cos(u);
                V1(c(i,1),c(i,1)) = cos(u);
                V1(r(i,1),c(i,1)) = -sin(u);
                V1(c(i,1),r(i,1)) = sin(u);
                A0 = V1' * A0 * V1;
                V = V * V1;
                k = k + 1;
            end
        end
    end
    b = A0 - diag(diag(A0));
    w = w / n;
    [r,c] = find(abs(b) > w);
end
if (k <= maxit)
    disp(['Jacobi方法迭代',num2str(k),'步收敛!']);
else
    disp(['迭代步数大于',num2str(maxit),'收敛太慢了!']);
end
a = diag(A0);

二分法由两部分模块组成
输入:
矩阵A、maxit(2000)、tol(1.0e-7)
输出:
所有特征值、所有特征值所对应的特征向量

第一部分

function n = switch_num(T,u)
x = diag(T);
y = [0;diag(T,1)];
m = size(T,1);
q = x(1,1) - u;
n = 0;
for k = 1:m
    if (q < 0)
        n = n + 1;
    end
    if (k < m)
        if (q == 0)
            q = abs(y(k+1,1)) *  (1.0e-3); 
        end
        q = x(k+1,1) - u - y(k+1,1)^2 / q;
    end
end

第二部分
输入:
A为非零矩阵,b0,b1为所求特征值所在的区间端点、tol(1.0e-7)
输出:所有特征值、所有特征值所对应的特征向量

function [a,x] = dichotomy_eig(A,b0,b1,tol)
%A为非零矩阵,b0,b1为所求特征值所在的区间端点,返回值a为区间内的所有特征值所构成的向量
A = hess(A);
mx = max(sum(abs(A)));
if nargin == 3
    tol = 1.0e-6;
elseif nargin == 2
    b1 = mx;
    tol = 1.0e-6;
elseif nargin ==1
    b0 = -mx;
    b1 = mx;
    tol = 1.0e-6;
end
n = switch_num(A,b1) - switch_num(A,b0);
n1 = switch_num(A,b0) - switch_num(A,-mx);
a = ones(n,1)*b0;
for i = 1:n
    b0 = a(i,1);
    b1 = mx;
    while (abs(b1 - b0) > tol)
        a(i,1) = (b0 + b1) / 2;
        s = switch_num(A,a(i,1));
        if (s >= i+n1)
            b1 = a(i,1);
        else
            b0 = a(i,1);
        end
    end
end
m = size(A,1);
x = zeros(m,n);
maxit = 1000;
for i = 1:n
    x0 = ones(m,1);
    [b,x0] = vpmethod(A-a(i,1)*eye(m),x0,maxit,tol);
    x(:,i) = x0;
end

这里还是会用到已经学过的utri 、ltri 、vpmethod函数,直接复制在上面就好

参考文献
MATLAB从入门到实践--谢汉龙著

相关文章
|
6月前
|
算法 数据安全/隐私保护 计算机视觉
基于二维CS-SCHT变换和LABS方法的水印嵌入和提取算法matlab仿真
该内容包括一个算法的运行展示和详细步骤,使用了MATLAB2022a。算法涉及水印嵌入和提取,利用LAB色彩空间可能用于隐藏水印。水印通过二维CS-SCHT变换、低频系数处理和特定解码策略来提取。代码段展示了水印置乱、图像处理(如噪声、旋转、剪切等攻击)以及水印的逆置乱和提取过程。最后,计算并保存了比特率,用于评估水印的稳健性。
|
9天前
|
运维 算法
基于Lipschitz李式指数的随机信号特征识别和故障检测matlab仿真
本程序基于Lipschitz李式指数进行随机信号特征识别和故障检测。使用MATLAB2013B版本运行,核心功能包括计算Lipschitz指数、绘制指数曲线、检测故障信号并标记异常区域。Lipschitz指数能够反映信号的局部动态行为,适用于机械振动分析等领域的故障诊断。
|
1月前
|
Serverless
MATLAB中的矩阵与向量运算
【10月更文挑战第2天】本文全面介绍了MATLAB中的矩阵与向量运算,包括基本操作、加减乘除、转置、逆矩阵、行列式及各种矩阵分解方法。通过丰富的代码示例,展示了如何利用矩阵运算解决线性方程组、最小二乘法拟合、动态系统模拟和电路分析等问题。掌握这些运算不仅提升编程效率,还能在工程计算和科学研究中发挥重要作用。
50 1
|
2月前
|
机器学习/深度学习 算法
基于心电信号时空特征的QRS波检测算法matlab仿真
本课题旨在通过提取ECG信号的时空特征并应用QRS波检测算法识别心电信号中的峰值。使用MATLAB 2022a版本实现系统仿真,涵盖信号预处理、特征提取、特征选择、阈值设定及QRS波检测等关键步骤,以提高心脏疾病诊断准确性。预处理阶段采用滤波技术去除噪声,检测算法则结合了一阶导数和二阶导数计算确定QRS波峰值。
|
3月前
|
存储 算法 Serverless
【matlab】matlab基于DTW和HMM方法数字语音识别系统(源码+音频文件+GUI界面)【独一无二】
【matlab】matlab基于DTW和HMM方法数字语音识别系统(源码+音频文件+GUI界面)【独一无二】
|
3月前
|
计算机视觉
【图像处理】基于灰度矩的亚像素边缘检测方法理论及MATLAB实现
基于灰度矩的亚像素边缘检测方法,包括理论基础和MATLAB实现,通过计算图像的灰度矩来精确定位边缘位置,并提供了详细的MATLAB代码和实验结果图。
96 6
|
3月前
|
算法 数据安全/隐私保护
基于星座图整形方法的QAM调制解调系统MATLAB误码率仿真,对比16,32,64,256四种QAM调制方式
本MATLAB 2022a仿真展示了不同QAM阶数下的星座图及误码率性能,通过星座图整形技术优化了系统性能。该技术利用非均匀分布的星座点提高功率效率,并通过合理布局增强抗干扰能力。随着QAM阶数增加,数据传输速率提升,但对信道质量要求也更高。核心程序实现了从比特生成到QAM映射、功率归一化、加噪及解调的全过程,并评估了系统误码率。
62 0
|
5月前
|
机器学习/深度学习 算法
基于鲸鱼优化的knn分类特征选择算法matlab仿真
**基于WOA的KNN特征选择算法摘要** 该研究提出了一种融合鲸鱼优化算法(WOA)与K近邻(KNN)分类器的特征选择方法,旨在提升KNN的分类精度。在MATLAB2022a中实现,WOA负责优化特征子集,通过模拟鲸鱼捕食行为的螺旋式和包围策略搜索最佳特征。KNN则用于评估特征子集的性能。算法流程包括WOA参数初始化、特征二进制编码、适应度函数定义(以分类准确率为基准)、WOA迭代搜索及最优解输出。该方法有效地结合了启发式搜索与机器学习,优化特征选择,提高分类性能。
|
4月前
|
算法 vr&ar
基于自适应波束成形算法的matlab性能仿真,对比SG和RLS两种方法
```markdown - MATLAB2022a中比较SG与RLS自适应波束成形算法。核心程序实现阵列信号处理,强化期望信号,抑制干扰。RLS以其高效计算权重,而SG则以简单和低计算复杂度著称。[12345] [6666666666] [777777] ```
|
5月前
|
机器学习/深度学习 存储 移动开发
MATLAB数据类型和运算符+矩阵创建
MATLAB数据类型和运算符+矩阵创建
63 1