分段线性插值

1. 使用分段线性插值的目的

一些插值函数列可能产生Runge现象,也就是只能在某些区间内部收敛到被插函数,在这些区间外则根本无法收敛到被插函数。

为了使得我们的插值对于任何区间都有意义,选择将整个插值区间按照节点分成若干个小区间,在每个小区间上分别使用多项式插值,这样来近似代替被插函数。

一般使用次数小于或等于3的多项式来进行分段插值,当次数为1次是就是分段线性插值。

2. 方法

直观上,分段线性插值函数是连接各个节点的折线,采用Lagrange插值基函数的方法,在每个小区间上构造基函数,再作它们的线性组合。

以下的插值基函数可以作为选择

设在区间[a,b][a,b][a,b]上给定n+1n+1n+1个插值节点和函数值
a=x0≤x1<x2<…<xn=ba=x_0\leq x_1 < x_2 <\ldots<x_n=b a=x0​≤x1​<x2​<…<xn​=b
y0,y1,….yny_0,y_1,\ldots.y_n y0​,y1​,….yn​
构造以下插值基函数
l0(x)={x−x1x0−x1x0≤x≤x10x1<x≤xnl_0(x)=\left\{ \begin{array}{lc} \frac{x-x_1}{x_0-x_1}&x_0\leq x \leq x_1\\ 0&x1 <x\leq x_n \end{array} \right. l0​(x)={x0​−x1​x−x1​​0​x0​≤x≤x1​x1<x≤xn​​
lj(x)={x−xj−1xj−xj−1xj−1≤x≤xjx−xj+1xj−xj+1xj≤x≤xj+10[a,b]−[xj−1,xj+1]l_j(x)=\left\{ \begin{array}{lc} \frac{x-x_{j-1}}{x_j-x_{j-1}}&x_{j-1}\leq x \leq x_j\\ \frac{x-x_{j+1}}{x_j-x_{j+1}}&x_{j}\leq x \leq x_{j+1}\\ 0&[a,b]-[x{j-1}, x_{j+1}] \end{array} \right. lj​(x)=⎩⎪⎨⎪⎧​xj​−xj−1​x−xj−1​​xj​−xj+1​x−xj+1​​0​xj−1​≤x≤xj​xj​≤x≤xj+1​[a,b]−[xj−1,xj+1​]​
ln(x)={x−xn−1xn−xn−1xn−1≤x≤xn0x0<x≤xn−1l_n(x)=\left\{ \begin{array}{lc} \frac{x-x_{n-1}}{x_n-x_{n-1}}&x_{n-1}\leq x \leq x_n\\ 0&x_0 <x\leq x_{n-1} \end{array} \right. ln​(x)={xn​−xn−1​x−xn−1​​0​xn−1​≤x≤xn​x0​<x≤xn−1​​
其中j=1,2,…,n−1j=1,2,\ldots,n-1j=1,2,…,n−1
然后用这些插值基函数就可以写出分段线性插值函数的表达式
φ(x)=∑j=0nyjlj(x)\varphi(x)=\sum_{j=0}^n y_jl_j(x) φ(x)=j=0∑n​yj​lj​(x)

3. matlab方法

matlab的插值函数提供了线性插值的选项,y = interp1(x0,y0,x,‘linear’)返回插值节点为x0,函数值为y0,在区间x上的全部函数值。

x0 = 1:30;
y0 = 10*randn(1,30);
x = 1:0.5:30;%分段线性插值
y2 = interp1(x0,y0,x,'linear');
plot(x0,y0,'+',x,y2,'r')
title('分段线性插值')

Hermite插值

1. Hermite插值的好处

Hermite插值又称带指定微商值的插值,也就是说,除了给出了插值节点的函数值之外,还给出了指定插值节点的导数值。Hermite插值在插值节点处取相同的函数值和导数值。

2. 方法

给出n+1个插值节点和相应的函数值,微商值

xxx x0x_0x0​ x1x_1x1​ …\ldots… xnx_nxn​
yyy y0y_0y0​ y1y_1y1​ …\ldots… yny_nyn​
y′y'y′ y0′y_0'y0′​ y1′y_1'y1′​ …\ldots… yn′y_n'yn′​

可以构造2n+1次的Hermite插值多项式H(x)H(x)H(x),并且

  • H(x)H(x)H(x)是次数不超过2n+1次的插值多项式
  • H(xj)=yj,H′(xj)=yj′,j=0,1,…,nH(x_j)=y_j,H'(x_j)=y_j',j=0,1,\ldots,nH(xj​)=yj​,H′(xj​)=yj′​,j=0,1,…,n

采用插值基函数的办法,构造如下插值基函数
hi(x)=(1+2∑j≠ix−xixj−xi)li2(x)h_i(x)=(1+2\sum_{j\neq i}\frac{x-x_i}{x_j-x_i})l_i^2(x) hi​(x)=(1+2j​=i∑​xj​−xi​x−xi​​)li2​(x)
Hi(x)=li2(x)(x−xi)H_i(x)=l^2_i(x)(x-x_i) Hi​(x)=li2​(x)(x−xi​)
其中li(x)l_i(x)li​(x)是Largange插值基函数,i=0,1,…,ni=0,1,\ldots,ni=0,1,…,n
并且,hi(x),Hi(x)h_i(x),H_i(x)hi​(x),Hi​(x)在对应下标插值节点处取值为1,在其他节点取取值为0.
这样可以写出Hermite插值的表达式
H(x)=∑i=0n(yihi(x)+yi′Hi(x))H(x)=\sum_{i=0}^n(y_ih_i(x)+y_i'H_i(x)) H(x)=i=0∑n​(yi​hi​(x)+yi′​Hi​(x))

3. 分段三次Hermite插值

按照分段插值的方法,把区间[a,b][a,b][a,b]分为若干个区间,在每个区间上使用三次Hermite插值。
在各个节点上的插值基函数如下
h0(x)={(1+2x−x0x1−x0)(x−x1x0−x1)2x0≤x≤x10x1<x≤xnh_0(x)=\left\{ \begin{array}{lc} (1+2\frac{x-x_0}{x_1-x_0})(\frac{x-x_1}{x_0-x_1})^2&x_0\leq x \leq x_1\\ 0&x1 <x\leq x_n \end{array} \right. h0​(x)={(1+2x1​−x0​x−x0​​)(x0​−x1​x−x1​​)20​x0​≤x≤x1​x1<x≤xn​​
hj(x)={(1+2x−xjxj−1−xj)(x−xj−1xj−xj−1)2xj−1≤x≤xj(1+2x−xjxj+1−xj)(x−xj+1xj−xj+1)2xj≤x≤xj+10[a,b]−[xj−1,xj+1]h_j(x)=\left\{ \begin{array}{lc} (1+2\frac{x-x_j}{x_{j-1}-x_j})(\frac{x-x_{j-1}}{x_j-x_{j-1}})^2&x_{j-1}\leq x \leq x_j\\ (1+2\frac{x-x_j}{x_{j+1}-x_j})(\frac{x-x_{j+1}}{x_j-x_{j+1}})^2&x_{j}\leq x \leq x_{j+1}\\ 0&[a,b]-[x{j-1}, x_{j+1}] \end{array} \right. hj​(x)=⎩⎪⎨⎪⎧​(1+2xj−1​−xj​x−xj​​)(xj​−xj−1​x−xj−1​​)2(1+2xj+1​−xj​x−xj​​)(xj​−xj+1​x−xj+1​​)20​xj−1​≤x≤xj​xj​≤x≤xj+1​[a,b]−[xj−1,xj+1​]​
ln(x)={(1+2x−xn−1xn−1−xn)(x−xn−1xn−xn−1)2xn−1≤x≤xn0x0<x≤xn−1l_n(x)=\left\{ \begin{array}{lc} (1+2\frac{x-x_{n-1}}{x_{n-1}-x_n})(\frac{x-x_{n-1}}{x_n-x_{n-1}})^2&x_{n-1}\leq x \leq x_n\\ 0&x_0 <x\leq x_{n-1} \end{array} \right. ln​(x)={(1+2xn−1​−xn​x−xn−1​​)(xn​−xn−1​x−xn−1​​)20​xn−1​≤x≤xn​x0​<x≤xn−1​​
H0(x)={(x−x0)(x−x1x0−x1)2x0≤x≤x10x1<x≤xnH_0(x)=\left\{ \begin{array}{lc} (x-x_0)(\frac{x-x_1}{x_0-x_1})^2&x_0\leq x \leq x_1\\ 0&x1 <x\leq x_n \end{array} \right. H0​(x)={(x−x0​)(x0​−x1​x−x1​​)20​x0​≤x≤x1​x1<x≤xn​​
Hj(x)={(x−xj)(x−xj−1xj−xj−1)2xj−1≤x≤xj(x−xj)(x−xj+1xj−xj+1)2xj≤x≤xj+10[a,b]−[xj−1,xj+1]H_j(x)=\left\{ \begin{array}{lc} (x-x_j)(\frac{x-x_{j-1}}{x_j-x_{j-1}})^2&x_{j-1}\leq x \leq x_j\\ (x-x_j)(\frac{x-x_{j+1}}{x_j-x_{j+1}})^2&x_{j}\leq x \leq x_{j+1}\\ 0&[a,b]-[x{j-1}, x_{j+1}] \end{array} \right. Hj​(x)=⎩⎪⎨⎪⎧​(x−xj​)(xj​−xj−1​x−xj−1​​)2(x−xj​)(xj​−xj+1​x−xj+1​​)20​xj−1​≤x≤xj​xj​≤x≤xj+1​[a,b]−[xj−1,xj+1​]​
Hn(x)={(x−xn)(x−xn−1xn−xn−1)2xn−1≤x≤xn0x0<x≤xn−1H_n(x)=\left\{ \begin{array}{lc} (x-x_n)(\frac{x-x_{n-1}}{x_n-x_{n-1}})^2&x_{n-1}\leq x \leq x_n\\ 0&x_0 <x\leq x_{n-1} \end{array} \right. Hn​(x)={(x−xn​)(xn​−xn−1​x−xn−1​​)20​xn−1​≤x≤xn​x0​<x≤xn−1​​

matlab代码

function y=hermite(x0,y0,y1,x);
n=length(x0);m=length(x);
for k=1:myy=0.0;for i=1:nh=1.0;a=0.0;for j=1:nif j~=ih=h*((x(k)-x0(j))/(x0(i)-x0(j)))^2;a=1/(x0(i)-x0(j))+a;endendyy=yy+h*((x0(i)-x(k))*(2*a*y0(i)-y1(i))+y0(i));end
y(k)=yy;
end

计算方法(三)分段线性插值和Hermite插值相关推荐

  1. 插值与拟合 (一) : 拉格朗日多项式插值 、Newton插值 、分段线性插值、Hermite插值 、样条插值、 B 样条函数插值、二维插值

    插值:求过已知有限个数据点的近似函数. 拟合:已知有限个数据点,求近似函数,不要求过已知数据点,只要求在某种意义下它在这些点上的总偏差最小. 插值和拟合都是要根据一组数据构造一个函数作为近似,由于近似 ...

  2. 拉格朗日插值、分段线性插值、三次样条插值

    本篇主要介绍在三种插值方法:拉格朗日插值.分段线性插值.三次样条插值,以及这三种方法在matlab中如何实现. 1.拉格朗日插值: 1.1基本原理:先构造一组基函数:               是次 ...

  3. 【数学与算法】【分段三次Hermite插值】和【分段三次样条插值】

    光滑曲线在数学上的定义是什么?? 原文链接:光滑曲线在数学上的定义是什么? 回答1: 定义:切线随切点的移动而连续转动. 若函数f(x)f(x)f(x)在区间(a,b)(a,b)(a,b)内具有一阶连 ...

  4. matlab用分段线性插值例题,matlab分段线性插值

    (j))^3; end end 7 结果分析与讨论:运用 MATLAB 分别对分段线性插值和三次样条插值进行编程的到数值均为 1.4664 说明实验结果准确无误,通过实验可以得出,在...... 中平 ...

  5. 数学建模准备 插值(拉格朗日多项式插值,牛顿多项式插值,分段线性插值,分段三次样条插值,分段三次Hermite插值)

    文章目录 摘要(必看) 0 基础概念 什么是插值 插值用途 什么是拟合 插值和拟合的相同点 插值和拟合的不同点 1 常用的基本插值方法 1.1 多项式插值法 1.1.1 拉格朗日多项式插值法 多项式插 ...

  6. 机器人路径规划之分段三次Hermite插值(PCHIP) [包括Python和Matlab代码实现]

    前言 在机器人的路径规划中针对离散采样点做插值计算生成平滑的曲线轨迹也是挺重要的一部分,本文主要介绍一下目前使用较多也是个人觉得挺好用的一个插值方法--分段三次 Hermite 插值(PCHIP),并 ...

  7. 2021-07-21 分段三次Hermite插值及其与三次样条的比较

    Numpy数组自身加和与乘积运算 http://www.weixueyuan.net/a/794.html python-scipy -hermite插值,分段三次Hermite插值 import n ...

  8. 清风数学建模学习笔记——应用matlab实现分段三次埃尔米特(Hermite)插值与三次样条插值

    插值算法   数模比赛中,常常需要根据已知的函数点进行数据.模型的处理和分析,而有时候现有的数据是极少的,不足以支撑分析的进行,这时就需要使用一些数学的方法,模拟产生一些新的但又比较靠谱的值来满足需求 ...

  9. hermit插值 matlab,分段线性插值和分段Hermit插值课程设计

    一.前言 本文建立在数值分析的理论基础上,能够在Matlab 环境中运行,给出了理论分析.具体实例.程序清单以及程序运行结果,对设计任务中的函数进行了分段线性插值和分段三次Hermit 插值,分别画出 ...

  10. 数值分析之 拉格朗日插值、牛顿插值、分段线性插值实现

    1.拉格朗日插值法 考虑全局信息的比较经典的插值方法,编程简单,计算量大. #coding=utf-8 from matplotlib import pyplot as pltdef Lg(data, ...

最新文章

  1. Springboot-mongodb MongoRepository接口 save方法 详解
  2. [Hadoop] Hadoop学习历程 [持续更新中…]
  3. Docker容器技术
  4. css 做幻灯片效果
  5. Vue入门 ---- 组件式开发
  6. imgaug批量椒盐噪声 python_python手写给图像加椒盐噪声和高斯噪声
  7. GetWindowThreadProcessId
  8. BGP ——路由过滤+路由聚合(讲解+配置)
  9. mysql 传送时间_vue处理mysql数据库中的时间数据(datetime)
  10. 安全生产六步法是什么_支塘镇探索“五步法”压紧压实出租厂房安全生产主体责任...
  11. 《葵花宝典:WPF自学手册》三大网点书评集萃
  12. 每天一道剑指offer-连续子数组的最大和
  13. 数据集加载--load_digits
  14. 管家婆打印报错——进程无法访问
  15. win10,在proe/creo中鼠标中键不能放大缩小
  16. explain是mysql的关键字吗_mysql 中的explain关键字
  17. 有一个多项式:Pn(x)=a0x+a1x+….+anx(n=10),它们的系数存放在一个一维数组中,编写程序,输入系数和x的值,计算并输出Pn(x)的结果。
  18. LIO-SLAM分析
  19. 高通msm8996平台上的pa电源管理(wsa881x)
  20. Linux下的Julia安装

热门文章

  1. cgi加载java class_深入研究Java类加载机制
  2. linux 分区怎样缩小,如何缩小磁盘分区大小
  3. 快狗打车正式登陆港交所,“更美好,更绿色”的同城货运平台来了!
  4. Python之函数传参
  5. 打印预览的时候,总是会多于一个空白页,怎么办?
  6. 风靡健身圈的生酮饮食居然有这么多好处,受教了
  7. 【精品】MySQL 自定义函数
  8. 在WinCC V7.3中如何导出过程值进行数据归档
  9. cpu空载50度,大热天,cpu都上50度了! -
  10. Win7远程桌面 提示 登录没有成功解决方法