清风数学建模——插值算法

插值法

文章目录

  • 插值法
      • 作用
      • 定义
      • 概念
      • 一维插值问题
      • 一维插值多项式原理
        • 定理
      • 拉格朗日插值法和牛顿插值法
      • 埃尔米特插值
      • 分段线性插值
      • 分段三次埃尔米特插值法代码
      • 三次样条插值及其代码
      • 例子
      • n维数据的插值(了解)

作用

数模比赛中,常常需要根据已知的函数点进行数据、模型的处理和分析,但可能出现数据极少或者数据缺失的情况,此时数据并不能支撑分析,这时候就需要用到一些数学的方法,去模拟产生一些新的但又比较靠谱的值来满足数据的需求。以上提到正是插值法的作用

定义

设函数y=f(x)在区间[a,b]上有定义,且已知在点
a < = x 0 < x 1 < . . . < x n < = b a<=x_0<x_1<...<x_n<=b a<=x0<x1<...<xn<=b
上的值分别为:
y 0 , y 1 , . . . < y n y_0,y_1,...<y_n y0,y1,...<yn
若存在一简单函数P(x),使得
P ( x i ) = y i ( i = 0 , 1 , 2 , . . . , n ) P(x_i)=y_i (i=0,1,2,...,n) P(xi)=yi(i=0,1,2,...,n)
则称P(x)为f(x)的插值函数,点x0,x1,…,xn称为插值节点,包括插值节点的区间[a,b]称为插值区间,求插值函数P(x)的方法称为插值法。

概念

常用的三种插值法的概念

  1. 插值多项式。若P(x)是次数不超过n的代数多项式,即

P ( x ) = a 0 + a 1 x + . . . + a n x n , P(x)=a_0+a_1x+...+a_nx^n, P(x)=a0+a1x+...+anxn,

  1. 若P(x)为分断多项式,就称分段插值
  2. 若P(x)为三角多项式,就称三角插值

本文只介绍多项式插值和分段插值。

一维插值问题

image-20230807212542148

  • 已知一些数据xi,yi,这些数据能够模拟出一个f(x)函数(图像)。通过将新的数据x* 带入f(x)函数中求得y*

一维插值多项式原理

定理

image-20230808110433502

image-20230808110445329

  • 已知矩阵X和矩阵Y都是可逆矩阵,那么AX=Y可以化成A=YX-。那么若矩阵A的行列式不为0,则方程组有唯一解
  • 行列式可以用范德蒙德行列式法计算
  • 若方程组有唯一解,那么多项式确定唯一存在

拉格朗日插值法和牛顿插值法

image-20230808114135919

image-20230808112027598

红色是目标函数,蓝色是通过拉格朗日插值法模拟出来的函数图像。可以看到在次数增多时,两端图像产生明显的震荡。

  • 多项式插值中常用的有拉格朗日插值法。但该方法在高次插值时会出现两端波动极大,产生明显的震荡,即产生龙格现象。因此不熟悉曲线运动趋势的前提下,不要轻易使用高次插值。加上函数难以使用,因此在数模比赛里多项式插值也很少使用

image-20230808114246325

  • 牛顿插值法每次只需要在前n项的基础上,即原来的函数上添加新的项就能产生新的函数,与拉格朗日插值法相比,牛顿插值法计算过程具有继承性。
  • 但牛顿插值法也存在龙格现象问题。

总结一下:

  • 插值多项式次数越高,精度未必显著提高
  • 插值多项式次数越高,摄入误差可能显著增大
  • 实际上不仅要求插值函数与被插值函数在所有节点处有相同的函数值,它也需要在一个或全部节点上插值多项式与被插函数有相同的低阶甚至高阶的导数值。因此这种插值多项式并不能全面反映被插值函数的性态

基于插值多项式的缺点,在数模比赛中通常会使用分段插值法

埃尔米特插值

image-20230808114542143

  • 直接使用Hermite插值得到的多项式次数较高,也存在龙格现象,因此实际应用重往往使用分段三次Hermite插值多项式(PCHIP)

分段线性插值

image-20230808113318767

若新插入的值xi位于xj-1到xj之间,那么只需要模拟出xj-1到xj之间的插值函数即可。

分段三次埃尔米特插值法代码

Matlab有内置的函数,其实现过程已经帮我们封装好了,会调用就行了

函数原型

p=pchip(x,new_x)

x是已知的样本点的横坐标;y是已知的样本点的纵坐标;new_x是要插入对应的点的横坐标,通过pchip函数模拟出new_x对应的纵坐标

假设x的范围是[-pi,pi];y=sin(x);new_x=-pi:0.1:pi(从-pi到pi间隔0.1一个横坐标)

那么可以这样调用

x=-pi:pi;
y=sin(x);
new_x=-pi:0.1:pi;
p=pchip(x,y,new_x);%%p是通过Hermite插值法模拟出来的对应new_x的纵坐标
plot(x,y,'o',new_x,p,'r-');
legend('样本点','三次埃尔米特插值','Location','southeast');

image-20230808122831263

可以看到样本点函数对应的是o点图,而埃尔米特插值法模拟出来的函数图像是红色-线

三次样条插值及其代码

image-20230808123117149

  • 三次样条插值的matlab内置函数是

    p = spline (x,y, new_x)
    
  • x是已知的样本点的横坐标;y是已知的样本点的纵坐标;new_x是要插入处对应的横坐标

同样的用三次样条插值法模拟出来new_x对应的图像

x=-pi:pi;
y=sin(x);
new_x=-pi:0.1:pi;
p1=pchip(x,y,new_x);%%p是通过Hermite插值法模拟出来的对应new_x的纵坐标
p2=spline(x,y,new_x);
plot(x,y,'r-',new_x,p1,'b.',new_x,p2,'g*');legend('样本点','三次埃尔米特插值','三次样条插值','Location','southeast');

image-20230808130016365

可以看出,三次样条生成的曲线更加光滑。在实际建模中, 由于我们不知道数据的生成过程,因此这两种插值都可以使用

例子

先有2009到2018的中国人口数,通过三次埃尔米特插值预测或三次样条插值预测预测出2019到2023的中国人口数

year=2009:2018;
population=[133126,133770,134413,135069,135738,136427,137122,137866,138639, 139538];
p1=pchip(year,population,2019:2023);
p2=spline(year,population,2019:2023);
plot(year,population,'r-',2019:2023,p1,'b.',2019:2023,p2,'g*');
legend('样本点','三次埃尔米特插值预测','三次样条插值预测','Location','SouthEast')

image-20230808132427804

另外若需要作出两张图形,需要在作图前标明是第几张图,否则系统判定是只在 figure(1)上作图,后来的图像会将前面的图像刷新掉

image-20230808132908820

n维数据的插值(了解)

函数原型

p=interpn(x1,x2,...,xn,y,new_x1,new_x2,...,new_xn,method)
  • x1,x2,…,xn是已知的样本点的横坐标
  • y是已知的样本点的纵坐标
  • new_x1,new_x2,…,new_xn是要插入点的横坐标
  • method是要插值的方法
    • ‘spline’:三次样条插值法;(最为精准)
    • ‘pchip’:三次埃尔米特插值法
    • ‘linear’:线性插值(默认算法)
    • ‘cubic’:三次插值
    • ‘nearest’:最邻近插值算法
x=-pi:pi;
y=sin(x);
new_x=-pi:0.1:pi;
p2=spline(x,y,new_x);

等价于

x=-pi:pi;
y=sin(x);
new_x=-pi:0.1:pi;
p2=interpn(x,y,new_x,'spline');
  • ‘nearest’:最邻近插值算法
x=-pi:pi;
y=sin(x);
new_x=-pi:0.1:pi;
p2=spline(x,y,new_x);

等价于

x=-pi:pi;
y=sin(x);
new_x=-pi:0.1:pi;
p2=interpn(x,y,new_x,'spline');

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/82647.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Git从远程仓库中删除文件,并上传新文件

目录 删除&#xff1a; 拉取远程分支的更新&#xff1a; ​编辑 首先查看git状态&#xff1a; ​编辑 删除文件并提交版本库&#xff1a; 提交&#xff1a; 上传新文件&#xff1a; 首先查看git状态&#xff1a; 提交到暂存区&#xff1a; 提交到版本库&#xff1a; 上…

【分布式系统】前言

争取写一下阅读笔记&#xff0c;更新有关分布式系统的一切&#xff0c;先开个坑。 现在的心得如下&#xff1a; 不知道啥时候能破解哈&#xff5e;&#xff5e; 内容包括部分6.824 读的论文 DDIA&#xff1a; DDIA mapreduce GFS VMwareFT Raft zookeeper chain replication…

聊聊springcloud如何与k8s configMap整合实现配置动态刷新

前言 配置中心在微服务的服务治理场景基本上是属于标配&#xff0c;常见可以用来做配置中心有nacos、apollo、zookeeper、springcloud config、consul、etcd、redis、disconf、dimond、xxl-conf等。这些组件的特点都是需要安装&#xff0c;如果大家的部署环境中有用到k8s&…

【沁恒蓝牙mesh】CH58x USB功能开发记录(三)

本博文主要记录 &#xff0c;【沁恒蓝牙mesh】CH58x USB功能开发记录&#xff08;三&#xff09;&#xff0c;数据收发基于寄存器级别解释 &#x1f496; 作者简介&#xff1a;大家好&#xff0c;我是喜欢记录零碎知识点的小菜鸟。&#x1f60e;&#x1f4dd; 个人主页&#xf…

使用Vue+CSS实现汉堡图标过渡为叉号图标,有点意思

前言 本文给大家分享三个具有过渡效果的汉堡图标&#xff0c;当点击汉堡图标时&#xff0c;过渡为叉号图标。这种具有过渡特效的图标挺炫酷的&#xff0c;感觉一下子给网页增加一点新颖特色。早在2015年左右&#xff0c;国外挺多优秀门户网站都有使用类似的图标&#xff0c;那…

Spring中的事务

一、为什么需要事务&#xff1f; 事务定义 将一组操作封装成一个执行单元&#xff08;封装到一起&#xff09;&#xff0c;要么全部成功&#xff0c;要么全部失败。 为什么要用事务&#xff1f; 比如转账分为两个操作&#xff1a; 第一步操作&#xff1a; A 账户 -100 元…

使用openapi-generator-cli时遇到了代理的问题

前言&#xff1a;最近在捣鼓一个开源的管理kafka的web版&#xff0c;名字叫kafka-ui。准备部署到本地&#xff0c;方便平时遇到问题时&#xff0c;查看kafka的情况。开源项目github地址&#xff1a;点这里 。拿到这个项目&#xff0c;折腾了几天&#xff0c;今天终于编译成功了…

图片如何转pdf?几个小妙招了解一下

图片如何转pdf&#xff1f;在日常工作和生活中&#xff0c;我们经常需要将图片转换成PDF格式&#xff0c;以便于我们进行存档、传输或打印。那么&#xff0c;如何快速、方便地将图片转换成PDF呢&#xff1f;这里介绍就为大家介绍几款好用的工具。 我们可以使用【迅捷PDF转换器】…

语音信号的A律压缩和u律压缩matlab仿真

目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 4.1 A律压缩算法 4.2 μ律压缩算法 5.算法完整程序工程 1.算法运行效果图预览 2.算法运行软件版本 MATLAB2022a 3.部分核心程序 clc; clear; close all; warning off; addpath(genpath(…

git的日常使用

加入忽略列表&#xff1a;在.gitignore中加入忽略的文件&#xff0c;build/ 表示build文件夹下&#xff0c;*.jar 表示以jar结尾的&#xff0c;用换行符隔开将另一个分支合并到当前分支&#xff1a;git merge xxx冲突出现&#xff0c;可以看看这里&#xff1a;详解Git合并冲突—…

[K8S:命令执行:权限异常:解决篇]:通过更新kubeconfig配置相关信息

文章目录 一&#xff1a;场景复现&#xff1a;1.1&#xff1a;关键信息&#xff1a;1.2&#xff1a;全异常日志输出&#xff1a; 二&#xff1a;解决流程&#xff1a;2.1&#xff1a;更新 kubeconfig&#xff1a;2.1.1&#xff1a;执行命令&#xff1a; 2.2&#xff1a;再次执行…

go-zero 是如何实现计数器限流的?

原文链接&#xff1a; 如何实现计数器限流&#xff1f; 上一篇文章 go-zero 是如何做路由管理的&#xff1f; 介绍了路由管理&#xff0c;这篇文章来说说限流&#xff0c;主要介绍计数器限流算法&#xff0c;具体的代码实现&#xff0c;我们还是来分析微服务框架 go-zero 的源…

canvas实现代码雨

学习抖音&#xff1a; 渡一前端必修课 效果图&#xff1a; 全部代码&#xff1a; <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" content"IEedge">&…

模拟实现消息队列

目录 1. 需求分析1.1 介绍一些核心概念核心概念1核心概念2 1.2 消息队列服务器&#xff08;Broker Server&#xff09;要提供的核心 API1.3 交换机类型1.3.1 类型介绍1.3.2 转发规则&#xff1a; 1.4 持久化1.5 关于网络通信1.5.1 客户端与服务器提供的对应方法1.5.2 客户端额外…

并发——什么是线程死锁?如何避免死锁?

文章目录 1. 认识线程死锁2. 如何避免线程死锁? 1. 认识线程死锁 线程死锁描述的是这样一种情况&#xff1a;多个线程同时被阻塞&#xff0c;它们中的一个或者全部都在等待某个资源被释放。由于线程被无限期地阻塞&#xff0c;因此程序不可能正常终止。 如下图所示&#xff…

个人对智能家居平台选择的思考

本人之前开发过不少MicroPython程序&#xff0c;其中涉及到自动化以及局域网控制思路&#xff0c;也可以作为智能家居的实现方式。而NodeMCUESPHome的方案具有方便添加硬件、容易更新程序和容量占用小的优势&#xff0c;本人也查看过相关教程后感觉部署ESPHome和编译固件的步骤…

生成树协议

文章目录 STP冗余交换网络为什么存在广播风暴&#xff1f;广播的危害&#xff1f;交换环路的危害&#xff1f; 工作机制BPDU什么是最好的bpduBPDU触发机制 STP选举步骤配置协议分析字段分析开销模式端口状态 故障类型根桥故障直连故障间接故障 &#xff08;链路中间可能有HUB&a…

# Linux下最好用的歌词工具:OSD Lyrics安装使用指引

Linux下最好用的歌词工具&#xff1a;OSD Lyrics安装使用指引 文章目录 Linux下最好用的歌词工具&#xff1a;OSD Lyrics安装使用指引1 安装1.1 直接安装1.2 源码安装 2 错误解决3 快捷方式与软件设置&#xff08;很重要&#xff09;4 首选项相关界面5 最后 OSD Lyrics 是一个桌…

人工智能、BIM技术、机器学习在智慧工地的应用

人工智能、BIM技术、机器学习在智慧工地的应用 智慧工地云平台是专为建筑施工领域所打造的一体化信息管理平台。通过大数据、云计算、人工智能、BIM、物联网和移动互联网等高科技技术手段&#xff0c;将施工区域各系统数据汇总&#xff0c;建立可视化数字工地。同时&#xff0…

第一百二十五天学习记录:C++提高:STL-deque容器(下)(黑马教学视频)

deque插入和删除 功能描述&#xff1a; 向deque容器中插入和删除数据 函数原型&#xff1a; 两端插入操作&#xff1a; push_back(elem); //在容器尾部添加一个数据 push_front(elem); //在容器头部插入一个数据 pop_back(); //删除容器最后一个数据 pop_front(); //删除容器…