MATLAB - Eig特征向量算法

时间:2016-03-15 16:49:18

标签: matlab

我的模拟中有数周的数字问题,我最终将其缩小为MATLAB中的Eig函数问题。这里没有涉及太多细节的是一个小脚本,它设置了两个矩阵K1和K,如果你打印它们是完全相同的。但由于某种原因,Eig函数没有为K返回正确的特征向量,我不明白为什么。在这个矩阵中,我使用相邻点之间的网格距离作为长度为1的均匀网格上的dx = x(i + 1)-x(i),但这是与K1中设置的网格之间的唯一差异,其中我只是使用dx = 1 / N.任何人都可以看到地球上发生了什么?问题似乎只发生在足够大的N,即小网格距离上。我不知道为什么,但我对此感到非常沮丧,因为它对我的硕士论文至关重要。

    clear all
    clc
    N=1000;
    dx=1/N; %grid distance is 1/N
    x=dx*(1:N); %make grid
    A=zeros(N,N); 
    for i=1:N-1
    A(i,i+1)=1;
    end
    K1=-1/dx^2*(A+A'-2*eye(N));

    for i=2:N-1
    K(i,i)=-2/(x(i+1)-x(i-1))*(1/(x(i+1)-x(i))+1/(x(i)-x(i-1)));
    K(i,i-1)=2/(x(i+1)-x(i-1))*(1/(x(i)-x(i-1)));
    K(i,i+1)=2/(x(i+1)-x(i-1))*(1/(x(i+1)-x(i)));
    end
    K(N,N-1)=K(N-1,N-2);
    K(1,1)=K(2,2);
    K(1,2)=K(2,3);
    K(2,1)=K(2,3);
    K(N,N)=K(N-1,N-1);
    K=-K;
    [h,y]=eig(K); %eigenvectors (h) and eigenvalues (y) of first K
    [z,v]=eig(K1);   %eigenvectors (z) and eigenvalues of (v) of K1
    plot(x,z(:,1)) %plot first eigenvector of K1
    plot(x,h(:,1))

1 个答案:

答案 0 :(得分:3)

由于形成KK1的算术运算不同,因此它们的条目在浮点运算中不一定相同:

>> norm(K-K1,2)
ans =
   3.8687e-07

因此,特征值不会完全匹配,也不会保证保证以相同的顺序,这意味着特征向量位于不同的列中:

>> t = [diag(y),diag(v)];
>> t(1:5,:)
ans =
   1.0e+06 *

    3.9190    0.0000
    3.9207    0.0000
    3.9225    0.0001
    3.9242    0.0002
    3.9259    0.0002

然而,当给定相似的排序时,所有特征值具有大致相同的值:

>> norm([sort(diag(y))-sort(diag(v))],2)
ans =
   3.4607e-07

>> norm([sort(diag(y))-sort(diag(v))],2)/norm(diag(y),2)
ans =
   4.4685e-15

两个矩阵的特征值和特征向量,使用相对机器精度的度量,是相同的。然而,用于创建K1的算术运算创建了一个(近)完美的对称矩阵,从而导致eig使用的算法得到平滑的特征值,可能是一些Hessenberg变换,因为您需要特征向量同样。但是,由于计算方法的原因,K与工作精度不对称,如果我正确地读取您的意图,则不会出现非均匀网格。

如果需要对特征值进行排序,则必须自己对它们进行排序,因为一般矩阵会产生随机的特征值:

%    Pull diagonals
v = diag(v);
y = diag(y);

%   Sort the non-symmetric eigenvalues in ascending order
[y,orderedIndex] = sort(y);
h = h(:,orderedIndex);

%   Perform a sign correction such that all eigenvectors have the same sense.
%   This is not needed computationally but doing it for easy comparison.
h = abs(h).*sign(z);

%   Plot
subplot(2,1,1);
    plot(1:N,v,1:N,y,'--');
    legend('K1','K','Location','SouthWest');
subplot(2,1,2);
    g = plot(x(:),z(:,1),x(:),h(:,1),'--');
    legend('K1','K','Location','SouthWest');

此附加代码生成下图:

Eigenvalue and First Eigenvalue comparison plot