加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

曲面插值和拟合

(2011-02-28 16:03:53)
标签:

it

分类: 数学算法

插值和拟合都是数据优化的一种方法,当实验数据不够多时经常需要用到这种方法来画图。在matlab中都有特定的函数来完成这些功能。这两种方法的确别在于:

当测量值是准确的,没有误差时,一般用插值;

当测量值与真实值有误差时,一般用数据拟合。

插值:

对于一维曲线的插值,一般用到的函数yi=interp1(X,Y,xi,method) ,其中method包括nearst,linear,spline,cubic。

对于二维曲面的插值,一般用到的函数zi=interp2(X,Y,Z,xi,yi,method),其中method也和上面一样,常用的是cubic。

拟合:

对于一维曲线的拟合,一般用到的函数p=polyfit(x,y,n)和yi=polyval(p,xi),这个是最常用的最小二乘法的拟合方法。

对于二维曲面的拟合,有很多方法可以实现,但是我这里自己用的是Spline Toolbox里面的函数功能。具体使用方法可以看后面的例子。

对于一维曲线的插值和拟合相对比较简单,这里就不多说了,对于二维曲面的插值和拟合还是比较有意思的,而且正好胖子有些数据想让我帮忙处理一下,就这个机会好好把二维曲面的插值和拟合总结归纳一下,下面给出实例和讲解。

原始数据

x=[1:1:15];

y=[1:1:5];

z=[0.2 0.24 0.25 0.26 0.25 0.25 0.25 0.26 0.26 0.29 0.25 0.29;

0.27 0.31 0.3 0.3 0.26 0.28 0.29 0.26 0.26 0.26 0.26 0.29;

0.41 0.41 0.37 0.37 0.38 0.35 0.34 0.35 0.35 0.34 0.35 0.35;

0.41 0.42 0.42 0.41 0.4 0.39 0.39 0.38 0.36 0.36 0.36 0.36;

0.3 0.36 0.4 0.43 0.45 0.45 0.51 0.42 0.4 0.37 0.37 0.37];

z是一个5乘12的矩阵。

直接用原始数据画图如下:

surf(x,y,z)

title(’Original data Plot’);

xlabel(’X'), ylabel(’Y'), zlabel(’Z'),

colormap, colorbar;

axis([0 15 0 6 0.15 0.55])

http://www-users.rwth-aachen.de/shunhua.yang/blog/wp-content/origin.jpg

先考虑插值,需要用到的函数interp2

x1=1:0.2:12;

y1=1:0.2:5;

[x2,y2]=meshgrid(x1,y1);

t11=interp2(x,y,z,x2,y2,’cubic’);

surf(x1,y1,t11)

title(’After Fit data Plot’);

xlabel(’X'), ylabel(’Y'), zlabel(’Z'),

colormap, colorbar;

axis([0 15 0 6 0.2 0.55])

http://www-users.rwth-aachen.de/shunhua.yang/blog/wp-content/afterfit.jpg

然后考虑拟合,这个稍微复杂一点:

ky = 3; knotsy = augknt([0:2.5:13],ky);

sp = spap2(knotsy,ky,y,z);

yy = 0:.5:12; vals = fnval(sp,yy);

coefsy = fnbrk(sp,’c');

kx = 5; knotsx = augknt([1:4:5],kx);

sp2 = spap2(knotsx,kx,x,coefsy.’);

coefs = fnbrk(sp2,’c').’;

xv = 1:.25:5; yv = 1:.5:12;

values = spcol(knotsx,kx,xv)*coefs*spcol(knotsy,ky,yv).’;

surf(yv,xv,values)

title(’After Polynal data Plot’);

xlabel(’X'), ylabel(’Y'), zlabel(’Z');

colormap, colorbar;

axis([0 15 0 6 0.2 0.55])

http://www-users.rwth-aachen.de/shunhua.yang/blog/wp-content/afterpolynal1.jpg

图上面的小圆点使用plot3画出来的原始数据点,具体怎么添加的方法我就不多说了。需要把不等边矩阵转换成等边矩阵然后再画图。

效果从上面三个图上面已经看出来了。基本上满足了现在画图的要求,如果测量值比较精确,我们 选择第二种方法插值法来画图,如果觉得测量值不是很精确需要用拟合的方法的话,那当然用第三种方法了。关于Spline Toolbox当然还有更多应用,还有就是里面参数设置为什么要这样设,该怎样设要写下来估计再写一整页都写不完,所以还是大家感兴趣的自己去看帮助文档 好了,里面有详细介绍。

这里只是告诉大家一种可行的办法,而且经过我自己的测试也确实得到了想要达到的结果。Matlab是个很强的数学工具,前一段时间我也提到了它在Texture里面做图的应用。以后会有更多地方用到Matlab,感兴趣的朋友可以和我交流。^_^

附录:

Matlab 样条工具箱(Spline ToolBox)【信息来源教师博客】

Matlab样条工具箱中的函数提供了样条的建立,操作,绘制等功能;

一. 样条函数的建立

第一步是建立一个样条函数,曲线或者曲面。这里的样条函数,根据前缀,分为4类:

cs* 三次样条

pp* 分段多项式样条,系数为t^n的系数

sp* B样条, 系数为基函数B_n^i(t)的系数

rp* 有理B样条

二. 样条操作

样条操作包括:函数操作:求值,算术运算,求导求积分等等

节点操作:主要是节点重数的调节,设定,修改等等

附:样条工具箱函数

1. 三次样条函数

csapi 插值生成三次样条函数

csape 生成给定约束条件下的三次样条函数

csaps 平滑生成三次样条函数

cscvn 生成一条内插参数的三次样条曲线

getcurve 动态生成三次样条曲线

2. 分段多项式样条函数

ppmak 生成分段多项式样条函数

ppual 计算在给定点处的分段多项式样条函数值

3. B样条函数

spmak 生成B样条函数

spcrv 生成均匀划分的B样条函数

spapi 插值生成B样条函数

spap2 用最小二乘法拟合生成B样条函数

spaps 对生成的B样条曲线进行光滑处理

spcol 生成B样条函数的配置矩阵

4. 有理样条函数

rpmak 生成有理样条函数

rsmak 生成有理样条函数

5. 样条操作函数

fnval 计算在给定点处的样条函数值

fmbrk 返回样条函数的某一部分(如断点或系数等)

fncmb 对样条函数进行算术运算

fn2fm 把一种形式的样条函数转化成另一种形式的样条函数

fnder 求样条函数的微分(即求导数)

fndir 求样条函数的方向导数

fnint 求样条函数的积分

fnjmp 在间断点处求函数值

fnplt 画样条曲线图

fnrfn 在样条曲线中插入断点。

fntlr 生成tarylor系数或taylor多项式

6. 样条曲线端点和节点处理函数

augknt 在已知节点数组中添加一个或多个节点

aveknt 求出节点数组元素的平均值

brk2knt 增加节点数组中节点的重次

knt2brk 从节点数组中求得节点及其重次

knt2mlt 从节点数组中求得节点及其重次

sorted 求出节点数组的元素在另一节点数组中属于第几个分量

aptknt 求出用于生成样条曲线的节点数组

newknt 对分段多项式样条函数进行重分布

optknt 求出用于内插的最优节点数组

chbpnt 求出用于生成样条曲线的合适节点数组




Responses to “Matlab 曲面插值和拟合”

 

  1. # waitingon 14 Nov 2007 at 2:22 pm

    非常之高手,想请教一下,如果我只有三,四个已知三维坐标的点,能不能做到拟合呢?

    我用你上面的方法,用surf画了一下,

    t=csvread(’c:/www/dat/1chang.csv’);

    x=[t(1,1,1),t(1,4,1),t(1,7,1),t(1,10,1)];

    y=[t(1,2,1),t(1,5,1),t(1,8,1),t(1,11,1)];

    z=[t(1,3,1),t(1,6,1),t(1,9,1),t(1,12,1)];

    surf(x,y,z)

    title(’Original data Plot’);

    xlabel(’X’), ylabel(’Y’), zlabel(’Z’),

    colormap, colorbar;

    axis equal

    结果只出来坐标轴,没有任何关于我的点的东西,不知道为什么,希望给与指点

  2. # yangon 14 Nov 2007 at 3:46 pm

    并不是数据太少,理论上3点就可以确定一个面,所以不是数据多少的问题,而是数据格式不对,你的坐标可能只是离散的坐标,这样子只能够画三维曲线出来,而不能画面。你可以试试用plot3应该可以画出你的数据来。

    如果你想画曲面,要把数据整理成固定的格式,下面一个简单的例子,希望对你有帮助,你可以看出来,只有四个点也是可以画出曲面来的。

    x=[1:1:2]

    y=[1:1:2]

    [xx,yy]=meshgrid(x,y)

    z=[4.1,4.2;4.3,4.4]

    surf(x,y,z)

0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有