此示例显示了如何使用csapi
和csape
从曲线拟合工具箱™命令来构造三次样条插值。
命令
值= csapi(x,y,xx)
返回值XX.
对给定数据的三次样条插值(X,Y.
),使用NOT-A-An-结的结束条件。这种话题是一个分段立方体函数,断裂序列X
,其立方体件连接在一起形成具有两个连续衍生物的函数。“不-A-结”的端部条件意味着,在第一和最后一次内部断裂中,即使是第三衍生物也是连续的(直到圆形误差)。
指定只有两个数据点导致直线插值。
x = [0 1];Y = [2 0];xx = linspace(0,6,121);绘图(xx,csapi(x,y,xx),“k -”,x,y,'ro') 标题(“两点插值”)
指定三个数据点给出抛物线。
x = [2 3 5];Y = [1 0 4];绘图(xx,csapi(x,y,xx),“k -”,x,y,'ro') 标题('interpolatt到三点')
更一般地,四个或更多数据点给出了立方样条。
x = [1 1.5 2 4.1 5];Y = [1 -1 1 -1 1];绘图(xx,csapi(x,y,xx),“k -”,x,y,'ro') 标题('立方样条翻入五点')
这些看起来很不错,但我们如何验证呢csapi
按照广告执行?
我们已经看到了csapi
插值,因为我们绘制了数据点,并且插值通过这些点进行。但是要确定我们得到一个立方样条曲线,最好从预期排序的立方样条和检查是否csapi
再现那个三次样条,也就是说,返回那个三次样条,从那里获取数据。
要检查的立方样条函数的一个简单示例是截断的第三功率,即函数
在哪里xi.
是休息之一,“+”下标表示截断功能,由命令提供Subplus.
:
帮助Subplus.
子消费部分。x,如果x> = 0 y = subplus(x):=(x)_ {+} =,0,如果x <= 0返回X的正部分。用于计算截断的电源。
下面绘制截短的第三电源,为特定选择xi.
=2
.和预期的一样,在2的左边是0,在2的右边是(x-2)^3。
绘图(xx,subplus(xx-2)。^ 3,'是'那'行宽',3)轴([0,6,-10,70])
现在我们在数据站点0:6中插入该特定的立方样条键,并在黑色中绘制样条的顶部。
x = 0:6;y = subplus(x-2)。^ 3;值= csapi(x,y,xx);抓住在绘图(xx,值,'K',x,y,'ro')举行离开标题('interpolant到((x-2)_ +)^ 3')
在比较两个功能时,通常更具信息量,可以绘制它们的差异。
绘图(xx,值 - subplus(xx-2)。^ 3)标题('立方样条插值中的错误((x-2)_ +)^ 3')
要将它们的差异大小放到上下文中,还可以计算最大数据值。这表明错误并不比不可避免的舍入更糟糕。
max_y = max(abs(y))
max_y = 64.
作为进一步的测试,我们会插入截断的电力csapi
- 在位点的嵌段介绍0:6不能与其一致。例如,插值样条的第一个内部断裂并不是根本并不是一个结csapi
使用“不-A-结”条件,因此插值在该网站上有三种连续衍生物。这意味着,由于其第三种衍生物在该网站上不连续,我们不应该能够重现在该网站的截断的第三次电源。
值= csapi(x,subplus(x-1)。^ 3,xx);绘图(xx,值 - subplus(xx-1)。^ 3)标题(' (x-1)_+)^3的非结误差')
因为1是第一个内结,它对这个内插不活跃。
差异与.18一样大,但随着我们远离的速度迅速衰减。这表明了立方样条插值基本上是本地的.
可以以适合于后续评估的形式保留插值立方样条曲线,或用于计算其衍生物,或用于其他操纵。这是通过致电完成的csapi
在形式
pp = csapi(x,y)
返回插值的ppform。您可以在一些新点评估此表格XX.
由命令
值= fnval (pp、xx)
可以通过命令来区分插值
DPP = Fnder(PP)
或通过命令整合它
IPP = fnint(pp)
分别返回导数和积分的函数形式。
为了显示间隔的分化,我们绘制了这种截断功率的衍生物
(还是用黄色)然后在上面,是对原截断的三次幂函数的插值的导数(还是用黑色)
绘图(xx,3 * subplus(xx-2)。^ 2,'是'那'行宽'3) pp = csapi(x,subplus(x-2).^3);民进党=曾经(pp);抓住在绘图(XX,FNVAL(DPP,XX),'K')举行离开标题('偶数((x-2)_ +)^ 3'的衍生物)
同样,更有信息丰富的比较是绘制它们的差异,并且如在此之前没有比圆形更大。
Plot (xx, fnval(dpp,xx) - 3*subplus(xx-2).^2)' (x-2)_+)^3的插值导数误差')
截断幂的二阶导数为
这个函数与Interpolatt的第二导数与原始函数之间的差异表明现在跳起来,但它们仍然在圆周OFF内。
ddpp = fnder(dpp);plot(xx,fnval(ddpp,xx) - 6 * subplus(xx-2))标题('Interpolatt的第二阶导数误差((x-2)_ +)^ 3')
截断功率的积分是
这个函数与原函数的插值积分之间的差异图再次表明,误差在舍入范围内。
ipp = fnint (pp);^4/4)标题(x,x,x)' (x-2)_+)^3插值积分中的误差')
喜欢csapi
, 这csape
命令为给定的数据提供三次样条插值。但是,它允许各种附加的终端条件。最简单的版本,
pp = csape(x,y)
使用Lagrange End条件,这是一个常见的替代方法,用于不使用的不用于csapi
.csape
不直接返回Interpolant的值,但只能返回其ppform。
例如,考虑再次对功能的插值
哪一个csapi
繁殖不好。我们绘制返回的非结插值的误差csapi
(黑色),以及从中获得的插值的误差csape
(红色的)。
精确= subplus(xx-1)。^ 3;绘图(xx,fnval(csapi(x,subplus(x-1)。^ 3),xx) - 精确,'K')举行在绘图(xx,fnval(csape(x,subplus(x-1)。^ 3),xx) - 精确,'r') 标题('NOT-A-CNOT与Lagrange End条件的错误) 传奇({“Not-a-Knot”'拉格朗日'});抓住离开
在这种情况下,两个嵌就之间没有太大差异。
这csape
命令还提供了用于指定插值立方样条的其他几种类型的结束条件的方法。例如,命令
pp = csape(x,y,'变分')
使用所谓的“自然”最终条件。这意味着第二衍生物在两个极端断裂处为零。
此步骤显示了如何将“自然”立方样条插值应用于该功能
并绘制错误。下面的代码计算了与替代参数语法的“自然”样条插值,相当于“变体”字符串参数:使用字符串'秒'指定csape
应将最终数据站点设置为默认值为0的第二导数。
页= csape (x, subplus (x - 2) ^ 3,'第二');绘图(XX,FNVAL(PP,XX) - SUBPLUS(XX-2)。^ 3)标题(''自然'的空白插值中的错误((x-2)_ +)^ 3')
注意右边的大错误。这是由于“自然”终止条件隐含地要求二阶导数为零的事实。
我们还可以明确使用正确的第二个衍生品来获得小错误。首先,我们在端点上计算截断电源的正确第二衍生值。
Endcond = 6 * subplus(x([1末]) - 2);
然后我们创建插值,指定端点处的二阶导数与我们刚刚计算的二阶导数值相匹配。我们通过提供来做到这一点endcond(1)
对于左端点状况,和endcond(2)
对于右侧,以及数据值。
pp = csape(x,[endcond(1)subplus(x-2)。^ 3 endcond(2)],'第二');Plot (xx, fnval(pp,xx) - subplus(xx-2).^3,'r')标题('样条插值误差((x-1)_ +)^ 3';...'当二阶导数在两端匹配时'])
csape
还允许规范终点山坡上.这是夹紧(或者,完整的)立方样条插值。该声明
pp = csape(x,[sl,y,sr],'钳位')
创建数据的立方样条插值(X
那y
)也有斜率sl
在最左边的数据点和斜率老
在最右边的数据网站。
甚至可以混合这些条件。例如,我们练习的截断功率函数
斜率为0X
= 0和第二衍生物30X
=6(最后一个数据站点)。
因此,通过匹配左端斜率和右端曲率,我们期望得到的插值没有误差。
pp = csape(x,[0 subplus(x-1)。^ 3 30],[1 2]);绘图(xx,fnval(pp,xx) - subplus(xx-1)。^ 3)标题(['样条插值误差((x-1)_ +)^ 3';...'混合结束条件。'])
也可以开处方定期最终条件。例如,正弦函数是2 * pi-hearionic并且具有值[0 -1 0 1 0]
在网站上(π/ 2)* (2:2)
.在这些网站上的正弦函数和其周期性立方样条嵌段之间的差异仅为2%。不错。
x =(π/ 2)* (2:2);Y = [0 -1 0 1 0];页= csape (x, y,'定期');xx = linspace(-pi,pi,201);绘图(XX,SIN(XX) - FNVAL(PP,XX),'X') 标题(周期三次样条插值sin(x)的误差)
任何未明确涵盖的最终条件csapi
或csape
可以通过构建interpolator来处理csape
默认的侧面条件,然后将其添加到零值和某些侧面条件的适当标量倍数。如果满足两个“非标准”侧面条件,您可能必须先解决一个2×2线性系统。
例如,假设你想计算三次样条插值S.
到数据
x = 0:.25:3;q = @(x)x。*( - 1 + x。*( - 1 + x。* x / 5));y = q(x);
并强制执行条件
Lambda:= A *(DS)(e)+ b *(d ^ 2 s)(e)= c
在第一和第二衍生物S.
当时E.
.
这些数据是由一个四次多项式生成的,它恰好满足这个带有特定参数的边条件
e = x(1);a = 2;b = -3;C = 4;
要构建满足此特定条件的插值,我们首先将插值与默认最终条件构成
pp1 = csape(x,y);
它的第一个多项式部分的一阶导数。
dp1 =曾经(fnbrk (pp1 1));
此外,我们将立方样条插值构建为零数据值,指定它具有1的斜率E.
那
pp0 = csape(x,[1,zeros(尺寸(y)),0],[1,0]);
以及构造它的第一个多项式部分的一阶导数。
dp0 = fnder(fnbrk(pp0,1));
然后我们计算λ
对彼此而言pp1
和pp0
那
Lam1 = a * fnval(dp1,e)+ b * fnval(fnder(dp1),e);Lam0 = a * fnval(dp0,e)+ b * fnval(fnder(dp0),e);
并构建正确的线性组合pp1
和pp0
获得立方样条曲线
解:= (c - pp1) / pp0) * pp0
这确实满足了所需的条件,以及右端点的默认结束条件。我们用FNCMB.
.
s = fncmb (pp0 (c-lam1) / lam0 pp1);
插值错误的图表显示了S.
靠近四分之一多项式E.
比interpolantpp1
使用默认条件就可以。
xx =(-.3):05:.7;yy = q(xx);绘图(XX,FNVAL(PP1,XX) - YY,'X')举行在绘图(xx,fnval(s,xx) - yy,'o')举行离开传奇({“默认条件”“非标准条件”},'地点'那'se')
如果我们想要强制执行条件
MU(s):=(d ^ 3 s)(3)= 14.6
对于插值函数的三阶导数(四阶导数满足这个条件),我们构造一个额外的三次样条插值到零值,并且在左端点处一阶导数为零,因此必然是独立的pp0
.
pp2 = csape (x,[0, 0(大小(y)), 1], [0,1]);
然后我们找到系数D0.
和D2
在线性组合
S:= PP1 + D0 * PP0 + D2 * PP2
它解线性方程组
lambda(s)= c
μ(s) = 14.6
请注意,这两个pp0
和pp2
在所有插值地消失,因此S.
将匹配给定数据的任何选择D0.
和D2
.
对于娱乐,我们使用MATLAB®编码设施来编写循环计算λ(pp_j)
和mu(pp_j)
, 为了j
= 0:2。
DD =零(2,3);为了j = 0:2 j = num2str(j);eval([“民进党”J'= fnder(pp'J');']);eval([“ddpp”J'= fnder(dpp'J');']);eval(['DD(1,1+'J')= a * fnval(dpp'J',e)+ b * fnval(ddpp'J',e);']);eval(['DD(2,1+'J')= fnval(fnder(ddpp'J'),3);']);结尾
鉴于值λ
和μ
为了pp0
那pp1
,pp2
,然后我们解出定义正确线性组合的系数。
d = dd (: [1,3]) \ ([c; 14.6] dd (:, 2));s = fncmb (fncmb (pp0, d (1) pp2 d (2)), pp1);xxx = 0: .05:3;多= q (xxx);图(xxx, yyy - fnval(s,xxx),'X') 标题('样条插值为y = x *( - 1 + x *( - 1 + x * x / 5))')
为了保证,我们将此误差与该函数的完全三次样条插值得到的误差进行比较:
抓住在绘图(XXX,YYY - FNVAL(CSAPE(X,[ - 1,Y,-7 +(4/5)* 27],'夹紧'),xxx),'o')举行离开传奇({“非标准条件”'Anderlope条件'})
误差仅在终点附近而不同(而不是多大),证明了这两种情况pp0
和pp2
只在其各自的端点附近大小可观。
作为最终检查,我们验证了这一点S.
满足3的所需的第三衍生物条件。
fnval(Fnder(s,3),3)
ans = 14.6000.