数模——插值算法

本文章是学习清风老师数学建模视频后所做的笔记,其中一些图片及代码实现来源于清风老师的B站视频:

【强烈推荐】清风:数学建模算法、编程和写作培训的视频课程以及Matlab等软件教学_哔哩哔哩
_bilibili
https://www.bilibili.com/video/BV1DW411s7wi

目录

算法介绍

一维插值问题

定义

分类

原理

拉格朗日插值法

存在的问题

龙格现象

分段线性插值 — 解决问题的方法

分段二次插值

牛顿插值法

拉格朗日插值与牛顿插值的对比

缺点

埃尔米特插值 Hermite

基本思路

插值原理

※ 分段三次埃尔米特插值

※ 三次样条插值

满足的条件

使用

n 维数据的插值

应用

短期预测


       根据已知的函数点进行数据、模型的处理和分析。当现有数据极少,不足以支撑分析的进行时,需使用数学的方法“模拟产生”一些新的但又比较靠谱的值满足需求,此为插值的作用

算法介绍

一维插值问题

问题如下:已经有 n+1 个节点(xi , yi)( i= 0,1,2,...,n),其中 xi 互不相同

假设 a = x0,求任一插值点 x*(≠xi)处的插值 y*

数模——插值算法_第1张图片

思路:构造函数 y = f(x),使得 f(x) 过所有节点,求 f(x*) 即可得到 y*

定义

设函数 y=f(x) 在区间 [a,b] 上有定义,且已知在点

a = x0

上的值分别为:y0,y1,y2,...,yn

若存在一简单函数 P(x) ,使

P(xi)=yi,(i=0,1,2,...,n)

则称 P(x) 为 f(x) 的插值函数。

x0,x1,x2,...,xn称为插值节点

包含插值节点的区间 [a,b] 称为插值区间

求插值函数 P(x) 的方法称为插值法

分类

  • 插值多项式,P(x) = a0 + a1x +...+anxn,P(x) 是次数不超过 n 的代数多项式
  • 分段插值,P(x) 是分段多项式
  • 三角插值,P(x) 是三角多项式,三角插值一般要用到傅里叶变换等复杂的数学工具

原理

数模——插值算法_第2张图片

数模——插值算法_第3张图片

注意:

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

拉格朗日插值法

在若干个不同的地方得到相应的观测值,拉格朗日插值法可以找到一个多项式,其恰好在各个观察的点取到的观测到的值

数模——插值算法_第4张图片

数模——插值算法_第5张图片

数模——插值算法_第6张图片

数模——插值算法_第7张图片

存在的问题

龙格现象

高次插值会产生龙格现象,即在两端处波动极大,产生明显的震荡。在不熟悉曲线运动趋势的前提下,不要轻易使用高次插值

分段线性插值 — 解决问题的方法

分段低次插值的思路:

  • 插值多项式次数高精度未必显著提高
  • 插值多项式次数越高摄入误差可能显著增大

分段低次插值可以提高插值精度

分段二次插值

选取跟节点 x 最近的三个节点 xi-1,xi,xi+1 进行二次插值,即在每一个区间 [xi-1,xi+1] 上,取:

这种分段的低次插值称为分段二次插值,在几何上就是分段抛物线代替 y=f(x) ,故分段二次插值又称为分段抛物插值

牛顿插值法

数模——插值算法_第8张图片

拉格朗日插值与牛顿插值的对比

与拉格朗日插值法相比,牛顿插值法的计算过程具有继承性【牛顿插值法每次插值只和前 n 项的值有关,这样每次只要在原来的函数上添加新的项,就能够产生新的函数】

缺点
  1. 二者均存在龙格现象的问题
  2. 仅要求插值多项式在插值节点处与被插函数有相等的函数值,不能全面反映被插函数的性态。在许多实际问题中,不仅要求插值函数与被插值函数在所有节点处有相同的函数值,也需要在一个或全部节点上插值多项式与被插函数有相同的低阶甚至高阶的导数值

埃尔米特插值 Hermite

具有节点的导数值约束的插值

基本思路

数模——插值算法_第9张图片

保持插值曲线在节点处有切线(光滑),使插值函数和被插函数的密和程度更好

埃尔米特插值多项式:

  • 节点上的函数值相等
  • 对应的导数值也相等
  • 高阶导数也相等

插值原理

数模——插值算法_第10张图片

※ 分段三次埃尔米特插值

直接使用 Hermite 插值得到的多项式次数较高,也存在龙格现象,故实际应用中,使用分段三次 Hermite 插值多项式 PCHIP

Matlab 有已经封装的函数:

p = pchip(x,y,new_x)

x:已知的样本点的横坐标

y:已知的样本点的纵坐标

new_x:要插入处对应的横坐标

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

※ 三次样条插值

数模——插值算法_第11张图片

满足的条件

数模——插值算法_第12张图片

使用

Matlab 有已经封装的函数:

p = spline(x,y,new_x)

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 维数据的插值

Matlab 有已经封装的函数:

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

x1,x2,...,xn:已知的样本点的横坐标

y:已知的样本点的纵坐标

new_x1,new_x2,...,new_xn:要插入点的横坐标

method:要插值的方法

      • linear:线性插值(默认算法)
      • cubic:三次插值
      • spline:三次样条插值法(最准确)
      • nearset:最邻近插值算法
% 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-')

应用

短期预测

population=[133126,133770,134413,135069,135738,136427,137122,137866,138639, 139538];
year = 2009:2018;
p1 = pchip(year, population, 2019:2021)  %分段三次埃尔米特插值预测
p2 = spline(year, population, 2019:2021) %三次样条插值预测
figure(4); %图像命名
plot(year, population,'o',2019:2021,p1,'r*-',2019:2021,p2,'bx-') %画图
legend('样本点','三次埃尔米特插值预测','三次样条插值预测','Location','SouthEast')

你可能感兴趣的:(数学建模,数学建模)