拟合样条到钛测试数据
本示例展示如何使用Curve Fitting Toolbox™中的命令,通过手动和自动选择结点,将样条拟合到钛测试数据。
手动结选择样条插值
这里有一些数据记录了钛的某种性质,作为温度的函数测量。我们将用它来说明样条插值的一些问题。
[xx,yy] =钛;
数据图显示出一个相当明显的峰值。
情节(xx, yy,“软”);Frame = [-10 10 -.]1。3]+ [min (xx), max (xx)、min (yy)、马克斯(yy)];轴(框架);
我们从这些粗略的数据中选取几个数据点,因为我们想进行插值。下面是数据的图片,并标记了所选的数据点。
Pick = [1 5 11 21 27 29 31 33 35 40 45 49];Tau = xx(pick);Y = yy(挑选);持有在情节(τ,y,“罗”);持有从
因为有n+k节的k阶样条有n个自由度,我们有12个数据点,所以用四阶样条拟合需要12+4 = 16节。而且,该结序列t必须使第i个数据点位于第i条b样条的支持下。万博1manbetx我们通过使用数据站点作为结来实现这一点,但在两端添加两个简单的结。
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,tau,y);
现在讲情节。由于我们不关心样条在数据区间之外的部分,我们将绘图限制在该区间内。
情节(τ,y,“罗”轴(框架)hold住在fnplt (sp(τ(1)τ(结束)),“k”)举行从
仔细观察样条拟合的左边部分,可以看到一些波动。
XXX = linspace(tau(1),tau(5),41);Plot (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”,tau([1 end]))保持不变从传奇({“原始数据”“为最终条件添加的数据”...“适合添加的数据”},“位置”,“西北”)
这里是两个样条拟合的比较,以显示在第一个和最后一个区间波动的减少。
持有在fnplt (sp,“k”,tau([1 end]))保持不变从传奇({“原始数据”“为最终条件添加的数据”...“适合添加的数据”“原来适合”},“位置”,“西北”)
最后,这里是前四个数据间隔的仔细观察,更清楚地显示了左端附近波动的减少。
情节(τ,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’) plot(节,repmat(.5,大小(节)),“gx”)举行从传奇({的数据值“适合SPAPI选择的结”...“SPAPI选择的结”},“位置”,“西北”)
下面是一个更好的结选择的结果,通过将842的结稍微向右移动,将985的结稍微向左移动。
结([7 12])= [851,971];Adjsp = spapi(结,tau, y);持有在fnplt (adjsp“r”,2) plot(节,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”)%青色:CSAPI自动选择结fnplt (adjsp“r”, 2)%红色:由SPAPI选择的结略有改变持有从传奇({的数据值“原来适合”“特殊终了条件”...“用SPAPI选择的结”“CSAPI选择的结”...“带调整结”},“位置”,“西北”)