插值算法:用于在已知数据点的基础上,估算出这些数据点之间其他位置的数值。
数模比赛中,常常需要根据已知的函数点进行数据、模型的处理和分析,而有时候现有的数据是极少的,不足以支撑分析的进行,这时就需要使用一些数学的方法,“模拟产生”一些新的但又比较靠谱的值来满足需求,这就是插值的作用。
插值法的原理
设有 n+1个互不相同的节点(xi,yi),则存在唯一的多项式:
证明略了
【注1】只要n+1个节点互异,满足上述插值条件的多项式是唯一存在的。
【注2】如果不限制多项式的次数,插值多项式并不唯一。
1,线性差值法
基于两点确定一条直线的原理。假设已知两点(x0,y0),(x1,y1),通过构建直线方程来求解,直线的斜率,根据点斜式可得线性插值公式为
2,拉格朗日插值点
通过构造n次多项式来逼近给定的n+1个数据点
高次插值会产生龙格现象,即在两端处波动极大,产生明显的震荡。在不熟悉曲线运动趋势的前提下,不要轻易使用高次插值。
3,分段插值
(1)分段线性插值
直接取最近的两个点之间的线段上相同横坐标的点
(2)分段二次插值
因为n个点可以求出唯一一个n-1次的函数,所以如果要插入节点x,可以取最近的3个x1,x2,x3来求出唯一的一个二次函数,取这二次函数的值
4,牛顿插值法
也是构造一个n次多项式来拟合n+1个数据点。与拉格朗日插值不同,牛顿插值通过差商的概念构建插值多项式。
首先定义一阶差商:
根据一阶差商可以求出二阶差商:
最后的表达式如下
虽然加入新的点时的计算量小,但是仍然有龙格现象
5,Hermite插值法
要求函数值对应同时,还要求导数值对应.这样可以找到一个2*n+1的多项式
6,(重要)分段Hermite插值
可以直接使用matlab中的pchip函数来直接调用,比赛直接用就是了
加入我们有7个在-pi到pi的等分点,然后我们要在里面插入以0.1为精度的,覆盖-pi到pi的值,我们看看最后的结果吧
x = -pi:pi; y = sin(x); //y是要拟合上的函数
new_x = -pi:0.1:pi;//要插入的点
p = pchip(x,y,new_x);//根据x和y插入 new_x这些点
figure(1); % 在同一个脚本文件里面,要想画多个图,需要给每个图编号,否则只会显示最后一个图哦~
plot(x, y, 'o', new_x, p, 'r-')//这里表示x,y用点表示,new_x和p用实线连接
这里的plot(x1,y1,x2,y2)的用法
线方式: -实线 : 点线 -. 虚点线 - -波折线
点方式: .圆点 + 加号 * 星号 x x形 o小圆
颜色: y黄; r 红; g 绿; b蓝; w白; k黑;
7,(重要)三次样条插值
在matlab里的是spine函数,
我们去matlab中将他们对比下
x = -pi:pi;
y = sin(x);
new_x = -pi:0.1:pi;
p1 = pchip(x,y,new_x); %分段三次埃尔米特插值
p2 = spline(x,y,new_x); %三次样条插值
figure(2);
plot(x,y,'o',new_x,p1,'r-',new_x,p2,'b-')
legend('样本点','三次埃尔米特插值','三次样条插值','Location','SouthEast') %标注显示在东南方向
既可以两个求平均,也可以两个选一个
8,n维数据的插值
x = -pi:pi; y = sin(x);
new_x = -pi:0.1:pi;
p = interpn (x, y, new_x, 'spline');
% 等价于 p = spline(x, y, new_x);
figure(3);
plot(x, y, 'o', new_x, p, 'r-')
如果是一维的,其实就和上面的一些等价
标签:分段,插值,多项式,代码,插值法,算法,new,pi From: https://blog.csdn.net/2401_84910613/article/details/145204481