我注意到MATLAB中Vandermonde矩阵的SVD并不总能产生正确的结果。我尝试过以下示例:
C=fliplr(vander(linspace(7,8,20)));
[U,Sigma,V]=svd(C);
Cnew=U*Sigma*V';
E=abs(Cnew-C)./abs(C);
第二列中的平均相对误差为7%,但有些元素的误差为100-200%。所有其他列似乎都有更低的错误,这似乎也不自然。
我有Matlab 6.5版,我不知道以后的版本是否更准确。有没有办法用Matlab计算这个SVD更准确,还是我必须求助于外部数值库? (我在考虑LAPACK,但我不确定Matlab是否也使用LAPACK算法。)
非常感谢!
PS:通过在互联网上进行研究,我发现Vandermonde矩阵特别棘手(例如http://math.mit.edu/~plamen/files/chebvand.pdf和http://www-math.mit.edu/~plamen/talks/mit02.pdf)。 PS2:我面临的实际问题是找到C=[A,-B]
的SVD,其中
A=VAN(1:N,1:Q);
B=diag(data)*VAN(1:N,1:Q+1);
其中VAN=fliplr(vander(linspace(7,8,N)));
和data
是在linspace(7,8,N)
点测量或计算的N个值的数组。 Q
应小于N
。
然而,由于我甚至无法正确找到VAN
的SVD,我认为这将是一个很好的起点。