该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
在最简单的用法中,spline获取数据x和y以及期望值xi,寻找拟合x和y的三次样条内插多项式,然后,计算这些多项式,对每个xi的值,寻找相应的yi。例如:
>>x=0 : 12;
>>y=tan(pi*x/25);
>>xi=linspace(0, 12);
>>yi=spline(x, y, xi)
>>plot(x, y, ‘ o ‘, xi, yi), title(‘ Spline fit ‘)
(见图12.1样条拟合)
这种方法适合于只需要一组内插值的情况。不过,如果需要从相同数据集里获取另一组内插值,再次计算三次样条系数是没有意义的。在这种情况下,可以调用仅带前两个参量的spline:
图12.1 样条拟合
>>pp=spline(x, y)
pp =
Columns 1 through 7
10.0000 1.0000 12.0000 0 1.0000 2.0000 3.0000
Columns 8 through 14
4.0000 5.0000 6.0000 7.0000 8.0000 9.0000 10.0000
Columns 15 through 21
11.0000 12.0000 4.0000 0.0007 0.0007 0.0010 0.0012
Columns 22 through 28
0.0024 0.0019 0.0116 -0.0083 0.1068 -0.1982 1.4948
Columns 29 through 35
1.4948 -0.0001 0.0020 0.0042 0.0072 0.0109 0.0181
Columns 36 through 42
0.0237 0.0586 0.0336 0.3542 -0.2406 4.2439 0.1257
Columns 43 through 49
0.1276 0.1339 0.1454 0.1635 0.1925 0.2344 0.3167
Columns 50 through 56
0.4089 0.7967 0.9102 4.9136 0 0.1263 0.2568
Columns 57 through 63
0.3959 0.5498 0.7265 0.9391 1.2088 1.5757 2.1251
Columns 64 through 65
3.0777 5.2422
当采用这种方式调用时,spline返回一个称之为三次样条的pp形式或分段多项式形式的数组。这个数组包含了对于任意一组所期望的内插值和计算三次样条所必须的全部信息。给定pp形式,函数ppval计算该三次样条。例如,
>>yi=ppval(pp, xi);
计算先前计算过的同样的yi。
类似地,
>>xi2=linspace(10, 12);
>>yi2=ppval(pp, xi2);
运用pp形式,在限定的更细区间[10,12]内,再次计算该三次样条。
>>xi3=10 : 15
>>yi3=ppval(pp, xi3)
yi3 =
3.0777 5.2422 15.8945 44.0038 98.5389 188.4689
它表明,可在计算三次多项式所覆盖的区间外,计算三次样条。当数据出现在最后一个断点之后或第一个断点之前时,则分别运用最后一个或第一个三次多项式来寻找内插值。
上述给定的三次样条pp形式,存储了断点和多项式系数,以及关于三次样条表示的其它信息。因为,所有信息都被存储在单个向量里,所以这种形式在MATLAB中是一种方便的数据结构。当要计算三次样条表示时,必须把pp形式分解成它的各个表示段。在MATLAB中,通过函数unmkpp完成这一过程。运用上述pp形式,该函数给出如下结果:
>>[break, coefs, npolys, ncoefs]=unmkpp(pp)
breaks =
Columns 1 through 12
0 1 2 3 4 5 6 7 8 9 10 11
Column 13
12
coefs =
0.0007 -0.0001 0.1257 0
0.0007 0.0020 0.1276 0.1263
0.0010 0.0042 0.1339 0.2568
0.0012 0.0072 0.1454 0.3959
0.0024 0.0109 0.1635 0.5498
0.0019 0.0181 0.1925 0.7265
0.0116 0.0237 0.2344 0.9391
-0.0083 0.0586 0.3167 1.2088
0.1068 0.0336 0.4089 1.5757
-0.1982 0.3542 0.7967 2.1251
1.4948 -0.2406 0.9102 3.0777
1.4948 4.2439 4.9136 5.2422
npolys =
12
ncoefs =
4
这里break是断点,coefs是矩阵,它的第i行是第i个三次多项式,npolys是多项式的数目,ncoefs是每个多项式系数的数目。注意,这种形式非常一般,样条多项式不必是三次。这对于样条的积分和微分是很有益的。
给定上述分散形式,函数mkpp恢复了pp形式。
>>pp=mkpp(break, coefs)
pp =
Columns 1 through 7
10.0000 1.0000 12.0000 0 1.0000 2.0000 3.0000
Columns 8 through 14
4.0000 5.0000 6.0000 7.0000 8.0000 9.0000 10.0000
Columns 15 through 21
11.0000 12.0000 4.0000 0.0007 0.0007 0.0010 0.0012
Columns 22 through 28
0.0024 0.0019 0.0116 -0.0083 0.1068 -0.1982 1.4948
Columns 29 through 35
1.4948 -0.0001 0.0020 0.0042 0.0072 0.0109 0.0181
Columns 36 through 42
0.0237 0.0586 0.0336 0.3542 -0.2406 4.2439 0.1257
Columns 43 through 49
0.1276 0.1339 0.1454 0.1635 0.1925 0.2344 0.3167
Columns 50 through 56
0.4089 0.7967 0.9102 4.9136 0 0.1263 0.2568
Columns 57 through 63
0.3959 0.5498 0.7265 0.9391 1.2088 1.5757 2.1251
Columns 64 through 65
3.0777 5.2422
因为矩阵coefs的大小确定了npolys和neofs,所以mkpp不需要npolys和ncoefs去重构pp形式。pp形式的数据结构仅在mkpp中给定为pp=[10 1 npolys break(:)‘ ncoefs coefs(:)‘]。前两个元素出现在所有的pp形式中,它们作为确认pp形式向量的一种方法。