python三次样条插值拟合的树行线_数学建模笔记——插值拟合模型(一)

啊好像距离上次写作又过了七天,啊好像我之前计划的一周两三篇,啊辣鸡小说毁我青春,啊我是一只可怜的鸽子。

不管怎样,我又回来了,并坚定地更新着hhh。再过两三天就是我们学校数学建模选拔,再过八九天就是期末考试。所以这两天还是一样,写勤快一点儿,之后可能时不时就要断更一周了,八月十九最后一门考完后才能继续安安稳稳地写文章了。没办法,这个暑假实在是不够舒心。

好的,今天我来谈一谈插值和拟合。插值和拟合是两种不同的数值计算方法,分别又有着许多不同的插值算法和拟合算法。在我学习的《数值计算》课中,这两部分好像是讲了三四节课。因为课堂教学的时候,需要对各种算法进行严格的证明和数学推导。

限于篇幅以及个人能力的原因,本文不涉及太多的数学证明与推导(好吧,基本上不推导)。事实上许多经典的建模教材,也不怎么进行推导,主要还是着重于介绍与应用。因此想要对插值和拟合进行深入了解的同学,欢迎自学《数值计算》类课程。

插值

首先谈一谈插值。为什么需要插值呢?因为在许多的实际问题中,我们想要研究一个变量相对于另一个变量的关系,往往只能通过观测得出一组一组的值。而两个变量之间的函数关系,我们往往是难以通过某种解析式或者某种图像来表达的。也就是说,我们只有一组一组的数据,压根不晓得变量之间具体的函数关系。

这就带来了一个难题。举个例子,假设我们观测的是“离海岸距离”与“海水深度”的关系。现在我们将海岸线的位置作为0,每隔50米或者100米测量一次海水的深度,便得到了许多组数据。那现在的问题就是,如果我们想知道距离海岸线326米处的海水深度,怎么求呢?

嗯,最简单的方法就是跑到326米的位置测量一下啦。这确实是最为准确的方法。但是如果有许许多多的点都有待测量,考虑到时间以及其他成本,一个一个测量可能不太现实。因此,我们需要不同的方法来解决这类问题。即已知在之间一些点所对应的值:,我们想要求出节点之间某个位置的函数值。插值就是解决这类问题的一个合适的方法。

插值是什么呢?很简单,插值就是找到一个比较简单的函数,满足,之后使用这个函数来求得之间某个位置的函数值。也就是找一个函数来代替,作为的一个合理近似。

首先举个例子。cf86ebba7622fef30634dda0c57791f6.png

上图是我取出了函数中的7个点。现在假装我们不知道这是个正弦函数,我们只知道这7个点的坐标,那如何求得的函数值呢?求是求不出来的,不知道函数怎么可能求得出来,但我们可以使用插值求一个近似的解。

一种很简单的想法就是分段线性插值,即将相邻的两个点之间用直线进行连接。这种方法应该很容易理解。我们期望用简单的函数来代替,最简单的一种函数应该就是线性函数了吧。嗯,进行一下插值。

d2c609808512f7cd75135dab9a18e688.png

诺,这就是分段线性插值的结果。假如我们现在想要求出时的值,就比较简单。将和这两点之间的直线方程解出来,再把代入,就ok了。

可以看到,上述的插值方法太过简单了,很可能与实际曲线不太相符。在实际问题中,也很少有这种纯线性的的函数关系。因此我们可以使用一些较高阶的多项式进行插值,例如分段三次Hermite插值。直接看看结果。

25d93e9a72962deb8c3969fd1a878e7f.png

是不是感觉光滑了很多?其实还可以更加光滑一点,我们使用三次样条插值试一试。也是直接放结果。

f4dc72eb2a030eda5282b7df6c85b670.png

最后我们把上面提到的三种插值以及原函数放在一起看看结果。

b6c3e9b71ca479e0f197f132a04c5cf8.png

可以看到,三次样条插值最接近原曲线,分段线性插值与原曲线相差最远。这是不是说明三次样条插值一定优于三次Hermite插值与线性插值呢?当然不是,具体的问题还是要具体分析。如果两个变量之间的线性相关性高达99%了,那何必还要进行三次插值呢?不过自然界以及工业界的多种曲线,往往都是较为光滑的,因此我们使用三次样条插值函数较多。

上面只是一个简单的例子,让大家对于插值有一个较为直观的印象。其实很简单,就是找到一个函数,要求该函数曲线必须经过已知点,之后再使用这样一个函数代替原函数,求出某个位置对应的函数值,用这个近似值来代表真实值。接下来简单介绍几种插值算法以及在matlab中的相应函数。

插值的算法还挺多的,例如拉格朗日插值,牛顿插值,最邻近插值等等。不过这里我就介绍比较常用的插值方法,也就是上面提到的分段线性插值,分段三次Hermite插值以及三次样条插值。这三种插值方法有一个共同的特点,即它们是在给定点的每一个小段都确定一个函数表达式,叠加起来作为最终的表达式。嗯,也就是说这是一个分段函数,在之间求一个函数,在求一个函数,依次类推……

为什么不求出一个单一的函数表达式呢?因为当插值点越多,我们不进行分段时,最终得出来的函数的次数越高,而高次多项式会在插值的区间内发生严重的震荡现象,称之为“龙格现象”。因此我们往往更倾向于使用分段低次多项式来近似原函数。拉格朗日插值以及牛顿插值,最终都是求出一个函数,因此这里不予介绍,有兴趣可以自行了解。嗯,下图是展示龙格现象的一张图。其中黑色实线代表原函数,n代表插值多项式的次数,显而易见,次数越高时,震荡越明显。想要深入了解请自行学习相关内容。

66d81541403d45acb75c0b62e3529d93.png

分段线性插值

分段线性插值不必多说了,很简单,就是在相邻的区间内,用直线来近似原函数。用分段线性插值计算点的近似函数值时,只用到左右的两个节点,与其他节点无关。当然啦,越大,分段越多,插值的误差也就越小。实际使用中往往用来计算数学、物理中的特殊函数表,数理统计中的概率分布表等等。在建模过程中,也可以用来进行缺失数据的填补。

matlab中,插值使用到的函数是函数,最后一个是数字不是字母。代表着一维数据。2c45d3ee0ec59d661f09024a43ebe903.png

通过help命令,我们可以看到interp1的使用形式。点击下方“interp1的参考页”,可以进入该函数的帮助文档页面。vq = interp1(x,v,xq,method)中,向量 x 包含样本点,v 包含对应值 v(x)。向量 xq 包含查询点的坐标,vq则返回相应的插值结果。method指定插值方法,如'linear'、'nearest'、'next'、'previous'、 'spline'。默认方法为 'linear'。因此,如果我们想要进行线性插值就很简单,代码如下。

x = 0:2*pi;  %生成[0,2*pi]之间的整数值
y = sin(x);  %生成相应的函数值
plot(x,y,"or");%绘制一下点
xx = 0:0.01:2*pi;%这个是查询点的坐标向量
yy = interp1(x,y,xx,'linear');  %yy就是查询点向量对应的函数值向量了
plot(x,y,"o",xx,yy,"r");%画图画图

xx=1.23;%只查询一个元素也是可以的
yy = interp1(x,y,xx,'linear');%嗯,还是这样
plot(x,y,"o",xx,yy,"or");%画图画图
fb3bad27b86105976747a058d815065d.png

嗯嗯,很简单是吧。对了,线性插值至少需要两个点。我们也可以看到线性插值有一个很明显的缺点,不够光滑。没办法,毕竟是直线。

分段三次Hermite(埃尔米特)插值

分段三次埃尔米特插值比分段线性插值对数据的要求更高一点儿。假设是[a,b]之间的互异节点,且。嗯,也就是我们不仅要知道处对应的函数值,我们也需要知道处对应的函数导数值。

因此我们对相应的插值函数有以下三个要求:

  1. 在上一阶可导;
  2. 在每个上都是三次函数。

满足以上三个条件的插值函数,我们称之为分段三次埃尔米特插值函数。

可以发现,三次埃尔米特插值相较于线性插值有两个特点。一是它不仅要求插值函数过相应的已知点,还要求函数曲线在已知点处一阶导数值等于原函数的导数值,这也是为什么三次埃尔米特在已知点处更为平滑,且与原曲线更为相近。二是它使用三次多项式作为每一个小段的插值多项式,相对于线性函数,三次多项式更为平滑。综上,三次埃尔米特插值相对于线性插值,得到的函数曲线更为平滑且接近原曲线。

matlab之中用于三次埃尔米特插值的函数是,当然也可以使用上面提到的加上参数。fd9d55b6ca3ed68cb0d60fd16b836d58.png

x = 0:2*pi;  %生成[0,2*pi]之间的整数值
y = sin(x);  %生成相应的函数值
plot(x,y,"or");%绘制一下点
xx = 0:0.01:2*pi;%这个是查询点的坐标向量
yy = interp1(x,y,xx,'pchip');  %yy就是查询点向量对应的函数值向量了,注意最后的参数
plot(x,y,"o",xx,yy,"r");%画图画图

xx=1.23;%只查询一个元素也是可以的
yy = pchip(x,y,xx);%嗯,也可以这样
plot(x,y,"o",xx,yy,"or");%画图画图

对了,三次埃尔米特插值函数在matlab中使用时,最少需要四个插值点。

三次样条插值

所谓样条曲线,就是把一根具有弹性的细长木条(样条)在几个样点处用压铁压住,其余位置自由弯曲。这样子,由样条形成的曲线就称之为样条曲线。样条曲线实际上是由分段三次曲线连接而成,且在连接点处具有连续的二阶导数,从数学上加以概括就得到三次样条的概念。

三次样条函数相对于三次埃尔米特插值,又增加了一些条件。假设三次样条函数。那它除了满足,也就是经过已知点之外,还需要满足,也就是每一段的端点重合。

除此之外,还需要满足,也就是在端点处一阶光滑。以及,也就是端点处二阶光滑。我们可以看出,相对于埃尔米特插值,不仅有一阶导数的要求,也有二阶导数的要求。因此相对于埃尔米特插值,样条插值得到的曲线更加光滑。

以上这些等式条件,提供了个方程(可以自己数数),但如果我们需要个三次多项式,就需要解出个未知数,也就是需要个方程。剩下的两个方程,我们称之为边界条件。

边界条件主要有三类:

  1. 第一类边界条件:给定函数在端点处的一阶导数,即。
  2. 第二类边界条件:给定函数在端点处的二阶导数,即。当时,该条件称之为自然边界条件。
  3. 第三类边界条件:若是一个周期函数,且是一个周期,则要求也是一个周期函数,满足。

在matlab中,如果三次样条插值没有边界条件,最常用的方法就是采用非结终止条件进行插值。该条件要求第一个和第二个三次多项式的三阶导数相同,以及倒数第一个和倒数第二个三次多项式的三阶导数值相同。使用的函数可以是,也可以是。同样的,至少要求四个点已知。

x = 0:2*pi;  %生成[0,2*pi]之间的整数值
y = sin(x);  %生成相应的函数值
plot(x,y,"or");%绘制一下点
xx = 0:0.01:2*pi;%这个是查询点的坐标向量
yy = interp1(x,y,xx,'spline');  %yy就是查询点向量对应的函数值向量了,注意最后的参数
plot(x,y,"o",xx,yy,"r");%画图画图

xx=1.23;%只查询一个元素也是可以的
yy = spline(x,y,xx);%嗯,也可以这样
plot(x,y,"o",xx,yy,"or");%画图画图

(一段代码用了三次hhh)

如果存在边界条件,则我们使用函数进行三次样条插值。11705a696380e3af0d78f642bfb2edbe.png不过具体建模中,往往不会直接给出边界条件,因此函数使用的次数最多。事实上,我们可以发现它的效果还是蛮好的。至于函数的使用,自行查阅啦~

此外,还有维数据插值,使用到的函数是,这里我就不讲了,大家自行了解一下。78cc46b4433438755694facc45dccf1e.png

以上就是插值我想分享的全部内容了,其实没有太多的数学推导以及证明,只进行了简单的介绍以及使用。嗯,如果想知道更加详细的内容,例如拉格朗日插值,牛顿插值法等等,还是自行学习吧~如果想知道具体的推导,也可以参考相应的资料。这里我就不说了。

本来想着能把插值和拟合放在一篇的,不过好像已经写了几个小时了,实在是不想继续了,那拟合就放在之后的篇章里吧。hhh就这样。

最后,回复“数学建模书籍”可以领取相关数学建模资料。我是打算放一些资源上去的,因此看到这里的同学,如果有什么想要的资源,欢迎在留言区留言。嗯,如果我能搜集得到就会放到公众号上。(倾向于计算机类,数据类,金融类等等……)

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

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

相关文章

密度图的密度估计_不同类型的二维密度图小教程

R相关小教程链接:用R构建气泡图案例小教程【小教程】散点图、饼图怎么在我的文章中完美展示小教程热图在论文发表中完美呈现小教程R与密度、函数、变量的微妙关系北京市计算中心医用数据库建设解决方案更多内容,请关注“生信会议”公众号Different types…

python 找质数的个数_用Python打造一款文件搜索工具,所有功能自己定义!

一、前言大家好,又到了Python办公自动化系列。在日常的办公中,我们经常会从一堆不同格式的文件(夹)中搜索特定的文件,可能你是凭着记忆去找或是借助软件,但你有想过如何用Python实现吗?本文将基于几个常见的搜索操作讲…

nessus安装_Nessus忘记密码怎么办?

最近公司购买了Nessus,才安装好,然后隔天密码就忘了,唉,人老了呀,记性不行了。网上看了一下,还是有比较多的同学也遇到这个问题,现将密码重置方法,分享给大家。系统环境:操作系统&am…

graphpad prism画折线图_如何用Graphpad Prism 8作折线图

如何用Graphpad Prism 8作折线图如何用Graphpad Prism 8作折线图Prism 8 有8种数据类型,Prism数据表的格式决定可制作的图表种类和可执行的分析类型。选择一个数据表格式可以使Prism创建合适数据的数据表,然后创建所需的图形,执行适当的分析。…

sqlserver可视化工具_数据分析之基础分析工具篇(修订版)

原创:海峰996已经火了,你正在经历996吗,怎样才能避免,而又能在职场立足,工作效率是关键,那么先从选对工具开始吧。进入数据时代,大家都会进行或多或少的数据分析,那么现在的你正在使…

windows下python环境搭建_Linux/Windows下Python环境搭建步骤

Python环境搭建首先到官网(www.python.org)下载相应的安装版本。主要分为Windows和Linux两种: 一、Linux下Python环境搭建 一般情况下,Linux系统都已经预安装好Python,但是版本都比较低,需要安装新的版本方…

oracle 同一列数据不同条件分组求和_艾瑞教育:有关Oracle数据库,你需要知道的几件事...

Oracle一、Oracle数据库在存储过程中,如何在字符串中使用变量?例:select to_char(sysdate,yyyymmdd) into v_yyyymmdd from dual;execute immediate(create table tableName_bk_ || v_yyyymmdd || as select * from TableName);将B表中符合关联条件的A…

网络多人游戏架构与编程 电子书_Java互联网架构-高性能网络编程必备技能IO与NIO阻塞分析...

欢迎关注头条号:java小马哥周一至周日早九点半!下午三点半!精品技术文章准时送上!!!精品学习资料获取通道,参见文末一、概念NIO即New IO,这个库是在JDK1.4中才引入的。NIO和IO有相同…

python能制作游戏吗_没有Python不能做的游戏,这些游戏都可以做

简介:Python编程语言的强大,几乎是众所周知的!那么,下面我给大家介绍一下几个用Python实现的各种游戏吧。不仅能用来做web、爬虫、数据分析等,没想到还能用做这么多的游戏,实在令人惊讶不已。注意:以下介绍…

vba excel 退出编辑状态_偷梁换柱之EXCEL编辑保护和VBA隐藏代码保护的解锁

如何解锁EXCEL表格编辑保护和VBA隐藏代码保护?当我们想借用别人的表格发现表格上锁无法编辑又不知道密码时或者当我们用软件生成一些表格时往往会遇到“上锁”问题,导致我们无法对表格进行改动。类似下图这样:那怎么才能征服她呢?…

activex for chrome扩展程序 下载”_Chrome扩展程序一键生成网页骨架屏

对于依赖接口渲染的页面,在拿到数据之前页面往往是空白的,为了提示用户当前正在加载中,往往会使用进度条、loading图标或骨架屏的方式。对于前两种方案而言,实现比较简单;本文主要研究骨架屏的应用及实现,并…

dynamo python修改多个参数_python之函数

a.sort()没有返回值。而sorted(a)是有返回值的。Python的标准比较运算符&#xff1a;<、<、 > 、>、 、 !函数用法和底层分析&#xff1a;函数是一个可重用的程序代码块&#xff0c;函数也代表一个任务和功能&#xff08;function&#xff09;,是代码复用的通用机制…

javascript进制转换_JavaScript 加减危机——为什么会出现这样的结果?

在日常工作计算中&#xff0c;我们如履薄冰&#xff0c;但是 JavaScript 总能给我们这样那样的 surprise~0.1 0.2 &#xff1f;1 - 0.9 &#xff1f;如果小伙伴给出内心的结果&#xff1a;0.1 0.2 0.31 - 0.9 0.1那么小伙伴会被事实狠狠地扇脸&#xff1a;console.log(0.…

java实现复制粘贴的计算器_软帝学院教你用java编写计算器(三)

教你用java编写计算器(三)import java.awt.Color;import java.awt.Dimension;import java.awt.event.ActionListener;import javax.swing.JButton;import javax.swing.JFrame;import javax.swing.JMenu;import javax.swing.JMenuBar;import javax.swing.JMenuItem;import javax…

php 公众号验证回调方法_如何进行公众号文章收集 两种收集方法详解

大家都知道优质的公众号吸引用户最关键的就是要优质的文章&#xff0c;所以会有专人负责进行公众号文章收集工作&#xff0c;下面我们跟随拓途数据一起来了解一下如何进行公众号文章收集的相关资料吧。 如何进行公众号文章收集方案一&#xff1a;基于搜狗入口 在网上能搜索到的…

mysql保存一个文件怎么打开_悄悄告诉你,MySQL 通过SQL语句导出到Excel的方法-sql文件怎么打开...

执行SQL语句select fullname,time,endtime,closed from chat_archive into outfile c:/xxx.xls注意&#xff1a;因为office默认的是gb2312编码&#xff0c;服务器端生成的很有可能是utf-8编码&#xff0c;此时有几种选择1、把查询出来的结果转换为GB2312格式(字段fullname)sele…

gerber文件怎么导贴片坐标_SMT贴片机在线编程调试

SMT贴片机分为离线编程和在线编程调试&#xff0c;在线编程调试就是在 SMT 贴片机上对离线编程的程序进行优化调试编辑。SMT 贴片机在线编程调试总体上就是两个步骤&#xff0c;一个是离线编程的程序进行编程&#xff0c;然后就是总体检查并备份到贴片机电脑内。一、在 SMT 贴片…

java销售额查询_用JSP+JavaBean开发模式实现一个销售额的查询

数据库使用mysql&#xff0c;如下&#xff1a;vo包的Sales类&#xff1a;package com.vo;public class Sales {public String salestime;public float salesnum;public String getSalestime() {return salestime;}public void setSalestime(String salestime) {this.salestime …

spss数据_怎么建立SPSS数据库、录入数据?

怎么把收集的问卷、测试数据等原始资料转变为“SPSS数据库”&#xff1f;数据包括离散&#xff08;单选题、多选题等&#xff09;、连续&#xff08;年龄、身高、肺活量、人数等&#xff09;两类。以下面四个题目为例&#xff0c;介绍采用SPSS建立数据库的方法&#xff1a;A2.学…

php进度条如何计算,投票最后显示进度条的百分比怎么算

我自己写的一个投票结果显示&#xff0c;其中设定票数最多的那个进度条为100&#xff05;。public class voteresult : System.Web.UI.Page{protected System.Web.UI.HtmlControls.HtmlTableCell td_vote;protected System.Web.UI.HtmlControls.HtmlTable tab_result;private v…