数模比赛中, 常常需要根据已知的函数点进行数据、模型的处理和分析, 而有时候现有的数据是极少的, 不足以支撑分析的进行,这时就需要使用一些数学的方法,“模拟产生”一些新的但又比较靠谱的值来满足需求, 这就是插值的作用。
注意插值和拟合的区别,两者很像,但是并不完全相同,插值法要经过所有给的点,但是你和只需要找一个函数(曲线),使它在某种准则下与所有点最为接近。
一维插值问题
核心就是要构造出一个函数来,函数要经过所有已知点,然后求我们想知道的插值点的函数值(插值)。
插值法的概念
设函数y=f(x)在区间[a,b]上有定义,且已知在点 上的值分别为: ,
若存在一简单函数 P(x) ,使得 ( i=0,1,2,...,n )
则称 P(x)为f(x)的插值函数, 点 称为插值节点, 包含插值节点的区间 [a,b]称为插值区间,求插值函数 P(x)的方法称为插值法。
插值法原理
资料来源于刘春凤老师,中国大学MOOC 数值计算方法
插值函数
插值方法适用对象
比如,我们想要知道一架飞机的完整的飞行路线,注意,只是大致的。现在已经有了
再比如,我要知道一个地区的空气或者是土壤的质量
插值多项式
拉格朗日插值
在数值分析中, 拉格朗日插值法是以法国十八世纪数学家约瑟夫·路易斯·拉格朗日命名的一种多项式插值方法。在若干个不同的地方得到相应的观测值,拉格朗日插值法可以找到一个多项式, 其恰好在各个观测的点取到观测到的值。
整体看还是有规律的,只是一个多项式而已
龙格现象
当多项式次数逐渐提高的时候,在局部,图像会越来越精确,但是从整体上来看,有些地方会产生很大的误差,很好理解,因为次数搞了之后,一点很小的变化就很引起很大的反应。
所以说,高次插值会产生龙格现象, 即在两端处波动极大,产生明显的震荡。在不熟悉曲线运动趋势的前提下, 不要轻易使用高次插值。
牛顿插值
对比两种插值方法
上面讲的两种插值仅仅要求插值多项式在插值节点处与被插函数有相等的函数值,而这种插值多项式却不能全面反映被插值函数的性态。
然而在许多实际问题中,不仅要求插值函数与被插值函数在所有节点处有相同的函数值, 它也需要在一个或全部节点上插值多项式与被插函数有相同的低阶甚至高阶的导数值。
对于这些情况, 拉格朗日插值和牛顿插值都不能满足。
埃尔米特(Hermite)插值法
不但要求在节点上的函数值相等, 而且还要求对应的导数值也相等,甚至要求高阶导数也相等, 满足这种要求的插值多项式就是埃尔米特插值多项式。
直接使用 Hermite插值得到的多项式次数较高, 也存在着龙格现象,因此在实际应用中, 往往使用分段三次 Hermite插值多项式(PCHIP)。
具体的证明过程这里并不展开,下面是有关分段三次艾尔米特插值的代码
% 分段三次埃尔米特插值
x = -pi:pi; y = sin(x);
new_x = -pi:0.1:pi;
p = pchip(x,y,new_x);
figure(1); % 在同一个脚本文件里面,要想画多个图,需要给每个图编号,否则只会显示最后一个图哦~
plot(x, y, 'o', new_x, p, 'r-')
% plot函数用法:
% plot(x1,y1,x2,y2)
% 线方式: - 实线 :点线 -. 虚点线 - - 波折线
% 点方式: . 圆点 +加号 * 星号 x x形 o 小圆
% 颜色: y黄; r红; g绿; b蓝; w白; k黑; m紫; c青
分段线性插值
大致思想就是,将相邻两点用直线相连,两点间的函数值用直线方程给出,这种情况下,插值的效果表现很好。
clc
clear
close all
x0=0:20;
y0=sin(x0);
x=0:0.1:20;
y=interp1(x0,y0,x);
plot(x0,y0,'*',x,y)
三次样条插值
具体的,关于这个模型的讲解不多说,太具体的我也讲不明白,数模比赛,知道怎么用就可以~
这种方法相较于分段线性插值,改变了节点处不够光滑的不足。荣国调节多项式的系数,是的分段多项式在每个节点处二阶可导。(二阶可导,注意一下这个)
% 三次样条插值和分段三次埃尔米特插值的对比
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') %标注显示在东南方向,也就是右下
% 说明:
% LEGEND(string1,string2,string3, …)
% 分别将字符串1、字符串2、字符串3……标注到图中,每个字符串对应的图标为画图时的图标。
% ‘Location’用来指定标注显示的位置
% 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-')
几种方法,分段线性插值,Hermite插值,样条插值,都属于是分段类型插值,而拉格朗日和牛顿都属于是一段类型的。
在点数众多,且数据关系并不单一的情况下,我们使用拉格朗日和牛顿插值的时候会产生龙格现象。
插值法特点
用途
根据数据做预测,或者根据局部情况估计整体分布
图形化呈现计算结果
缺点
不能给出明确的函数关系,一般用于对数据的概括性描述,从中发现分布特征