主要内容

拟合样条到钛测试数据

本示例展示如何使用Curve Fitting Toolbox™中的命令,通过手动和自动选择结点,将样条拟合到钛测试数据。

手动结选择样条插值

这里有一些数据记录了钛的某种性质,作为温度的函数测量。我们将用它来说明样条插值的一些问题。

[xx,yy] =钛;

数据图显示出一个相当明显的峰值。

情节(xx, yy,“软”);Frame = [-10 10 -.]1。3]+ [min (xx), max (xx)、min (yy)、马克斯(yy)];轴(框架);

图中包含一个轴对象。axis对象包含一个line类型的对象。

我们从这些粗略的数据中选取几个数据点,因为我们想进行插值。下面是数据的图片,并标记了所选的数据点。

Pick = [1 5 11 21 27 29 31 33 35 40 45 49];Tau = xx(pick);Y = yy(挑选);持有情节(τ,y,“罗”);持有

图中包含一个轴对象。axis对象包含2个line类型的对象。

因为有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”)举行传奇({的数据值“节”},“位置”“西北”

图中包含一个轴对象。axis对象包含2个line类型的对象。这些对象表示数据值,结点。

我们使用这个结序列来构造插值三次样条。

Sp = spapi(t,tau,y);

现在讲情节。由于我们不关心样条在数据区间之外的部分,我们将绘图限制在该区间内。

情节(τ,y,“罗”轴(框架)hold住fnplt (sp(τ(1)τ(结束)),“k”)举行

图中包含一个轴对象。axis对象包含2个line类型的对象。

仔细观察样条拟合的左边部分,可以看到一些波动。

XXX = linspace(tau(1),tau(5),41);Plot (xxx, fnval(sp, xxx),“k”,, y,“罗”);轴([tau(1) tau(5) 0.6 1.2]);

图中包含一个轴对象。axis对象包含2个line类型的对象。

第一个区间的不合理颠簸源于这样一个事实,即我们的样条在第一个结处平滑地归零。为了看到这一点,这里有一张整个样条的图片,以及它的结序列和数据点。

fnplt (sp,“k”);持有情节(τ,y,“罗”t repmat(。1、大小(t)),“kx”);持有传奇({“样条Interpolant”的数据值“节”},“位置”“西北”

图中包含一个轴对象。axis对象包含3个line类型的对象。这些对象表示样条插值,数据值,结。

这里有一种执行更合理的边界行为的简单方法。我们在给定的数据区间之外再添加两个数据点,并选择经过前两个数据点的直线的值作为我们的数据。

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]))保持不变传奇({“原始数据”“为最终条件添加的数据”...“适合添加的数据”},“位置”“西北”

图中包含一个轴对象。axis对象包含3个line类型的对象。这些对象表示原始数据、为结束条件添加的数据、符合添加的数据。

这里是两个样条拟合的比较,以显示在第一个和最后一个区间波动的减少。

持有fnplt (sp,“k”,tau([1 end]))保持不变传奇({“原始数据”“为最终条件添加的数据”...“适合添加的数据”“原来适合”},“位置”“西北”

图中包含一个轴对象。axis对象包含4个line类型的对象。这些对象表示原始数据、为结束条件添加的数据、与添加的数据的拟合、原始拟合。

最后,这里是前四个数据间隔的仔细观察,更清楚地显示了左端附近波动的减少。

情节(τ,y,“罗”, xxx, fnval (sp2, xxx),“b”xxx, xxx, fnval (sp),“k”);轴([tau(1) tau(5) .6 1.2]);传奇({“原始数据”“适合添加的数据”...“原来适合”},“位置”“西北”

图中包含一个轴对象。axis对象包含3个line类型的对象。这些对象表示原始数据、添加数据的拟合、原始拟合。

自动结选择插值

如果所有这些细节使您关闭,让曲线拟合工具箱为您选择结。将插值器的期望顺序指定为样条插值命令的第一个输入参数spapi,而不是一个结序列。

Autosp = spapi(4, tau, y);结= fnbrk(autosp,“节”);情节(τ,y,“罗”)举行fnplt (autosp‘g’) plot(节,repmat(.5,大小(节)),“gx”)举行传奇({的数据值“适合SPAPI选择的结”...“SPAPI选择的结”},“位置”“西北”

图中包含一个轴对象。axis对象包含3个line类型的对象。这些对象表示数据值,与SPAPI选择的节匹配,SPAPI选择的节。

下面是一个更好的结选择的结果,通过将842的结稍微向右移动,将985的结稍微向左移动。

结([7 12])= [851,971];Adjsp = spapi(结,tau, y);持有fnplt (adjsp“r”,2) plot(节,repmat(.54,大小(节)),“处方”)举行传奇({的数据值“适合SPAPI选择的结”...“SPAPI选择的结”“适合调整结”...“调整节”},“位置”“西北”

图中包含一个轴对象。axis对象包含5个line类型的对象。这些对象表示数据值,与SPAPI选择的节匹配,SPAPI选择的节,与调整的节匹配,调整的节。

或者,简单地尝试标准三次样条插值,由csapi.这相当于选择了稍微不同的结。

Autocs = csapi(tau, y);情节(τ,y,“罗”)举行fnplt (autocs“c”)举行

图中包含一个轴对象。axis对象包含2个line类型的对象。

对于这种快速变化的数据,很难在所有合理的插值之间取得一致,即使它们每个都是三次样条。下面的图显示了所有五个插补,以供比较。

情节(τ,y,“罗”)举行fnplt (sp,“k”结束,τ([1]))%黑色:原装fnplt (sp2,“b”结束,τ([1]))%蓝色:特殊结束条件fnplt (autosp‘g’%绿色:由SPAPI自动选择结fnplt (autocs“c”%青色:CSAPI自动选择结fnplt (adjsp“r”, 2)%红色:由SPAPI选择的结略有改变持有传奇({的数据值“原来适合”“特殊终了条件”...“用SPAPI选择的结”“CSAPI选择的结”...“带调整结”},“位置”“西北”

图中包含一个轴对象。axis对象包含6个line类型的对象。这些对象表示数据值,原始拟合,特殊结束条件,SPAPI选择的节,CSAPI选择的节,调整的节。