主要内容

将样条曲线拟合到钛测试数据

此示例演示如何使用“曲线拟合工具箱”中的命令™ 通过手动和自动选择节点,将样条曲线拟合到钛测试数据。

样条插值的手动节点选择

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

[xx,yy]=钛;

数据图显示了一个相当尖锐的峰值。

图(xx,yy,“bx”)帧=[-1010-.1.3]+[min(xx)、max(xx)、min(yy)、max(yy)];轴(帧);

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

我们从这些略显粗糙的数据中选取一些数据点,因为我们想要插值。

拾取=1 5 11 21 27 29 31 33 35 40 45 49;tau=xx(拾取);y=yy(拾取);保持在…上地块(头,y,“罗”); 持有

图中包含一个轴对象。axes对象包含2个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*[21]tau-tau(end)+dr*[12];%构造结序列地块(头,y,“罗”); 持有在…上轴(帧+[-2*dl 2*dr 0])绘图(t,repmat(帧(3)+.03,大小(t)),“kx”)持有传奇({“数据值”“结”},“位置”,“西北”)

图中包含一个Axis对象。Axis对象包含2个line类型的对象。这些对象表示数据值、节点。

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

sp=spapi(t,tau,y);

现在,来看看情节。因为我们不关心数据间隔之外的样条曲线部分,所以我们将绘图限制在该间隔内。

地块(头,y,“罗”)轴(框架)保持在…上fnplt(sp,[tau(1)tau(end)],“k”)持有

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

仔细观察样条曲线拟合的左侧部分会显示一些波动。

xxx=linspace(tau(1),tau(5),41);plot(xxx,fnval(sp,xxx),“k”,tau,y,“罗”); 轴([tau(1)tau(5)0.61.2]);

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

第一个间隔中的不合理凹凸源于这样一个事实,即样条曲线在其第一个节点处平滑地变为零。为了了解这一点,下面是整个样条曲线的图片,以及它的节点序列和数据点。

fnplt(sp,“k”); 持有在…上地块(头,y,“罗”,t,repmat(.1,大小(t)),“kx”); 持有传奇({“样条插值”“数据值”“结”},“位置”,“西北”)

图形包含一个轴对象。轴对象包含3个line类型的对象。这些对象表示样条线插值、数据值和节点。

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

tt=[tau(1)-[4 3 2 1]*dl-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(end)+[1 2]*(y(end)-y(end-y(end-1))];sp2=sppi(tt,xx,yy);plot(tau,y,“罗”,xx([1 2 end-1 end]),yy([1 2 end-1 end]),“波”);轴(帧+[-2*dl 2*dr 0]);保持在…上fnplt(sp2,“b”,tau([1结束])保持传奇({“原始数据”“为结束条件添加的数据”...“适合添加的数据”},“位置”,“西北”)

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

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

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

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

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

地块(头,y,“罗”,xxx,fnval(sp2,xxx),“b”,xxx,fnval(sp,xxx),“k”); 轴([tau(1)tau(5.61.2]);传奇({“原始数据”“适合添加的数据”...“原配”},“位置”,“西北”)

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

插值节点的自动选择

如果所有这些细节都使您无法使用,请让“曲线拟合工具箱”为您选择节点。指定插值对象的所需顺序作为样条曲线插值命令的第一个输入参数样条拟合,而不是节点序列。

autosp=spapi(4,tau,y);knots=fnbrk(autosp,“结”);图(头,y,“罗”)持有在…上fnplt(autosp,“g”)绘图(节,重绘(.5,大小(节)),“gx”)持有传奇({“数据值”“适合SPAPI选择的结”...“SPAPI选择的结”},“位置”,“西北”)

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

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

节([712])=[851971];adjsp=spapi(节,头,y);保持在…上fnplt(adjsp,“r”,2)绘图(节,重铺(.54,大小(节)),“rx”)持有传奇({“数据值”“适合SPAPI选择的结”...“SPAPI选择的结”“适合调整结”...“调整结”},“位置”,“西北”)

图中包含一个Axis对象。Axis对象包含5个line类型的对象。这些对象表示数据值、SPAPI选择的结拟合、SPAPI选择的结拟合、调整的结拟合。

或者,只需尝试由提供的标准三次样条插值插值生成三次样条函数。这相当于对结的选择略有不同。

autocs=csapi(τ,y);绘图(τ,y,“罗”)持有在…上fnplt(汽车,“c”)持有

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

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

地块(头,y,“罗”)持有在…上fnplt(sp,“k”,tau([1结束])%黑色:原版fnplt(sp2,“b”,tau([1结束])%蓝色:有特殊的终端条件fnplt(autosp,“g”)%绿色:SPAPI自动选择结fnplt(汽车,“c”)%青色:通过CSAPI自动选择结fnplt(adjsp,“r”,2)%红色:SPAPI的结选择略有变化持有传奇({“数据值”“原配”“特殊终止条件”...“由SPAPI选择结”“由CSAPI选择结”...“带调整结”},“位置”,“西北”)

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