插值算法

数模比赛中,常常需要根据已知函数点进行数据、模型的处理,but现有数据少得可怜,这时就要模拟产生一些靠谱的值来满足需求,这就是插值的作用。

一维插值

即平面中的点,只有

在区间上有定义,且在已知点上的值分别为:

若存在一个简单函数,使

则称的插值函数,点称为插值节点,包含插值节点的区间称为插值区间,求插值函数的方法称之为插值法

不唯一:

多项式插值:若是次数不超过的代数多项式,即,称为多项式插值

分段插值:若为分段多项式,就称为分段插值

三角插值:若为三角多项式,就称为三角插值

多项式插值

定理:

设有个互不相同的节点 ,则存在唯一的多项式使得

证明:

构造方程组:

线性代数解方程: A = \left[ \matrix{ 1 & x_0 & \cdots & x_0^n \\ 1 & x_1 & \cdots & x_1^n \\ \dots \\ 1 & x_n & \cdots & x_n^n } \right]

方程组的矩阵形式如下:

由于所以方程组有唯一解

从而唯一存在

ps:

  • 只要个节点互异,满足上述插值条件的多项式唯一存在
  • 如果不限制多项式次数,插值多项式并不唯一

拉格朗日插值法

  • 两个点&

  • 三个点:&&:

  • n个点:

    其中 &

存在问题:龙格现象

高次插值会产生龙格现象,即在两端波动较大,产生明显的震荡。

在不熟悉曲线运动趋势的情况下,不要轻易的使用高次插值

如何提高插值精度呢 ⬇

分段插值

  • 线性插值:找所求点最近的两点构成直线在此点对应函数值
  • 二次插值:取距最近的三点进行二次插值,即在上取

牛顿插值法

差商为函数的一阶差商

为函数的二阶差商

同理,为函数的k阶差商

与拉格朗日插值法相比,此方法存在继承性。但是也存在龙格现象。

继承性:

每次插值只和前n项有关,只要添加新项,就可以产生新函数。

埃尔米特插值

一般插值问题的要求:

较高要求:

满足节点函数值相等,且对应导数甚至高阶导数也相等的插值多项式就是埃尔米特插值多项式,它更能反映被插值函数的性态

简略版原理

设函数在区间[a,b]有个互异的节点 ,定义在[a,b]上函数在节点上满足:

可唯一确定一个次数不超过的多项式满足:

其余项为:

在实际应用中,往往使用分段三次Hermite插值多项式

% 分段三次埃尔米特插值
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青

样条插值

Matlab有内置函数:

p = spline(x,y,new_x);  %三次样条插值

在点的值为若函数满足下列条件:

  • ,

  • 在每个子区间是三次多项式

  • 上二阶连续可微。

三次样条插值和分段三次埃尔米特插值的对比

 
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维数据插值(了解)

p = interpn(x1,x2,...,xn,y,new_x1,new_x2,...,new_xn,method)

method分为:

  • ‘linear’线性插值(默认)
  • ‘cubic’三次插值
  • ‘spline’三次样条插值(最精准)
  • ‘nearest’最邻近插值算法

不恰当的例子:

% 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-')

拟合算法

与插值问题不同,在拟合问题中不需要曲线一定经过给定的点。拟合问题的目标是寻求一个函数(曲线),使得曲线在某种准则下与所有数据点最为接近,即曲线拟合最好(最小化损失函数)

插值与拟合的区别

样本点过多由于次数过高,造成龙格现象。

尽管我们可以通过分段来避免此现象,但我们更多的时候更倾向于得到一个确定的曲线,即使其不能经过每个样本点,只要误差足够小即可。

最小二乘法

线性代数讲过了QAQ

评价拟合好坏

拟合优度(可决系数)

总体平方和SST(Total sum of squares):

误差平方和SSE(The sum of squares due to error):

回归平方和SSR(Sum of squares of the regression):

证明SST=SSE+SSR

拟合优度:

越接近1,说明误差平方和越接近0,拟合得越好(仅能评价线性函数),与其他函数比较时直接看SSE即可。