主要内容

如何构建样条曲线

此示例显示如何使用曲线拟合工具箱™中的样条函数以各种方式构建样条曲线。

插值

你可以构建一个立方样条interpolant.与以下站点的余弦功能匹配X, 使用CSAPI.命令。

x = 2 * pi * [0 1.1:.2:.9];y = cos(x);cs = csapi(x,y);

然后,您可以通过使用查看插值样条fnplt.

fnplt(cs,2);轴([ -  1 7 -1.2 1.2])保持绘图(x,y,'o') 抓住离开

检查interpolant.

余弦功能是2 * pi-周期性。在这方面,我们的立方样条立方曲线互化有多好?检查的一种方法是计算两个端点的第一个导数的差异。

差异(fnval(fnder(cs),[0 2 * pi]))))
ans = -0.1375.

执行周期性,使用csape.代替CSAPI.

csp = csape(x,y,'定期');抓住fnplt(csp,'G') 抓住离开

现在检查给出

差异(fnval(fnder(csp),[0 2 * pi])))
ans = -2.2806e-17

即使是第二衍生物现在现在匹配在端点。

差异(fnval(fnder(csp,2),[0 2 * pi])))
ANS = -2.2204E-16

分段线性插值通过相同的数据可通过spapi.。在这里,我们将它添加到以前的绘图中,以红色为单位。

pl = spapi(2,x,y);抓住fnplt(pl,'r',2)持有离开

平滑

如果数据嘈杂,通常希望近似值而不是插值。例如,通过这些数据

x = linspace(0,2 * pi,51);noisy_y = cos(x)+ .2 *(rand(尺寸(x)) - 。5);plot(x,noisy_y,'X')轴([ -  1 7 -1.2 1.2])

插值将使下面显示的Wiggly Interpolat在蓝色中。

抓住fnplt(csapi(x,noisy_y))持有离开

相比之下,用适当的宽容平滑

tol =(.05)^ 2 *(2 * pi)
托= 0.0157.

提供平滑的近似,如下所示。

抓住fnplt(spaps(x,noisy_y,tol),'r',2)持有离开

近似在间隔的末端附近更差,远离周期性。要执行周期性,近似于定期扩展数据,然后将近似值限制为原始间隔。

noisy_y([1结束])=均值(noisy_y([1结束]));lx =长度(x);lx2 = round(lx / 2);范围= [lx2:lx 2:lx 2:lx2];sps = spaps([x(lx2:lx)-2 * pi x(2:lx)x(2:lx2)+ 2 * pi],noisy_y(范围),2 * tol);

这给出了近似周期性的近似,如黑色所示。

抓住fnplt(sps,[0 2 * pi],'K',2)持有离开

最小二乘近似

或者,您可以通过具有少量自由度的样条曲线使用最小二乘近似到噪声数据。

例如,您可以尝试只需四件的立方样条。

spl2 = spap2(4,4,x,noisy_y);fnplt(spl2,'B',2);轴([ -  1 7 -1.2 1.2])保持plot(x,noisy_y,'X') 抓住离开

结选择

使用时spapi.要么SPAP2.,您通常必须指定特定的样条空间。这是通过指定a来完成的结序列命令,这可能是一个问题。但是,在做样条插值时X,Y.使用订单样条的数据K.,您可以使用该功能optknt.提供良好的结序列,如以下示例所示。

k = 5;%订单5,即,我们正在使用四个样条x = 2 * pi * sort([0 1 rand(1,10)]);y = cos(x);sp = spapi(optknt(x,k),x,y);fnplt(sp,2,'G');抓住绘图(x,y,'o') 抓住离开轴([ -  1 7 -1.1 1.1])

执行最终方块近似时,您可以使用当前近似来确定可能更好的结选择选择纽knt.。例如,对指数函数的以下近似并不是那么好,从它的错误可以看出,以红色绘制。

x = linspace(0,10,101);y = exp(x);SP0 = SPAP2(奥纳克(0:2:10,4),4,x,y);绘图(x,y-fnval(sp0,x),'r''行宽'2)

但是,您可以使用该初始近似来创建另一个近似值相同的结的数量,但它们是更好的分布式。它的错误是黑色的。

sp1 = spap2(newknt(sp0),4,x,y);抓住绘图(x,y-fnval(sp1,x),'K''行宽',2)持有离开

网格数据

曲线拟合工具箱中的所有样条插值和近似命令还可以在任意数量的变量中处理网格数据。

例如,这里是墨西哥帽子功能的双向样条嵌段。

x = .0001 +( -  4:.2:4);Y = -3:.2:3;[yy,xx] = meshgrid(y,x);r = pi * sqrt(xx。^ 2 + yy。^ 2);z = sin(r)./ r;bcs = csapi({x,y},z);Fnplt(BCS)轴([ -  5 5 -5 5 -5 1])

这里是最小二乘近似于同一网格上相同函数的噪声值。

Knotsx =奥克纳特(Linspace(x(1),x(end),21),4);Knotsy = Augknt(Linspace(y(1),y(y末),15),4);bsp2 = spap2({knotsx,knotsy},[4 4],{x,y},z + .02 *(rand(size(z)) - 。5));FNPLT(BSP2)轴([ -  5 5-5 5 -5 1])

曲线

可以轻松处理网格数据,因为曲线拟合工具箱可以处理矢量值花键。这也使得可以轻松使用参数曲线。

这里,例如,通过将立方样条曲线放置通过下图中标记的点来获得的近似值。

t = 0:8;XY = [0 0; 1 1;1.7 0; 1 -1; 0 0;-1 1;-1.7 0;-1 -1;0 0]。';infty = csape(t,xy,'定期');fnplt(漂细,2)轴([ -  2 2 -1.1 1.1])保持绘图(XY(1,:),XY(2,:),'o') 抓住离开

这是相同的曲线,但是在第三维度中的运动。

滚筒= CSAPE(T,[XY; 0 1/2 1 1/2 0 1/2 1 1/2 0],'定期');fnplt(滚子,2,[0 4],'B') 抓住fnplt(滚子,2,[4 8],'r')Plot3(0,0,0,'o') 抓住离开

曲线的两半以不同的颜色绘制,并且原点被标记为可视化这两个飞行空间曲线。

曲面

与R ^ 3中的值的双变量张量 - 产品样条带给曲面。例如,这是对圆环的良好近似。

x = 0:4;y = -2:2;r = 4;r = 2;v =零(3,5,5);v(3,:,:) = [0(r-r)/ 2 0(r-r)/ 2 0]。'* [1 1 1 1 1];v(2,:,:) = [r(r + r)/ 2 r(r + r)/ 2 r]。'* [0 1 0 -1 0];v(1,:,:) = [r(r + r)/ 2 r(r + r)/ 2 r]。'* [1 0 -1 0 1];dough0 = csape({x,y},v,'定期');fnplt(dough0)轴平等的,轴离开

这是该表面的法线冠冕。

nx = 43;xy = [(1,nx);linspace(2,-2,nx)];点= fnval(Dough0,XY)';ders = fnval(fndir(dough0,眼睛(2)),xy);法线=十字架(ders(4:6,:),ders(1:3,:));法线=(正常./repmat(sqrt(sqrt(normals.*normals))'plyse ],3,1))';pn = [点;点+正常];抓住为了J = 1:Nx Plot3(PN([j,j + nx],1),pn([j,j + nx],2),pn([j,j + nx],3))结尾抓住离开

最后,这里的投影到(x,y)-plane上。

fnplt(fncmb(dough0,[1 0 0; 0 1 0]))轴([ -  5.25 5.25-4.14 4.14]),轴离开

分散的数据

还可以在平面中未完成的数据站点提供的值内插。例如,考虑将单位方形平滑地映射到单位磁盘的任务。我们构建标记为圆的数据值以及标记为X的相应数据站点。每个数据站点通过箭头连接到其关联值。

n = 64;t = linspace(0,2 * pi,n + 1);t(结束)= [];值= [cos(t);罪(t)];绘图(值(1,:),值(2,:),'要么')轴平等的,轴离开站点=值./repmat(max(abs(abs(values))2,2,1);抓住绘图(站点(1,:),站点(2,:),'XK')quiver(站点(1,:),站点(2,:),......值(1,:) - 站点(1,:),值(2,:) - 站点(2,:))持有离开

然后使用TPAPS.构建一双层插值矢量值薄板样条。

st = tpaps(站点,值,1);

样条曲线确实将单位方形平滑地(大约)映射到单位盘,因为它的曲线fnplt.表示。该图显示了花键式地图下的均匀间隔的方形网格的图像英石

抓住fnplt(st)保持离开