数学建模学习笔记(三)——插值算法

插值算法简介

数据分析是在大数据时代下不可获取的一环,合理、全面地分析数据,能够使得决策者在决策时作出最为明智的决定。在数据分析过程中,常常可以使用插值算法来根据已知的数据估算出未知的数据,从而模拟产生一些新的值来满足要求。

一维插值

在许多插值问题中,我们常常研究的是一维插值:
设函数 y=f(x)y=f(x)y=f(x) 在区间 [a,b][a, b][a,b] 上有定义,且已知在点 a≤x0<x1<⋯<xn≤ba \leq x_0 < x_1 < \cdots < x_n \leq bax0<x1<<xnb 上的值分别为:y0,y1,⋯,yn,y_0, y_1, \cdots, y_n,y0,y1,,yn,
若存在一简单函数P(x)P(x)P(x),使 P(xi)=yi(i=0,1,2,⋯,xn)P(x_i) = y_i (i = 0, 1, 2, \cdots, x_n)P(xi)=yi(i=0,1,2,,xn)则称 P(x)P(x)P(x)f(x)f(x)f(x) 的插值函数,点 x0,x1,⋯,xnx_0, x_1, \cdots, x_nx0,x1,,xn 称为插值节点,包含插值节点的区间 [a,b][a, b][a,b] 称为插值区间,求插值函数 P(x)P(x)P(x) 的方法称为插值法。

主要插值法

  1. P(x)P(x)P(x) 是次数不超过 nnn 的代数多项式,即P(x)=a0+a1x+⋯+anxnP(x)=a_0+a_1x+\cdots+a_nx^nP(x)=a0+a1x++anxn
  2. 分段插值:即一段一段的进行插值,得到的插值函数比较复杂,但是准确度较高。
  3. 三角插值:主要会使用傅里叶变换。

插值算法

  1. 拉格朗日插值法

    ∙\bullet 两个点:(x0,y0)(x1,y1)(x_0, y_0)(x_1, y_1)(x0,y0)(x1,y1)
    可以设出插值函数为:f(x)=x−x0x0−x1y0+x−x0x1−x0y1f(x)=\frac{x-x_0}{x_0-x_1}y_0 + \frac{x-x_0}{x_1-x_0}y_1f(x)=x0x1xx0y0+x1x0xx0y1

    ∙\bullet 三个点:(x0,y0)(x1,y1)(x2,y2)(x_0, y_0)(x_1, y_1)(x_2, y_2)(x0,y0)(x1,y1)(x2,y2)
    可以设出插值函数为:f(x)=(x−x1)(x−x2)(x0−x1)(x0−x2)y0+(x−x0)(x−x2)(x1−x0)(x1−x2)y1+(x−x0)(x−x1)(x2−x0)(x2−x1)y2f(x) = \frac{(x-x_1)(x-x_2)}{(x_0-x_1)(x_0-x_2)}y_0 + \frac{(x-x_0)(x-x_2)}{(x_1-x_0)(x_1-x_2)}y_1 \\ + \frac{(x-x_0)(x-x_1)}{(x_2-x_0)(x_2-x_1)}y_2f(x)=(x0x1)(x0x2)(xx1)(xx2)y0+(x1x0)(x1x2)(xx0)(xx2)y1+(x2x0)(x2x1)(xx0)(xx1)y2
    以此类推,可以得出4个、5个……点的拉格朗日插值函数。

    然而,拉格朗日插值法在平常的插值问题分析中并不常用,原因是会产生龙格现象(即多项式的次数越高,函数两端的波动便会越大,越不准确)。

  2. 分段线性以及分段二次插值
    顾名思义,就是将函数分为一段一段的,每一段都是用线性函数或者二次函数来进行估计。

  3. 牛顿插值
    f(x)=f(x0)+f[x0,x1](x−x0)+f[x0,x1,x2](x−x0)(x−x1)+⋯+f[x0,x1,⋯,xn−2,xn−1](x−x0)(x−x1)⋯(x−xn−3)(x−xn−2)+f[x0,x1,⋯,xn−1,xn](x−x0)(x−x1)⋯(x−xn−2)(x−xn−1)\begin{aligned}f(x) = &f(x_0) + f[x_0, x_1](x-x_0) \\ &+f[x_0, x_1, x_2](x-x_0)(x-x_1) + \cdots \\ &+f[x_0, x_1, \cdots, x_{n-2}, x_{n-1}](x-x_0)(x-x_1)\cdots(x-x_{n-3})(x-x_{n-2}) \\ &+f[x_0, x_1, \cdots, x_{n-1}, x_n](x-x_0)(x-x_1)\cdots(x-x_{n-2})(x-x_{n-1}) \end{aligned}f(x)=f(x0)+f[x0,x1](xx0)+f[x0,x1,x2](xx0)(xx1)++f[x0,x1,,xn2,xn1](xx0)(xx1)(xxn3)(xxn2)+f[x0,x1,,xn1,xn](xx0)(xx1)(xxn2)(xxn1)
    其中 f[x0,x1]f[x_0, x_1]f[x0,x1] 是指 f(x)f(x)f(x) 关于点 x0,x1x_0, x_1x0,x1 的差商。

    一阶差商:f[x0,xk]=f(xk)−f(x0)xk−x0f[x_0, x_k] = \frac{f(x_k)-f(x_0)}{x_k-x_0}f[x0,xk]=xkx0f(xk)f(x0)
    二阶差商:f[x0,x1,x2]=f[x1,x2]−f[x0,x1]x2−x0f[x_0, x_1, x_2] = \frac{f[x_1, x_2]-f[x_0, x_1]}{x_2 - x_0}f[x0,x1,x2]=x2x0f[x1,x2]f[x0,x1]
    ⋯\cdots
    k阶差商:f[x0,x1,⋯,xk]=f[x1,⋯,xk−1,xk]−f[x0,x1,⋯,xk−1]xk−x0f[x_0, x_1, \cdots, x_k] = \frac{f[x_1, \cdots, x_{k-1}, x_{k}]-f[x_0, x_1, \cdots, x_{k-1}]}{x_k-x_0}f[x0,x1,,xk]=xkx0f[x1,,xk1,xk]f[x0,x1,,xk1]

    但是,牛顿插值法也会存在龙格现象的问题。

  4. 最为常用的两种插值方法:三次埃尔米特插值以及三次样条插值
    4.1 三次埃尔米特插值
    ∙\bullet 埃尔米特插值原理
    设函数f(x)f(x)f(x)在区间[a,b][a, b][a,b]上有 n + 1 个互异节点 a=x0<x1<x2<⋯<xn=ba=x_0 < x_1 < x_2 < \cdots < x_n=ba=x0<x1<x2<<xn=b,定义在[a,b][a, b][a,b]上函数f(x)f(x)f(x)在节点上满足:
    f(xi)=yi,f′(xi)=yi′(i=0,1,2,⋯,n)(2n+2个条件)f(x_i)=y_i, f'(x_i)=y_i'(i=0, 1, 2, \cdots, n)(2n+2\text{个条件})f(xi)=yi,f(xi)=yi(i=0,1,2,,n)(2n+2个条件)
    可唯一确定一个次数不超过2n+12n+12n+1的多项式H2n+1(x)=H(x)H_{2n+1}(x)=H(x)H2n+1(x)=H(x)满足:
    H(xj)=yj,H′(xj)=mj(j=0,1,⋯,n)H(x_j)=y_j, H'(x_j)=m_j(j=0, 1, \cdots, n)H(xj)=yj,H(xj)=mj(j=0,1,,n)其余项为:R(x)=f(x)−H(x)=f2n+2(ξ)(2n+2)!ω2n+2(x)R(x)=f(x)-H(x)=\frac{f^{2n+2}(\xi)}{(2n+2)!}\omega_{2n+2}(x)R(x)=f(x)H(x)=(2n+2)!f2n+2(ξ)ω2n+2(x)
    三次埃尔米特插值可在 MatlabMatlabMatlab 中调用 phipphipphip 函数进行直接求取,详见后面的例题。

    4.2 三次样条插值
    ∙\bullet 三次样条插值条件
    y=f(x)y=f(x)y=f(x) 在点 x0,x1,⋯,xnx_0, x_1, \cdots, x_nx0,x1,,xn 的值为 y0,y1,⋯,yny_0, y_1, \cdots, y_ny0,y1,,yn,若函数 S(x)S(x)S(x) 满足下列条件:
    △\triangle S(xi)=f(xi)=yi,i=0,1,2,⋯,nS(x_i) = f(x_i) = y_i, i = 0, 1, 2,\cdots,nS(xi)=f(xi)=yi,i=0,1,2,,n
    △\triangle 在每个子区间 [xix_ixi,xi+1x_{i+1}xi+1](i=0,1,2,⋯,n−1i=0,1,2,\cdots,n-1i=0,1,2,,n1)上S(x)S(x)S(x)是三次多项式;
    △\triangle S(x)S(x)S(x)在[a,b]上二阶连续可微,则称S(x)S(x)S(x)为函数f(x)f(x)f(x)的三次样条插值函数;

    同样,三次样条插值也可在 MatlabMatlabMatlab 中调用 splinesplinespline 函数进行直接求取,详见后面的例题。

例题:淡水养殖中池塘水体质量的评估

  1. 原始数据
    池塘水体数据

  2. 三次埃尔米特插值

    MatlabMatlabMatlab代码为:

	[n,m]=size(Pool_1);x=1:2:15;new_x=1:15;res_2=zeros(n,size(new_x,2));%pchip埃尔米特

数据处理结果:
三次埃尔米特插值法得出的数据
可以看到,原始数据只有15周内奇数周的数据,经过插值过后,获得了完整的15周池塘水体质量的数据。

  1. 三次样条插值

    MatlabMatlabMatlab代码为:

[n,m]=size(Pool_1);
x=1:2:15;
new_x=1:15;
res_1=zeros(n,size(new_x,2));%spline 得到的y

数据处理结果为:
三次样条插值结果
同样也获得了15周内完整的池塘水体质量数据。

注意,这样的插值方法还可以对未来进行短期的预测。方法不同,预测结果同样会有些差异。

如果想要深入了解插值算法,推荐

刘春凤教授:中国大学MOOC数值计算方法

这本书。

有什么好的建议,请一定告诉我哦~~~
请添加图片描述

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

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

相关文章

没有bug队——加贝——Python 53,54

目录 53.题目&#xff1a;学习使用按位异或 ^ 。 54.题目&#xff1a;取一个整数a从右端开始的4〜7位。 运算符描述实例&按位与运算符&#xff1a;参与运算的两个值,如果两个相应位都为1,则该位的结果为1,否则为0(a & b) 输出结果 12 &#xff0c;二进制解释&#xf…

数学建模学习笔记(四)——拟合算法

文章目录拟合算法简介一个线性规划的例子最小二乘法求解最小二乘法拟合检验总结拟合算法简介 与插值算法不同&#xff0c;拟合算法的目的是得到一条确定的曲线&#xff1b;而插值是根据已有的数据来获得一系列新的“靠谱”的数据。插值要求曲线必须全部经过样本数据点&#xf…

没有bug队——加贝——Python 55,56

55.题目&#xff1a;学习使用按位取反~。 说明&#xff1a; 二进制数在内存中以补码的形式存储。 按位取反&#xff1a;二进制每一位取反&#xff0c;0 变 1&#xff0c;1 变 0。 最高位为符号位&#xff0c;正数的符号位为 0&#xff0c;负数为 1。 对正数来说&#xff0…

数学建模学习笔记(五)——相关系数以及假设检验

文章目录皮尔逊相关系数假设检验下面来看一个例子斯皮尔曼(spearman)相关系数注意皮尔逊相关系数 总体皮尔逊&#xff08;Pearson&#xff09;相关系数 如果有 A:{A1,A2,⋯,An}A:\{A_1, A_2, \cdots, A_n\}A:{A1​,A2​,⋯,An​} 和 Y:{Y1,Y2,⋯,Yn}Y:\{Y_1, Y_2, \cdots, Y_n\…

没有bug队——加贝——Python 57,58

相关 tkinter 的介绍&#xff1a;Python 55&#xff0c;56 目录 57.题目&#xff1a;画图&#xff0c;学用line画直线。 58.题目&#xff1a;画图&#xff0c;学用rectangle画方形。   57.题目&#xff1a;画图&#xff0c;学用line画直线。 #57 from tkinter import *c…

C语言高级输出及进阶

在C语言中&#xff0c;有三个函数可以用来在显示器上输出数据&#xff0c;它们分别是&#xff1a; puts()&#xff1a;只能输出字符串&#xff0c;并且输出结束后会自动换行。putchar()&#xff1a;只能输出单个字符。printf()&#xff1a;可以输出各种类型的数据。printf() 是…

数学建模学习笔记(六)——多元线性回归分析

文章目录一、综述二、常见的回归分析三、对于相关性的理解四、一元线性回归模型五、对于回归系数的解释六、内生性七、四类线性模型回归系数的解释八、对于定性变量的处理——虚拟变量XXX九、下面来看一个实例十、扰动项需要满足的条件十一、异方差十二、多重共线性十三、逐步回…

没有bug队——加贝——Python 59,60

相关 tkinter 的介绍&#xff1a;Python 55&#xff0c;56 目录 59.题目&#xff1a;画图&#xff0c;综合例子。  60.题目&#xff1a;计算字符串长度。  len&#xff08;&#xff09;函数用法 59.题目&#xff1a;画图&#xff0c;综合例子。   程序分析&#xff…

爬虫必备反爬技能:使用动态ip

目录 一、为什么要使用动态代理ip? 二、如何申请动态代理ip&#xff1f; 三、如何使用动态ip&#xff1f; 一、为什么要使用动态代理ip? 使用它的好处在哪里呢&#xff1f; 保护你的网络免受外部攻击屏蔽你的IP地址限制不必要的内容更好的帮助你抓取网络数据绕过目标网站…

数学建模学习笔记(七)——图论最短路问题

文章目录一、综述二、图论最短路问题三、几个简单的作图方法四、Dijkstra&#xff08;迪杰斯特拉&#xff09;算法五、Bellman-Ford算法六、总结一、综述 本文主要根据图论的基本概念&#xff0c;介绍图论中常见的建模问题——最短路问题。同时&#xff0c;介绍了解决图论最短…

pycharm和pythonIDE安装详解

目录 一、pycharm下载安装 二、python下载安装 ​三、pycharm上配置python 我们可能显示的库不大一样&#xff0c;因为我这大都事先安装过了&#xff0c;就没有删​打印成功&#xff1a;标志配置完成​四、配置镜像源让你下载嗖嗖的快 4.1&#xff09;pycharm内部配置 4.2…

数学建模学习笔记(八)——分类模型

文章目录一、分类模型综述二、逻辑回归三、两点分布&#xff08;伯努利分布&#xff09;四、连接函数的取法五、Logistic回归模型六、在SPSS中进行二元Logistic回归七、预测结果较差的解决八、Fisher线性判别分析九、多分类问题十、总结一、分类模型综述 通过样本数据中的分类…

python基础入门(1)

目录 一、python入门 二、python缩进 三、Python注释 1&#xff09;单行注释 2&#xff09;多行注释 四、Python 变量 1&#xff09;变量定义理解 2&#xff09; 变量名命名 3&#xff09; 分配多个值 4&#xff09;输出变量 5&#xff09;全局变量与局部变量&#…

数学建模学习笔记(九)——聚类模型

文章目录一、聚类综述二、主要用到的聚类算法三、K-means聚类算法四、K-means算法五、对于K-means算法和K-means算法的讨论六、系统&#xff08;层次&#xff09;聚类算法七、DBSCAN算法八、总结一、聚类综述 聚类的主要目的就是将样本划分为由类似的对象组成的多个类的过程。…

python基础入门(2)

目录 一、Python数据类型 1&#xff09;置数据类型 2&#xff09;获取数据类型 3&#xff09;设置数据类型 4&#xff09;设置特定数据类型 6&#xff09;练习题 二、python数字- 1&#xff09;整数 2&#xff09;浮点数 3&#xff09;虚数 4&#xff09;类型转换 …

C语言scanf:获取输入的内容

获取外部输入数据内容 在C语言中&#xff0c;有多个函数可以从键盘获得用户输入&#xff1a; scanf()&#xff1a;和 printf() 类似&#xff0c;scanf() 可以输入多种类型的数据。getchar()、getche()、getch()&#xff1a;这三个函数都用于输入单个字符。gets()&#xff1a;获…

数学建模学习笔记(十)——时间序列模型

文章目录一、时间序列综述二、时间序列数据以及基本概念三、时间序列分解四、指数平滑模型五、一元时间序列分析的模型六、AR&#xff08;p&#xff09;模型七、MA&#xff08;q&#xff09;模型八、ARMA&#xff08;p, q&#xff09;模型九、模型选择&#xff1a;AIC 和 BIC 准…

python基础入门(3)之字符串

目录 一、Python字符串 1.字符串基本使用 1&#xff09;字符串理解 2&#xff09;将字符串分配给变量 3&#xff09;多行字符串 4&#xff09;字符串是数组 5)遍历字符串 6)字符串长度 7)检查字符串 8)检查如果不是 2.切片字符串 1)切片 2)从头开始切片 3)切到最…

数学建模学习笔记(十一)——预测模型

文章目录一、综述二、灰色预测简介三、GM&#xff08;1, 1&#xff09;模型四、使用灰色系统建模的前提 —— 准指数规律检验五、对于GM(1, 1)的检验六、GM&#xff08;1, 1&#xff09;模型的拓展七、什么时候使用灰色预测八、神经网络模型一、综述 本文首先介绍了灰色预测模…

python基础入门(4)之布尔值

目录 一、Python布尔值 1)比较 2)评估值和变量 3)布尔真值 4)布尔假值 5)函数可以返回布尔值 6)练习题 一、Python布尔值 布尔值表示两个值之一&#xff1a; True或False。在编程中&#xff0c;您经常需要知道表达式是否为 True或False。举一些例子就明白了。 1)比较 当…