这个例子展示了如何使用曲线拟合工具箱™命令,手动和自动选择结来拟合样条到钛测试数据。
这里有一些数据记录了钛的某一特性,以温度的函数来测量。我们将用它来说明样条插值的一些问题。
[xx, yy] =钛;
数据的曲线图显示了一个相当尖锐的峰值。
情节(xx, yy,“软”);Frame = [-10 10 -.]1。3]+ [min (xx), max (xx)、min (yy)、马克斯(yy)];轴(框架);
我们从这些粗略的数据中选取一些数据点,因为我们想进行插值。这是数据的图片,上面标有选定的数据点。
选取= [1 5 11 21 27 29 31 33 35 40 45 49];τ= xx(选择);y = yy(选择);持有在情节(τ,y,“罗”);持有从
因为一个k阶的样条有n+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”)举行从
对于这种快速变化的数据,即使每一个合理的插值都是三次样条,也很难得到一致。下面的图显示了所有5个插值,以供比较。
情节(τ,y,“罗”)举行在fnplt (sp,“k”结束,τ([1]))%黑色:原fnplt (sp2,“b”结束,τ([1]))% blue:有特殊的结束条件fnplt (autosp‘g’)绿色:SPAPI自动打结fnplt (autocs“c”)%青色:CSAPI自动选择结fnplt (adjsp“r”, 2)红色:由SPAPI选择的结略有改变持有从传奇({的数据值“原来适合”“特殊结束条件”...“With knot Chosen by SPAPI”“由CSAPI选择结”...“与调整节”},“位置”,“西北”)