(matlab)移动曲面拟合详细实现

作业二

目的

掌握 移动曲面法 数字高程模型内插原理及其内插子程序的设计方法,了解其它逐点高程内插方法的基本原理。

内容及原理

原理:利用已知的点数据,利用最小二乘的原理,拟合出一个可以很好的符合这些已知数据的曲面,先假设这个曲面的表达式形式(可以是一次、二次、三次等)未知其中的一些系数,通过已知点,进行间接平差求得曲面表达式。
一次表达式:
数据:

点号XYZ
110211015
210911318
310511519
410310317
510810521
610510815
711510420
811810815
911611317
1011311822

求待定点X=110,Y=110点的高程。
例如二次曲面的表达式为
Z i ^ = A X ˉ i 2 + B X ˉ Y ˉ i + C Y ˉ i 2 + D X ˉ i + E Y ˉ i + F \hat{Z_{i}}=A\bar{X}_{i}^{2} +B\bar{X} \bar{Y}_{i} +C\bar{Y}_{i}^{2} +D\bar{X}_{i} +E\bar{Y}_{i} +F Zi^=AXˉi2+BXˉYˉi+CYˉi2+DXˉi+EYˉi+F
A 、 B 、 C 、 D 、 E 、 F A、B、C、D、E、F ABCDEF为待定系数,那么此处为未知数,虽然称其为系数,但是在间接平差中真正的系数应该是已知数,所以将系数写在前面为:
Z i ^ = X ˉ i 2 A + X ˉ Y ˉ i B + Y ˉ i 2 C + X ˉ i D + Y ˉ i E + F \hat{Z_{i}}=\bar{X}_{i}^{2} A+\bar{X} \bar{Y}_{i} B+\bar{Y}_{i}^{2} C+\bar{X}_{i} D+\bar{Y}_{i} E+F Zi^=Xˉi2A+XˉYˉiB+Yˉi2C+XˉiD+YˉiE+F
误差方程 是这样子:
V i = Z i ^ − Z i V = M X − Z ; X = [ A B C D E F ] V_{i}=\hat{Z_{i}}-Z_{i}\\V=MX-Z;\\ X= \begin{bmatrix} A\\B\\C\\D\\E\\F \end{bmatrix} Vi=Zi^ZiV=MXZ;X=ABCDEF
注意区别 Z Z Z Z i Z_{i} Zi,前者是余下的常数,后者是真的高程,但在此公式中因为不存在其他常数项所以两者相等。之后就是套公式求得 ( A ^ 、 B ^ 、 C ^ 、 D ^ 、 E ^ 、 F ^ ) = a r g m i n V T V X = ( M T P M ) − 1 M T P Z (\hat{A}、\hat{B}、\hat{C}、\hat{D}、\hat{E}、\hat{F})=argmin\quad V^TV\\X=(M^TPM)^{-1}M^TPZ (A^B^C^D^E^F^)=argminVTVX=(MTPM)1MTPZ

步骤及结果

  • 读入数据以待定点为圆心转换坐标
   obj=[110,110];
  know=[102 110 15;
  109 113 18;
  105 115 19;
  103 103 17;
  108 105 21;
  105 108 15;
  115 104 20;
  118 108 15;
  116 113 17;
  113 118 22];
  know(:,1:2)=know(:,1:2)-obj;
  • 计算所有点与待定点的距离,计算权阵(本例中采用反距离权,即距离越远对估计点的高程影响越小)
  dis=disCalculate(know,obj);
  P=diag(1./(dis.^2));

disCalculate()为距离计算函数自定义的

function [dis] = disCalculate(know,obj)
  n=size(know,1);
  dis=zeros(n,1);
  for i=1:n
  dis(i)=sqrt((know(i,1)-obj(1))^2+(know(i,2)-obj(2))^2);
  end
 end

  • 计算M、Z矩阵
[M,Z]=Mcalculator(know);

Mcalculator(此处定义了三种曲面,就有三种计算稀疏的方式可以算出来之后求 R M S E RMSE RMSE,确定哪个最好)
一次:

function [M,Z] = Mcalculator1(know)
n=size(know,1);
M=zeros(n,3);
for i=1:n
    M(i,1)=know(i,1);
    M(i,2)=know(i,2);
    M(i,3)=1;
end
Z=know(:,3);
end

二次:

function [M,Z] = Mcalculator2(know)
n=size(know,1);
M=zeros(n,6);
for i=1:n
    M(i,1)=know(i,1)^2;
    M(i,2)=know(i,2)*know(i,1);
    M(i,3)=know(i,2)^2;
    M(i,4)=know(i,1);
    M(i,5)=know(i,2);
    M(i,6)=1;
end
Z=know(:,3);
end

三次:

function [M,Z] = Mcalculator3(know)
%三次ax^3+bx^2y+cxy^2+dy^3+ex^2+fxy+gy^2+hx+iy+j

n=size(know,1);
M=zeros(n,10);
for i=1:n
    M(i,1)=know(i,1)^3;
    M(i,2)=know(i,1)^2*know(i,2);
    M(i,3)=know(i,2)^2*know(i,1);
    M(i,4)=know(i,2)^3;
    M(i,5)=know(i,1)^2;
    M(i,7)=know(i,2)^2;
    M(i,6)=know(i,2)*know(i,1);
    M(i,8)=know(i,2);
    M(i,9)=know(i,1);
    M(i,10)=1;
end
Z=know(:,3);
end
  • 计算待定系数,确定待定点的高程
    由于待定点的X、Y都为零,那么带入表达式所以高程就是待定系数F。
X=(M'*P*M)\(M'*P*Z);
Z_obj=X(6);
  • 误差分析:即用估计出的曲面在每个已知点得到的 Z ^ \hat{Z} Z^与真实 Z Z Z差的平方和的开根号。
    以二次曲面为例,matlab代码为
%% 误差估计
f=@(x,y) X(1)*x.^2+X(2).*x.*y+X(3)*y.^2+X(4).*x+X(5).*y+X(6);
rmse=0;
for i=1:10
    rmse=rmse+(f(know(i,1),know(i,2))-know(i,3))^2;
end
rmse=sqrt(rmse);
disp(rmse)

下表是用分别用一次、二次、三次曲面的插值结果和均方根误差

方法目标点高程值均方根误差
一次曲面17.97487.3719
二次曲面17.97562.6241
三次曲面22.148222.1482

可以看到一次面与三次曲面拟合精度不如二次曲面,由此可知在此例中待拟合区域地形起伏不大,但也不是没有起伏,所以使用二次曲面。
以下是曲面插值结果
在这里插入图片描述

👊👊👊👊👊👊👊👊👊👊👊👊👊👊👊👊👊👊👊👊👊👊👊👊👊👊👊👊👊👊

  • 14
    点赞
  • 79
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值