MATLAB中的幂法

给予datuashvili

我想在MATLAB中实现用于确定矩阵的主导特征值和特征向量幂方法

到目前为止,这是我写的内容:

%function to implement power method to compute dominant
%eigenvalue/eigenevctor
function [m,y_final]=power_method(A,x);
m=0;
n=length(x);
y_final=zeros(n,1);
y_final=x;
tol=1e-3;
while(1)
    mold=m;
 y_final=A*y_final;
 m=max(y_final);
 y_final=y_final/m;
 if (m-mold)<tol
     break;
 end
end
end

使用上面的代码,这是一个数字示例:

 A=[1 1 -2;-1 2 1; 0 1 -1]

A =

     1     1    -2
    -1     2     1
     0     1    -1

>> x=[1 1 1];
>> x=x';
>> [m,y_final]=power_method(A,x);
>> A*x

ans =

     0
     2
     0

与MATLAB中上述矩阵的特征值和特征向量进行比较时,我做到了:

[V,D]=eig(A)

V =

    0.3015   -0.8018    0.7071
    0.9045   -0.5345    0.0000
    0.3015   -0.2673    0.7071


D =

    2.0000         0         0
         0    1.0000         0
         0         0   -1.0000

特征值重合,但特征向量应接近[1/3 1 1/3]在这里,我得到:

 y_final

y_final =

    0.5000
    1.0000
    0.5000

看到这种错误是可以接受的,还是我犯了一些错误?

雷瑞恩

你有正确的执行,但你不检查收敛的特征向量和特征值。您只需检查特征值是否收敛。功率方法估计两个突出的特征向量和特征值,所以它可能是一个好主意,检查,看看是否收敛。当我这样做时,我设法得到了[1/3 1 1/3]这是我修改您的代码以实现此目的的方式:

function [m,y_final]=power_method(A,x)
m=0;
n=length(x);
y_final=x;
tol=1e-10; %// Change - make tolerance more small to ensure convergence
while(1)
     mold = m;
     y_old=y_final; %// Change - Save old eigenvector
     y_final=A*y_final;
     m=max(y_final);
     y_final=y_final/m;
     if abs(m-mold) < tol && norm(y_final-y_old,2) < tol %// Change - Check for both
         break;
     end
end
end

当使用您的示例输入运行上述代码时,我得到:

>> [m,y_final]=power_method(A,x)

m =

     2


y_final =

    0.3333
    1.0000
    0.3333

关于方面eig,MATLAB最有可能使用另一个范数来缩放特征向量。请记住,特征向量不是唯一的,并且在按比例缩放时都是准确的。如果您想确定的话,只需取V与优势特征向量重合的的第一列,然后除以最大值,这样我们就可以将一个分量用值1进行归一化,就像幂方法:

>> [V,D] = eig(A);
>> V(:,1) / max(abs(V(:,1)))

ans =

    0.3333
    1.0000
    0.3333

这与您所观察到的一致。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

在Matlab中存储矩阵的多种幂

来自分类Dev

Matlab中的牛顿法

来自分类Dev

Java数学幂法

来自分类Dev

在Matlab中创建将矩阵提升为幂的数组

来自分类Dev

在MATLAB中采用矩阵的分数幂的好方法是什么?

来自分类Dev

Matlab中函数的符号表示法

来自分类Dev

模幂(模算术中的幂)

来自分类Dev

在matlab中计算给定矩阵的负幂

来自分类Dev

什么是科学计数法的小“ e” / Matlab中的Double

来自分类Dev

Matlab中的二分法

来自分类Dev

在matlab中实现前向欧拉法

来自分类Dev

为什么用5的幂以科学计数法打印10的幂?

来自分类Dev

在Forth中实现求幂

来自分类Dev

计算输入中数字的幂

来自分类Dev

Ansible Playbook中的幂等性

来自分类Dev

并发环境中的幂等PUT

来自分类Dev

Python中的矩阵求幂

来自分类Dev

计算输入中数字的幂

来自分类Dev

为什么R中的幂运算(例如10 ^ 6)要比计算器表示法(例如1e6)花费4倍的时间?

来自分类Dev

Matlab点表示法

来自分类Dev

当除数提高到幂时,matlab错误的模结果

来自分类Dev

如何在Matlab中将向量提升为幂?

来自分类Dev

MatLab乳胶标题不适用于幂(^)

来自分类Dev

JavaScript中2的快速最近幂?

来自分类Dev

HTTP方法PURGE是否在Varnish中是幂等的?

来自分类Dev

C#中的幂等修饰符

来自分类Dev

Swift中的幂运算符

来自分类Dev

在gnuplot中对2的幂进行迭代

来自分类Dev

Python 3中的模幂运算实现