主要内容

样条拟合钛测试数据

这个例子展示了如何使用来自曲线拟合工具箱™的命令,通过手动和自动选择结来拟合样条到钛测试数据。

样条插值的手工结选择

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

[xx, yy] =钛;

数据图显示了一个相当陡峭的峰值。

情节(xx, yy,“软”);帧=[-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];τ= xx(选择);y = yy(选择);持有情节(τ,y,“罗”);持有

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

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

图中包含一个轴对象。轴对象包含两个类型为line的对象。这些对象代表数据值,结点。

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

sp = spapi (t,τ,y);

现在来看情节。由于我们不关心数据区间之外的样条曲线部分,所以我们将绘图限制在这个区间内。

情节(τ,y,“罗”轴(帧)fnplt (sp(τ(1)τ(结束)),“k”)举行

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

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

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

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

第一个区间的不合理凸起源于样条在第一个结处平滑地为零。这里是整个样条的图片,以及它的结序列和数据点。

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

图中包含一个轴对象。轴对象包含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”结束,τ([1])传奇({“原始数据”“为结束条件添加的数据”...“适合添加的数据”},“位置”“西北”

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

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

持有fnplt (sp,“k”结束,τ([1])传奇({“原始数据”“为结束条件添加的数据”...“适合添加的数据”“原来适合”},“位置”“西北”

图中包含一个轴对象。轴对象包含4个类型为line的对象。这些对象代表原始数据、为结束条件添加的数据、添加数据的匹配、原始匹配。

最后,仔细查看前四个数据区间,更清楚地显示了左端附近波动的减少。

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

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

自动结选择的插值

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

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

图中包含一个轴对象。轴对象包含3个类型为line的对象。这些对象表示数据值,适合由SPAPI选择的结,由SPAPI选择的结。

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

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

图中包含一个轴对象。axis对象包含5个类型为line的对象。这些对象表示数据值,适合的结选择的SPAPI,结选择的SPAPI,适合的结调整,调整的结。

或者,简单地尝试标准三次样条插值,由csapi.这意味着打结的选择略有不同。

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

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

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

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

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