我的模拟中有数周的数字问题,我最终将其缩小为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))
答案 0 :(得分:3)
由于形成K
和K1
的算术运算不同,因此它们的条目在浮点运算中不一定相同:
>> 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');
此附加代码生成下图: