本文章是学习清风老师数学建模视频后所做的笔记,其中一些图片及代码实现来源于清风老师的B站视频:
【强烈推荐】清风:数学建模算法、编程和写作培训的视频课程以及Matlab等软件教学_哔哩哔哩
_bilibili
https://www.bilibili.com/video/BV1DW411s7wi
目录
算法介绍
一维插值问题
定义
分类
原理
拉格朗日插值法
存在的问题
龙格现象
分段线性插值 — 解决问题的方法
分段二次插值
牛顿插值法
拉格朗日插值与牛顿插值的对比
缺点
埃尔米特插值 Hermite
基本思路
插值原理
※ 分段三次埃尔米特插值
※ 三次样条插值
满足的条件
使用
n 维数据的插值
应用
短期预测
根据已知的函数点进行数据、模型的处理和分析。当现有数据极少,不足以支撑分析的进行时,需使用数学的方法“模拟产生”一些新的但又比较靠谱的值满足需求,此为插值的作用
问题如下:已经有 n+1 个节点(xi , yi)( i= 0,1,2,...,n),其中 xi 互不相同
假设 a = x0
思路:构造函数 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 的代数多项式注意:
在若干个不同的地方得到相应的观测值,拉格朗日插值法可以找到一个多项式,其恰好在各个观察的点取到的观测到的值
高次插值会产生龙格现象,即在两端处波动极大,产生明显的震荡。在不熟悉曲线运动趋势的前提下,不要轻易使用高次插值
分段低次插值的思路:
分段低次插值可以提高插值精度
选取跟节点 x 最近的三个节点 xi-1,xi,xi+1 进行二次插值,即在每一个区间 [xi-1,xi+1]
上,取:
这种分段的低次插值称为分段二次插值,在几何上就是分段抛物线代替 y=f(x)
,故分段二次插值又称为分段抛物插值
与拉格朗日插值法相比,牛顿插值法的计算过程具有继承性【牛顿插值法每次插值只和前 n 项的值有关,这样每次只要在原来的函数上添加新的项,就能够产生新的函数】
具有节点的导数值约束的插值
保持插值曲线在节点处有切线(光滑),使插值函数和被插函数的密和程度更好
埃尔米特插值多项式:
直接使用 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青
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’用来指定标注显示的位置
三次样条生成的曲线更加光滑,在实际建模中,由于不知道数据的生成过程,故两种插值都可以使用
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:要插值的方法
% 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')