这个例子展示了如何使用来自曲线拟合工具箱™的命令,通过手动和自动选择结来拟合样条到钛测试数据。
这里有一些数据记录了钛的某种性质,是温度的函数。我们将用它来说明样条插值的一些问题。
[xx, yy] =钛;
数据图显示了一个相当陡峭的峰值。
情节(xx, yy,“软”);帧=[-10 10 -。1。3]+ [min (xx), max (xx)、min (yy)、马克斯(yy)];轴(框架);
我们从这些粗略的数据中选取一些数据点,因为我们想要插值。下面是数据的图片,标记了选定的数据点。
Pick = [1 5 11 21 27 29 31 33 35 40 45 49];τ= xx(选择);y = yy(选择);持有在情节(τ,y,“罗”);持有从
由于具有n+k个结点的k阶样条具有n个自由度,并且我们有12个数据点,所以四阶样条的拟合需要12+4 = 16个结点。而且,这个结序列t必须是这样的,即第i个数据点位于第i个b样条的支持位置。金宝app我们通过使用数据站点作为结来实现这一点,但在两端添加两个简单的结。
Dl = tau(2) - tau(1);Dr = tau(end) - tau(end-1);T = [tau(1)-dl*[2 1] tau tau(end)+dr*[1 2];%构造结序列情节(τ,y,“罗”);持有在轴(框架+ (2 * dl博士2 * 0 0))情节(t, repmat(框架(3)+ 03,大小(t)),“kx”)举行从传奇({的数据值“节”},“位置”,“西北”)
我们使用这个结序列来构造一个插值三次样条。
sp = spapi (t,τ,y);
现在来看情节。由于我们不关心数据区间之外的样条曲线部分,所以我们将绘图限制在这个区间内。
情节(τ,y,“罗”轴(帧)在fnplt (sp(τ(1)τ(结束)),“k”)举行从
仔细观察样条拟合的左侧部分,可以看到一些波动。
xxx = linspace(τ(1)τ(5),41);情节(xxx, fnval (sp, xxx),“k”,τ,y,“罗”);轴([tau(1) tau(5) 0.6 1.2]);
第一个区间的不合理凸起源于样条在第一个结处平滑地为零。这里是整个样条的图片,以及它的结序列和数据点。
fnplt (sp,“k”);持有在情节(τ,y,“罗”t repmat(。1、大小(t)),“kx”);持有从传奇({“样条Interpolant”的数据值“节”},“位置”,“西北”)
下面是一种执行更合理的边界行为的简单方法。我们在给定的数据区间外再加两个数据点,然后选择通过前两个数据点的直线的值作为我们的数据。
Tt = [tau(1)-[4 3 2 1]*dl tau tau(end)+[1 2 3 4]*dr];Xx = [tau(1)-[2 1]*dl tau tau(end)+[1 2]*dr;yy = [y (1) - (2 - 1) * (y (2) - y (1)) y y(结束)+ (1 2)* (y(结束)- y (end-1)));sp2 = spapi (tt, xx和yy);情节(τ,y,“罗”, xx([1 2 end-1 end]),yy([1 2 end-1 end]),“波”);轴(帧+[-2*dl 2*dr 0 0]);持有在fnplt (sp2,“b”结束,τ([1])从传奇({“原始数据”“为结束条件添加的数据”...“适合添加的数据”},“位置”,“西北”)
下面是两个样条拟合的比较,以显示第一个和最后一个区间波动的减少。
持有在fnplt (sp,“k”结束,τ([1])从传奇({“原始数据”“为结束条件添加的数据”...“适合添加的数据”“原来适合”},“位置”,“西北”)
最后,仔细查看前四个数据区间,更清楚地显示了左端附近波动的减少。
情节(τ,y,“罗”, xxx, fnval (sp2, xxx),“b”xxx, xxx, fnval (sp),“k”);轴([tau(1) tau(5) .6 1.2]);传奇({“原始数据”“适合添加的数据”...“原来适合”},“位置”,“西北”)
如果所有这些细节使你关闭,让曲线拟合工具箱为你选择结。指定插值所需的顺序作为样条插值命令的第一个输入参数spapi
,而不是一个结序列。
Autosp = spapi(4, tau, y);节= fnbrk (autosp,“节”);情节(τ,y,“罗”)举行在fnplt (autosp‘g’)情节(节,repmat(5、大小(结)),“gx”)举行从传奇({的数据值“适合由SPAPI选择的结”...“由SPAPI选择的结”},“位置”,“西北”)
下面是一个更好的结选择的结果,通过将结在842稍微向右移动,结在985稍微向左移动得到。
结点([7 12])= [851,971];Adjsp = spapi(结点,tau, y);持有在fnplt (adjsp“r”2)图(结repmat(54、大小(结)),“处方”)举行从传奇({的数据值“适合由SPAPI选择的结”...“由SPAPI选择的结”“调整过的结”...“调整节”},“位置”,“西北”)
或者,简单地尝试标准三次样条插值,由csapi
.这意味着打结的选择略有不同。
Autocs = csapi(tau, y);情节(τ,y,“罗”)举行在fnplt (autocs“c”)举行从
在这种快速变化的数据下,即使每个插值都是三次样条,也很难在所有合理的插值之间取得一致。下面的图显示了所有五种插值,以供比较。
情节(τ,y,“罗”)举行在fnplt (sp,“k”结束,τ([1]))%黑色:原fnplt (sp2,“b”结束,τ([1]))%蓝色:有特殊结束条件fnplt (autosp‘g’)%绿色:通过SPAPI自动选择结fnplt (autocs“c”)%青色:自动结选择的CSAPIfnplt (adjsp“r”, 2)红色:SPAPI的打结选择略有改变持有从传奇({的数据值“原来适合”“特殊结束条件”...“用SPAPI选择的结”“用CSAPI选择的结”...“与调整节”},“位置”,“西北”)