当前位置: 首页 > news >正文

数学建模笔记(1):插值法

1.插值法的用途

在对数据进行处理的时候,我们往往会碰到由于数据量比较小的情况,这样的情况不利对数据进行分析。插值法就是是针对这种情况,模拟产生和原来数据相近的数据来为数据分析提供完整可靠的数据。

总结:插值法是一种自己生产数据,使原数据完整的方法,同时这些数据和原有的数据是具有相同规律的。

2.插值法的实现方法

插值法总体来讲就是我们高中导数中学过的拟合方法。在二维平面上,已知存在横坐标为x_{1},x_{2}...x_{n},纵坐标为y_{1},y_{2}...y_{n}的n个函数值,插值法的目标就是找到一个函数f(x),使得任意f(x_{i})=y_{i}。这个过程其实本质上就是找一个拟合函数来是所有点都落在这个拟合函数上。

常见的插值方法有:

  • 多项式拟合,使用一个多项式a_0+a_1x+a_2x^2+...+a_nx^n来对所有的函数点进行拟合。
  • 分段插值,将所有函数点分为几段,每一段采用一个多项式进行拟合。
  • 三角插值,比较复杂,多项式为三角多项式(即x替换为\sin x或者\cos x),与傅里叶变换有关。

一般在比赛中,前两种方法使用的更多,尤其是第二种。 

两点注意,证明唯一性的过程在此省略,第二点也很好理解,次数的高低影响的是拟合的效果。

获得多项式函数的方法

拉格朗日插值法

具体的公式如下:

f(x) = \sum_{i=0}^{n} f(x_i) \cdot l_i(x)

l_i(x) = \prod_{\substack{j=0 \\ j \neq i}}^{n} \frac{x - x_j}{x_i - x_j} 

其中的f(x)就是插值函数,在已知n个函数点的情况下,根据这n个点推导出插值函数的方法。 

但是拉格朗日插值法的问题在于,当我们尝试仅仅是用一个多项式对所有函数点进行拟合,随着多项式最高次数的增大,拟合的效果随着自变量的增大可能会出现较大的波动,与实际的趋势相差较大。

如下图所示,高次多项式在原点处的拟合效果尚可,但是当自变量增大时,误差就会很大了。

因此,我们需要效果更好,更加稳定的方法来进行插值。

分段插值法 

顾名思义,即将已知的函数点进行划分,当我们想要获得某一个未知横坐标下的函数值,我们可以选取距离该点最近的两个点或者三个点,构造两点之间的线性函数或者三点之间的二次函数(抛物线)进行插值。

分段二次插值的公式如下:

牛顿插值法

牛顿插值法的概念如下,系数是一个叫做差商的东西。

差商的定义如下,可以看到,差商的计算是一个递归的形式,k阶差商是由两个k-1阶差商构造而成的,一阶差商是不是很像没取极限的导数的定义?

最终整体公式的表现形式为

牛顿插值法相对于拉格朗日插值的优势在于,牛顿插值法的结果可以通过递归产生,因此每多增加一个点, 通过前面的函数递归即可完成,比拉格朗日更加简单。但是牛顿插值法也存在之前所说的震荡不稳定的问题,所以用处也不大。

Hermite插值法

上述的插值法其实仅仅考虑了插值函数在函数点处的函数值相等的问题,但是拟合效果的好坏还和函数的趋势(形态)有关,这就涉及函数的导数问题。因此Hermite插值法是想要获得更高精度的插值的很好选择。

Hermite多项式的定义如下

 Hermite多项式的计算方法:

Hermite插值通过构造高阶连续的插值多项式,要求函数值,导数值,甚至更高阶导数值相同使得插值结果更加平滑且精确。

三次分段埃尔米特插值法(最常用,MatLab中有直接的函数可用)

具体原理远离在这里不进行详细的描述,这个方法在matlab中有直接的函数pchip可以使用,这里就简单介绍一下pchip的使用方法。下面是一个简单示例。

其中,x代表已知的函数点的横坐标数组,y代表已知函数点的纵坐标数组,new_x代表需要进行插值的点的横坐标,new_y代表插值获得的纵坐标。pchip函数最终返回的是new_y这个纵坐标。

plot函数是绘图函数,他的传参形式可以总结为:需要进行绘制的点的横坐标+纵坐标+绘制形式(以字符串形式),可以绘制多个,如上,只需格式一样即可。

下面是plot函数中的绘制形式的总结,绘制形式可以进行组合,每个字符都代表一个类型的一种。在实例中,前一个使用的圆点的格式,后一个使用的是红色实线的格式。

最后的语句figure是用来给图片进行编号的。目的是防止当一个代码中出现了多个绘图的时候,如果不编号会进行覆盖。

最终的插值结果如下,可以看到插值的结果还是比较贴近原函数的。

三次样条插值(比上一个方法更加精确,也比较常用)

三次样条插值相比于上一个方法的精确之处在于,他要求插值函数在整个插值区间上二阶连续可微,在每个分段区间的端点处都要满足以下条件:

同样,matlab也提供了这个方法的实现函数spline,下面是简单示例和结果,和原来的sinx函数的贴合程度比较高。

当然,三次样条插值方法还可以用interpn加上方法类型的参数来实现。spline(x,y,new_x)等价于interpn(x,y,new_x,'spline');

n维数据的插值(少用)

上面的都是在一维数据的层面上进行,如果数据有多个维度,可以使用上面的interpn函数来进行插值。

格式为:Vq = interpn(X1, X2, ..., Xn, V, Xq1, Xq2, ..., Xqn);

x1,xn代表已知的点在各个维度上的分量值的序列,可以理解为不同的自变量的值;

V代表的是这些点的纵坐标(广义上的),维度与前边的x中的数据数量一样,可以理解为因变量的值。

xq则是最终要插值的序列,最终返回插值获得的因变量的序列。

其他还有一些有关绘图的技巧,我就不在这里介绍了。总结一下,常见的插值方法就是三次埃尔米特方法和三次样条插值,并且在matlab中都有对应函数可以直接实现,总体来说难度不大。

插值的应用场景,可以在数据的预处理阶段对数据进行补齐,也可以使用插值函数进行预测,插值的用处还是很多的。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 计算机毕业设计 医院问诊系统 Java+SpringBoot+Vue 前后端分离 文档报告 代码讲解 安装调试
  • maven打包jar后运行提示“没有主清单属性”问题的几种解决方案
  • 24/8/17算法笔记 DDPG算法
  • spark-sgg-java
  • 已解决Exception in thread “main“ java.lang.NullPointerException
  • 【数据结构题集(c语言版)】魔王语言解释 题解(字符串+栈)
  • 【JavaEE】文件操作
  • Shell——流程控制语句(if、case、for、while等)
  • SQLALchemy ORM 的关联关系之 ORM 中的一对一
  • 2024.8.17
  • 基于DPU云盘挂载的Spark优化解决方案
  • 【Linux网络】高级 I/O
  • 电脑监控怎样看回放视频?一键解锁电脑监控回放,守护安全不留死角!高效员工电脑监控,回放视频随时查!
  • mysql主从复制同步、mysql5.7版本安装配置、python操作mysql数据库、mycat读写分离实现
  • P2016 战略游戏
  • 〔开发系列〕一次关于小程序开发的深度总结
  • Angular 响应式表单 基础例子
  •  D - 粉碎叛乱F - 其他起义
  • Docker 1.12实践:Docker Service、Stack与分布式应用捆绑包
  • JavaScript HTML DOM
  • JavaScript标准库系列——Math对象和Date对象(二)
  • js操作时间(持续更新)
  • October CMS - 快速入门 9 Images And Galleries
  • Python学习笔记 字符串拼接
  • SQLServer之索引简介
  • Twitter赢在开放,三年创造奇迹
  • 从tcpdump抓包看TCP/IP协议
  • 基于MaxCompute打造轻盈的人人车移动端数据平台
  • 类orAPI - 收藏集 - 掘金
  • 聊聊flink的TableFactory
  • 聊聊spring cloud的LoadBalancerAutoConfiguration
  • 漂亮刷新控件-iOS
  • ​ 轻量应用服务器:亚马逊云科技打造全球领先的云计算解决方案
  • ​【C语言】长篇详解,字符系列篇3-----strstr,strtok,strerror字符串函数的使用【图文详解​】
  • ​【原创】基于SSM的酒店预约管理系统(酒店管理系统毕业设计)
  • ## 1.3.Git命令
  • ###C语言程序设计-----C语言学习(6)#
  • #控制台大学课堂点名问题_课堂随机点名
  • (4) PIVOT 和 UPIVOT 的使用
  • (delphi11最新学习资料) Object Pascal 学习笔记---第8章第2节(共同的基类)
  • (MTK)java文件添加简单接口并配置相应的SELinux avc 权限笔记2
  • (附源码)springboot电竞专题网站 毕业设计 641314
  • (附源码)计算机毕业设计ssm电影分享网站
  • (黑马C++)L06 重载与继承
  • (论文阅读26/100)Weakly-supervised learning with convolutional neural networks
  • (一)eclipse Dynamic web project 工程目录以及文件路径问题
  • (游戏设计草稿) 《外卖员模拟器》 (3D 科幻 角色扮演 开放世界 AI VR)
  • (转)mysql使用Navicat 导出和导入数据库
  • (自用)网络编程
  • ./indexer: error while loading shared libraries: libmysqlclient.so.18: cannot open shared object fil
  • .bat批处理(七):PC端从手机内复制文件到本地
  • .NET : 在VS2008中计算代码度量值
  • .net core 微服务_.NET Core 3.0中用 Code-First 方式创建 gRPC 服务与客户端
  • .NET Framework Client Profile - a Subset of the .NET Framework Redistribution
  • .NET 回调、接口回调、 委托