主要内容

如何构造花样

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

插值

你可以建立一个立方样条插值在以下网站上与余弦函数匹配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') 抓住离开

图包含一个轴对象。轴对象包含2个类型行的对象。

检查插值

余弦函数为2*pi-periodic。在这方面,我们的立方样条插值的表现如何?检查的一种方法是在两个端点处计算第一个衍生物中的差异。

diff(fnval(fnder(cs),[0 2*pi]))
ANS = -0.1375

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

csp = csape (x,y,“周期性”);抓住FNPLT(CSP,'G') 抓住离开

图包含一个轴对象。轴对象包含3个类型行的对象。

现在检查给

diff(fnval(fnder(csp),[0 2*pi]))
ANS = -2.2806E -17

即使是第二个衍生物也可以在端点匹配。

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

分段线性插值可以通过相同的数据通过SPAPI。在这里,我们将其添加到先前的图中,红色。

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

图包含一个轴对象。轴对象包含4个类型行的对象。

平滑

如果数据嘈杂,则通常需要近似而不是插值。例如,使用这些数据

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

图包含一个轴对象。轴对象包含一个类型行的对象。

插值将使下面以蓝色显示wiggly interpolant。

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

图包含一个轴对象。轴对象包含2个类型行的对象。

相反,以适当的耐受性平滑

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

给出平滑的近似值,如下所示。

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

图包含一个轴对象。轴对象包含3个类型行的对象。

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

noisy_y([1 end])=平均值(noisy_y([1 end]));lx =长度(x);lx2 =圆形(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(range),2*tol);

这给出了更近的周期性近似,以黑色为例。

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

图包含一个轴对象。轴对象包含4个类型行的对象。

最小二乘近似

另外,您可以通过几样的自由度来对噪声数据使用最小二乘近似。

例如,您可以尝试仅使用四片的立方样条。

spl2 = spap2(4,4,x,noisy_y);fnplt(spl2,'b',2);轴([ -  1 7 -1.2 1.2])情节(x,noisy_y,'X') 抓住离开

图包含一个轴对象。轴对象包含2个类型行的对象。

结选择

使用时SPAPI或者SPAP2,您通常必须指定特定的样条空间。这是通过指定一个结序列命令,这可能有点问题。但是,在进行样条插值时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])

图包含一个轴对象。轴对象包含2个类型行的对象。

进行最小二乘近似时,您可以使用当前近似值来确定可能更好的结选择newknt。例如,以下对指数函数的近似并不是那么好,从其误差中可以看出,以红色绘制。

x = linspace(0,10,101);y = exp(x);sp0 = spap2(augknt(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)保持离开

图包含一个轴对象。轴对象包含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 = augknt(linspace(x(1),x(end),21),4);knotsy = augknt(linspace(y(1),y(end),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(Infty,2)轴([-2 2 -2 -1.1 1.1])保持情节(xy(1,:),xy(2,:),,,'o') 抓住离开

图包含一个轴对象。轴对象包含2个类型行的对象。

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

roller = 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') 抓住离开

图包含一个轴对象。轴对象包含3个类型行的对象。

曲线的两半以不同的颜色绘制,并标记了原点,以有助于可视化这条两翼的空间曲线。

表面

带有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 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(面团)轴平等的,轴离开

这是该表面的正常冠。

nx = 43;xy = [一个(1,nx);linspace(2,-2,nx)];点= fnval(dough0,xy)';ders = fnval(fndir(dough0,eye(2)),xy);normals = cross(ders(4:6,:),ders(1:3,:));normals =(normals./repmat(sqrt(normals.* ormals),3,1))';pn = [点;点+正常];抓住为了j = 1:nx plot3(pn([j,j+nx],1),pn([j,j+nx],2),pn([[j,j+nx],3))结尾抓住离开

最后,这是它在(x,y)平面上的投影。

fnplt(fncmb(面团,[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(end)= [];值= [cos(t);罪(t)];绘图(值(1,:),值(2,2,:),,,'或者')轴平等的,轴离开sites = values./repmat(max(abs(Values):),2,1);抓住绘图(站点(1,:),站点(2,2 :),,,'xk')Quiver(站点(1,:),站点(2,2 :),,,...值(1,:) - 站点(1,:),值(2,:) - 站点(2,:))保持离开

然后使用TPAP构建双变量插值矢量值薄板样条。

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

样条确实确实平稳地绘制了单位正方形(大约)到设备磁盘,作为其图的图fnplt指示。该图显示了在样条图下均匀间隔的平方网格的图像英石

抓住fnplt(st)保持离开