基于matlab及c++实现三次样条插值

基于matlab及c++实现三次样条插值

一、样条插值的原理

样条函数,在数学上把它定义成一个分段多项式函数,以三次多项式为例:
f ( x ) = { a 1 ∗ x 3 + b 1 ∗ x 2 + c 1 ∗ x + d 1 x ∈ [ x 1 , x 2 ] a 2 ∗ x 3 + b 2 ∗ x 2 + c 2 ∗ x + d 2 x ∈ ( x 2 , x 3 ] . . . . . . a n ∗ x 3 + b n ∗ x 2 + c n ∗ x + d n x ∈ ( x n , x n + 1 ] f(x)= \begin{cases} a_1*x^3+b_1*x^2+c_1*x+d_1 & x\in[x_1,x_2]\\ a_2*x^3+b_2*x^2+c_2*x+d_2 & x\in(x_2,x_3]\\ ......\\ a_n*x^3+b_n*x^2+c_n*x+d_n & x\in(x_n,x_{n+1}]\\ \end{cases} f(x)= a1x3+b1x2+c1x+d1a2x3+b2x2+c2x+d2......anx3+bnx2+cnx+dnx[x1,x2]x(x2,x3]x(xn,xn+1]

每两个点之间用一个多项式来表示,这些多项式的阶数相同,但是系数是不一样的。样条插值的目的就是求这些多项式系数,已知系数,那些中间点的值就能唯一确定了。不难想象,随着多项式阶数的提升,端点处会更加平滑,但计算量也越大。

不同阶数样条插值结果

图1 不同阶数的样条插值结果

上图为不同阶数样条插值结果,由此可见,三次样条插值的效果最好,通过样条画出来的曲线不仅经过各固定点,而且连续光滑。

本文以三次样条插值为例,完成下列数据的插值,效果如图。

x= [10, 20, 30, 40, 50, 60];
y = [ 0.1,0.4,0.8,0.98,1.0,1.0];

插值结果

图2 三次样条插值结果

二、matlab实现

% 三次Hermite多项式插值方法,特点:过点实现插值
% x= [10, 20, 30, 40, 50, 60];y = [ 0.1,0.4,0.8,0.98,1.0,1.0]; [yi,xi,coefs]=interp1_company(x,y);

function [yi,xi,coefs]=interp1_company(x,y)
xi=x(1):1/10:x(end);
siz_xi = size(xi);
[yo,coefs]=pchip(x,y,xi);
yiMat = yo
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值