此示例演示如何使用曲线拟合工具箱™中的样条函数以各种方式构造样条。
你可以构造一个三次样条插值它与余弦函数在下面的位置相匹配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*周期的。我们的三次样条插值在这方面做得如何?一种检验方法是计算两个端点处一阶导数的差值。
Diff (fnval(fnder(cs), [0 2*pi]))
Ans = -0.1375
为了加强周期性,使用csape
而不是csapi
.
CSP = csape(x, y,“周期”);持有在fnplt (csp,‘g’)举行从
现在支票给出
Diff (fnval(fnder(csp), [0 2*pi]))
Ans = -2.2806e-17
即使二阶导数在端点处也匹配。
Diff (fnder(csp, 2), [0 2*pi]))
Ans = -2.2204e-16
的分段线性插值相同的数据可通过spapi
.这里我们将它添加到前面的图中,用红色表示。
Pl = spapi(2, x, y);持有在fnplt (pl,“r”2) hold从
如果数据有噪声,通常需要近似而不是插值。例如,这些数据
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])
插补会给出如下蓝色所示的摆动插补。
持有在Fnplt (csapi(x, noisy_y))稍等从
相反,平滑具有适当的容差
Tol = (.05)^2*(2*pi)
Tol = 0.0157
给出一个平滑的近似,如下面的红色部分所示。
持有在Fnplt (spaps(x, noisy_y, tol),“r”2) hold从
在区间的末端附近,近似更差,而且远不是周期性的。若要加强周期性,请近似为周期性扩展的数据,然后将近似限制为原始区间。
Noisy_y ([1 end]) = mean(Noisy_y ([1 end]));Lx =长度(x);Lx2 = round(lx/2);Range = [lx2:lx 2:lx2:lx2];sps = spaps ([x (lx2: lx) 2 *π(2:lx) x (2: lx2) + 2 *π),noisy_y(范围),2 * tol);
这给出了更接近周期的近似,用黑色表示。
持有在Fnplt (sps, [0 2*pi],“k”2) hold从
或者,您可以使用最小二乘近似噪声数据的样条与几个自由度。
例如,您可以尝试只有四个部分的三次样条。
Spl2 = spap2(4,4, x, noisy_y);fnplt (spl2“b”2);轴([-1 7 -1.2 1.2])保持在情节(x, noisy_y,“x”)举行从
当使用spapi
或spap2
,你通常必须指定一个特定的样条空间。这可以通过指定a来完成结序列和一个订单,这可能有点问题。但是,在做样条插值的时候x, y
数据使用样条的顺序k
,则可以使用该功能optknt
提供一个良好的结序列,如下例所示。
K = 5;% o(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])
在进行最小二乘近似时,您可以使用当前近似来确定一个可能更好的结选择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)从
曲线拟合工具箱中的所有样条插值和近似命令也可以处理任意数量变量的网格数据。
例如,这是一个双三次样条插值到墨西哥帽函数。
x =。+ (4:.2:4);Y = -3:.2:3;[yy,xx] = meshgrid(y,x);R = pi*√(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 *(兰德(大小(z))));Fnplt (bsp2)轴([-5 5 -5 5 -。5 (1)
网格化数据可以很容易地处理,因为曲线拟合工具箱可以处理向量值样条函数。这也使得处理参数曲线变得很容易。
例如,这里是一个无穷大的近似值,通过将三次样条曲线通过下图中标记的点来获得。
T = 0:8;Xy = [0 0;1 1;1.7 0;1 -1;0;1 1;-1.7 0;1 1;0 0]。”;Infty = csape(t, xy,“周期”);Fnplt (infty, 2)轴([-2 2 -1.1 1.1])保持在情节(xy (1:), xy (2:)“o”)举行从
这是同样的曲线,但是在三维空间中运动。
滚动= cape (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 = 0 (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)/ 2r (R +R)/ 2r]。'*[0 1 0 -1 0];v(1,:,:) = [R (R +R)/ 2r (R +R)/ 2r]。'*[1 0 -1 0 1];Dough0 = cape ({x,y},v,“周期”);fnplt (dough0)轴平等的,轴从
这是曲面的法线冠。
Nx = 43;Xy = [ones(1,nx);linspace (2, 2, nx)];点= fnval(dough0,xy)';Ders = fnval(fndir(dough0,eye(2)),xy);法线=十字(ders(4:6,:),ders(1:3,:));Normals = (Normals ./repmat(√(sum(Normals .* Normals)),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(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 (end) = [];值= [cos(t);罪(t)];:情节(值(1)、价值观(2:)”或“)轴平等的,轴从Sites = values./repmat(max(abs(values)),2,1);持有在情节(网站(1:),网站(2:)“xk”)箭袋(网站(1:),网站(2:)...值(1:)网站(1:),值(2:)网站(2:))从
然后使用tpaps
构造二元插值向量值薄板样条。
St = tpaps(站点,值,1);
样条确实将单位正方形平滑地(近似地)映射到单位圆盘上,就像它的图通过的那样fnplt
表示。该图显示了图像的一个均匀间隔的正方形网格下的样条图中圣
.
持有在fnplt (st)从