插值算法
1. 插值的作用
数模比赛中,常常需要根据已知的函数点进行数据、模型的处理和分析,有时候现有的数据是极少的,不足以支撑分析的进行,这时就需要使用一些数学的方法,”模拟产生“一些新的但又比较靠谱的值来满足需求。(也可以用于预测数据)
2. 插值法
-
概念
- 插值函数
- 插值
- 插值法
设函数 y = f ( x ) y = f(x) y=f(x) 在区间 [ a , b ] [a, b] [a,b] 上有定义,且已知在点 a ≤ x 0 < x 1 < ⋯ < x n ≤ b a \leq x_0 < x_1 < \dots < x_n \leq b a≤x0<x1<⋯<xn≤b 上的值分别为: y 0 , y 1 , … , y n y_0, y_1, \dots, y_n y0,y1,…,yn ,若存在一简单函数 P ( x ) P(x) P(x) ,使 P ( x i ) = y i ( i = 0 , 1 , 2 , … , n ) P(x_i) = y_i \quad (i = 0, 1, 2, \dots, n) P(xi)=yi(i=0,1,2,…,n) , 则称 P ( x ) P(x) P(x) 为 f ( x ) f(x) f(x) 的插值函数,点 x 0 , x 1 , … , x n x_0, x_1, \dots , x_n x0,x1,…,xn 称为插值节点,包含插值节点的区间 [ a , b ] [a, b] [a,b] 称为插值区间,求插值函数 P ( x ) P(x) P(x) 的方法称为插值法。
-
分类
- 分段插值 (常用)
- 插值多项式
- 三角插值
-
龙格现象
- 高次插值会产生龙格现象,即在两端出波动极大,产生明显的震荡。在不熟悉曲线运动趋势的前提下,不要轻易使用高次插值
-
插值多项式的缺点
- 插值多项式次数高,精度未必显著提高
- 插值多项式次数越高,摄入误差可能显著增大
(因为以上两个缺点,一般采用分段插值)
-
常用的分段插值法
- 分段三次埃尔米特插值
- 三次样条插值
3. MATLAB代码
利用MATLAB的内置函数,实现简单的插值
-
(一维插值)代码
% 产生一些样本点 x = -pi:pi; y = sin(x); % 想要获得的新数据点的横坐标 new_x = -pi:0.1:pi; % 利用内置函数 pchip,实现分段三次埃尔米特插值 y1 = pchip(x,y, new_x); % 利用内置函数 spline,实现三次样条插值 y2 = spline(x, y, new_x); % 利用plot函数绘制图像 plot(x, y, 'go', new_x, y1, 'r-', new_x, y2, 'b-'); % 利用legend函数实现标注 legend('样本点', '三次埃尔米特插值', '三次样条插值', 'Location', 'SouthEast');
-
运行结果
-
(n维插值)代码
% 产生一些样本点 x1 = -3:3; x2 = -1:2; [x1,x2] = ndgrid(x1: x2); y = 1 + 2*x1 + 3*x2; % 想要获得的新数据点的横坐标 new_x1 = -3:0.1:3; new_x2 = -2:0.1:2; [new_x1, new_x2] = ndgrid(new_x1, new_x2); % 利用内置函数 interpn,实现n维插值 % 三次样条插值 y1 = interpn(x1, x2, y, new_x1, new_x2, 'spline'); % 利用plot函数绘制图像 plot3(x1,x2, y, 'go', new_x1,new_x2, y1, 'r-');
-
运行结果