matlab 三次样条拟合,【MATLAB编程】三次样条

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼

在最简单的用法中,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形式向量的一种方法。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值