通过特征值/特征向量计算SVD的精度

Precision in SVD calculation through eigenvalues/eigenvectors

提问人:ATu 提问时间:10/31/2023 最后编辑:ATu 更新时间:10/31/2023 访问量:36

问:

在倍频程中,我使用特征分解来计算 svd 而不是 svd 函数 istelfand 比较结果。

使用退出的 SVD 函数时出现错误

[U2,S2,V2] = svd(A2);
errU2U2t = max(max((U2*U2')-eye(size(U2,1)))) = 3.1086e-15 
errU2tU2 = max(max((U2'*U2)-eye(size(U2,1)))) = 1.3767e-14
errU2V2t = max(max((V2*V2')-eye(size(V2,1)))) = 2.6645e-15
errV2tV2 = max(max((V2'*V2)-eye(size(V2,1)))) = 1.4433e-14
errA2= max(max(A2-U2*S2*V2'))                 = 9.7056e-13

对于替代方法(速度快两倍),我使用了特征分解

A2tA2 = A2'*A2;
[V22,SV22,W22] = eig(A2tA2);
%U22 = A2*V22/(sqrt(SV22)); % optional, increase calculation time
U22sig = A2(1,:)*V22/(sqrt(SV22));
for spin=1:size(U22,2) % sign correct
  if sign(W22(1,spin))!=sign(U22sig(1,spin))
    W22(:,spin) = - W22(:,spin);
  end
end

错误是

errU22U22t = max(max(U22*U22t-eye(size(U22,1)))) = 1.9185e-10
errU22tU22 = max(max(U22t*U22-eye(size(U22,1)))) = 5.6592e-09
errW22W22t = max(max(W22*W22t-eye(size(W22,1)))) = 2.8866e-15
errW22tW22 = max(max(W22t*W22-eye(size(W22,1)))) = 1.1324e-14
errV22V22t = max(max(V22*V22t-eye(size(V22,1)))) = 2.8866e-15
errV22tV22 = max(max(V22t*V22-eye(size(V22,1)))) = 1.1324e-14
errA22u    = max(max(A2-U22*sqrt(SV22)*V22'))    = 1.4655e-13
errA22w    = max(max(A2-W22*sqrt(SV22)*V22'))    = 2.1129e-08

看起来像这样

如果我使用 U22,它的准确性很差(在转置多重错误上),但重建的 A22u 很好

如果我使用 W22,它的准确性很好(在转置多点错误上),但重建的 A22w 很糟糕

有人知道如何在不损失 A22u 精度的情况下改进 U22 的计算吗? 或者这个错误从何而来?

倍频程 浮点精度 特征值 SVD 特征向量

评论


答: 暂无答案