matlab 病态方程——奇异值截断法(杨文采研究员和王振杰博士论文)
前言
对于Hilbert矩阵,当n>10时,最小二乘法解与真实值[1,1,1,1,~,1]差别很大,原因在于Hilbert矩阵存在病态性,其法方程奇异值数量级相差较大。
在数值分析课上,老师希望我们采用不同的方法使得解的差值在1e-4之内。联想到测绘中平差里面对于病态方程求解做过大量的研究,所以尝试采用SVD对此问题求解,但是在复现王振杰博士论文时出现数值不符的问题,本次国庆尝试以失败而告终。在此记录自己的相关代码和问题,以及后续。
文章引用图片出自:王振杰. 大地测量中不适定问题的正则化解法研究[D].中国科学院研究生院(测量与地球物理研究所),2003.
一、Hilbert矩阵matlab代码
代码如下(示例):
n=input('请输入矩阵行数:')
m=input('请输入矩阵列数:')
for i=1:n
for j=1:m
a(i,j)=1/(i+j-1);
x(j,1)=1;
end
end
l=a*x
二、SVD截断奇异值解法
%matlab里面奇异值分解代码
[u,s,v]=svd(a)
得到的奇异值降序排列,将较小的奇异值直接赋予0。这样做虽然保留了解中可靠的部分,但是牺牲掉了解的无偏性。
三、杨文采研究员解法
根据奇异值的分布特性,病态问题分成两类,均匀下降型和阶梯型。3.1 王振杰博士实验
取n=11,m=9,真值与计算值的差距为3*10e-12,证实该方法的适用性。
3.2 实验
复现实验时,发现结果与王振杰博士差距很大,可能我对杨文采研究员提出的方法有误解,需要请教老师