基于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)=⎩
⎨
⎧a1∗x3+b1∗x2+c1∗x+d1a2∗x3+b2∗x2+c2∗x+d2......an∗x3+bn∗x2+cn∗x+dnx∈[x1,x2]x∈(x2,x3]x∈(xn,xn+1]
每两个点之间用一个多项式来表示,这些多项式的阶数相同,但是系数是不一样的。样条插值的目的就是求这些多项式系数,已知系数,那些中间点的值就能唯一确定了。不难想象,随着多项式阶数的提升,端点处会更加平滑,但计算量也越大。
上图为不同阶数样条插值结果,由此可见,三次样条插值的效果最好,通过样条画出来的曲线不仅经过各固定点,而且连续光滑。
本文以三次样条插值为例,完成下列数据的插值,效果如图。
x= [10, 20, 30, 40, 50, 60];
y = [ 0.1,0.4,0.8,0.98,1.0,1.0];
二、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