① MATLAB实现用幂法/反幂法求矩阵的最大/最小特征值问题(有追加!)。
%A为矩阵;ep为精度要求;N为最大迭代次数;m为绝对值最大的特征值;u为对应最大特征值的特征向量。
A=[2,-1,0;-1,2,-1;0,-1,2];
N=100;
ep=1e-6;
n=length(A);
u=ones(n,1);
index=0;
k=0;
m1=0;
while k<=N
v=A*u;
m=max(abs(v));
u=v/m
if abs(m-m1)<ep
index=1;
break;
end
m1=m;
k=k+1;
end
m %特征值
u/norm(u) %特征向量
[vv,ll]=eig(A); %matlab求解的特征值和特征向量
[mm,ii]=max(abs(diag(ll)));
m_matlab=mm
v_matlab=vv(:,ii)
这个是你的幂法,你的方法基本没有问题。
② 各位朋友,怎么利用MATLAB用幂法求最小特征值以及它的特征向量。
function [lam,u1]=MinMulEig(A,v0,error)
%A为矩阵,v0为初始向量
%lam为最小特征值,u为对应的特征向量(列向量),error为控制精度
%求按模最小特征值
[~,i]=max(abs(v0));
lam0=v0(i);
u0=v0/lam0;
control=0;
while (control==0)
v1=A\u0;
[~,i]=max(abs(v1));
lam1=v1(i);
u1=v1/lam1;
if abs(1/lam1-1/lam0)<error
control=1;
end
u0=u1;v0=v1;lam0=lam1;
end
lam=1/lam1;
以上为函数文件,在命令窗口输入:
>> A=[-12 3 3;3 1 -2;3 -2 7];
>> v0=[1,1,1]';
>> [l,u]=MinMulEig(A,v0)
③ matlab 中用幂法求主特征值和特征向量
pmethod.m
function
[l,v,s]=pmethod(A,x0,eps)
if
nargin==2
eps
=
1.0e-6;
end
v
=
x0;
%v为主特征向量
M
=
5000;
%迭代步数限制
m
=
0;
l
=
0;
for(k=1:M)
y
=
A*v;
m
=
max(y);
%m为按模最大的分量
v
=
y/m;
if(abs(m
-
l)<eps)
l
=
m;
%到所需精度,退出,l为主特征值
s
=
k;
%s为迭代步数
return;
else
if(k==M)
disp('迭代步数太多,收敛速度太慢!');
l
=
m;
s
=
M;
else
l
=
m;
end
end
end
④ 如何用matlab求矩阵最大特征值的特征向量
用函数[V,D]=eig(A)
矩阵D的对角元存储的是A的所有特征值,
而且是从小到大排列的
矩阵V的每一列存储的是相应的特征向量
所以应该是V的最后一个列
就是最大特征值的特征向量
⑤ 用matlab求解矩阵的最大特征值及对应的正规化特征向量并做一致性检验。
给你提供一种很专业的数值算法“幂法”,这是专门用来算矩阵最大特征值的经典算法。“幂法“的算法过程其实很简单,就是拿一个向量,不停地用A乘,最后就会慢慢趋近于最大特征值对应的特征向量。“幂法”在矩阵拥有唯一最大特征值的前提下,迭代足够多次,就一定能收敛的,可以用线性代数的矩阵相似性原理证明。
我这段代码迭代了100次,取了随便一个向量[1 0 0 0 0 0]'作为初始值(一般是取个随机向量,其实没啥大差别)。
A=[1 1 1/4 3 3 3 ;1 1 1/4 3 3 3 ;4 4 1 5 5 5;1/3 1/3 1/5 1 2 2; 1/3 1/3 1/5 1/2 1 3;1/3 1/3 1/5 1/2 1/3 1];
v=[1 0 0 0 0 0]';
for i = 1:100
v=A*v;
v=v/sqrt(sum(v.^2));
end
lamda=sqrt(sum((A*v).^2))/sqrt(sum(v.^2))
v
结果:
lamda =
6.3526
v =
0.3242
0.3242
0.8571
0.1612
0.1414
0.0963
你会发现,和内置算法的eigs命令求出的结果是一样的。
>>eigs(A)
ans =
6.3526
0.0737 - 1.4350i
0.0737 + 1.4350i
-0.2500 - 0.4319i
-0.2500 + 0.4319i
-0.0000
最大特征值同样是6.3526。
⑥ 数模作业 计算矩阵的最大特征值和对应的归一化特征向量 急急急~ 用matlab算 要编程过程要答案
先给你说个土的,就是Matlab的内置算法,可以算所有特征值和特征向量(没什么技术含量的,也没有什么思想,只是工程学上的纯应用罢了)。
A=[1 2 1/4 4 1/2;1/2 1 1/5 3 1/3;4 5 1 7 3;1/4 1/3 1/7 1 1/5; 2 3 1/3 5 1];
[V,D]=eigs(A)
结果:
V =
0.2532 -0.1274 - 0.1409i -0.1274 + 0.1409i -0.0586 + 0.3893i -0.0586 - 0.3893i
0.1608 -0.1373 + 0.0246i -0.1373 - 0.0246i 0.2097 - 0.1984i 0.2097 + 0.1984i
0.8616 0.9116 0.9116 0.7441 0.7441
0.0774 0.0024 + 0.0881i 0.0024 - 0.0881i -0.0832 + 0.0314i -0.0832 - 0.0314i
0.4020 0.0918 - 0.3118i 0.0918 + 0.3118i -0.3444 - 0.2854i -0.3444 + 0.2854i
D =
5.1374 0 0 0 0
0 0.0088 - 0.8328i 0 0 0
0 0 0.0088 + 0.8328i 0 0
0 0 0 -0.0775 - 0.0956i 0
0 0 0 0 -0.0775 + 0.0956i
所以最大特征值是5.1374,对应特征向量为[0.2532 0.1608 0.8616 0.0774 0.4020]‘。
再给你提供一种很专业的数值算法“幂法”,这是专门用来算矩阵最大特征值的经典算法。我大学里《数值分析》课程教授专门花了半节课讲解过这个算法和它的原理,“幂法”一出手,绝对是专业级的解答!“幂法“的算法过程其实很简单,就是拿一个向量,不停地用A乘,最后就会慢慢趋近于最大特征值对应的特征向量。“幂法”在矩阵拥有唯一最大特征值的前提下,迭代足够多次,就一定能收敛的,可以用线性代数的矩阵相似性原理证明。
我这段代码迭代了100次,取了随便一个向量[1 0 0 0 0]'作为初始值(一般是取个随机向量,其实没啥大差别)。“幂法”在矩阵阶数很高的情况下,比内置算法要快得多(一个5维矩阵是看不出速度上差别的)!
A=[1 2 1/4 4 1/2;1/2 1 1/5 3 1/3;4 5 1 7 3;1/4 1/3 1/7 1 1/5; 2 3 1/3 5 1];
v=[1 0 0 0 0]';
for i = 1:100
v=A*v;
v=v/sqrt(sum(v.^2));
end
lamda=sqrt(sum((A*v).^2))/sqrt(sum(v.^2))
v
结果:
lamda =
5.1374
v =
0.2532
0.1608
0.8616
0.0774
0.4020
最大特征值5.1374,对应特征向量[0.2532 0.1608 0.8616 0.0774 0.4020]‘。
可以看到,迭代了100次后,"幂法"和直接算法得出了完全一样的结果!用“幂法”,显得算法思想非常的清晰,不像用内置的eigs函数,你也不知道Matlab怎么算出来的,是不?