您的位置:首页 > 编程语言 > MATLAB

Arnoldi方法求特征值:matlab中eigs函数的一个使用示例

2017-07-27 22:11 736 查看
最基本的特征值问题分为三类:

1、标准的线性特征值问题:

Ax=λx,A∈Cn∗n

2、普遍的线性特征值问题:

Ax=λBx,A、B∈Cn∗n

3、普遍的艾米特正定线性特征值问题:

Ax=λBx,A、B∈Cn∗n

A∗=A,B∗=B>0∈Cn∗n

Arnoldi方法求特征值是特别常用的一个方法,matlab的内置函数eigs就是用了这个方法,一起来看看。

% demo routine for the usage of MATLAB eigs function.
%   Example: Compute eigenvalues of a matrix A close to sigma,
%   using shift and invert spectral transformation.

rng(0);%设置随机种子

A = RandomWalkProb(15);%产生随机矩阵
n = length(A);%矩阵长度

sigma = 0.01; %最终是为了找出离sigma最近的特征值
[L, U, P] = lu(A - sigma * eye(n));%LU分解, L*U = P*A,此因A不一定能LU分解
Afun = @(x) U \ (L \ (P*x));%Afun其实就是1/(A-sigmaI)

opts.isreal = true;%1 if A or A-sigma*B represented by Afun is real, 0 otherwise.
opts.issym = false;%1 if A or A-sigma*B represented by Afun is symmetric, 0 otherwise.
opts.disp = 2;%Diagnostic information display level.
num = 3;
[V, E] = eigs(Afun, n, num, sigma, opts);%调用了eigs函数,对求距离sigma最近的num个矩阵
%结果最后V是特征向量组成的矩阵,E的对角线是特征值
% END


其中的RandomWalkProb.m:

function A = RandomWalkProb(k)
% Function A = RandomWalkProb(k) generate a stochastic matrix A
%   of size n = (k+1)*(k+2)/2.
%
%   References:
%     Y. Saad, Numerical Methods for Large Eigenvalue Problems, Revised ed.
%       SIAM, Philadelphia, 2011. pp 36--37.
%
II = []; JJ = []; VV = [];
idx = @(i,j) i*(2*k-i+3)/2+j+1;
for i = 0:k
for j = 0:k-i
% (i,j) --> (i-1, j)
if i>0
II = [II, idx(i,j)];
JJ = [JJ, idx(i-1,j)];
VV = [VV, (i+j)/2/k * (1+(j==0))];
end
% (i,j) --> (i, j-1)
if j>0
II = [II, idx(i,j)];
JJ = [JJ, idx(i,j-1)];
VV = [VV, (i+j)/2/k * (1+(i==0))];
end
% (i,j) --> (i+1, j)
if j+i<k
II = [II, idx(i,j)];
JJ = [JJ, idx(i+1,j)];
VV = [VV, 0.5 - (i+j)/2/k];
end
% (i,j) --> (i, j+1)
if j+i<k
II = [II, idx(i,j)];
JJ = [JJ, idx(i,j+1)];
VV = [VV, 0.5 - (i+j)/2/k];
end
end
end

A = sparse(II,JJ,VV);
return;
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: