分段三次 Hermite 插值多项式 (PCHIP)

语法

p = pchip(x,y,xq)
pp = pchip(x,y)
 

说明

p = pchip(x,y,xq) 返回与 xq 中的查询点对应的插值 p 的向量。p 的值由 x 和 y 的保形分段三次插值确定。

pp = pchip(x,y) 返回一个分段多项式结构体以用于 ppval 和样条实用工具 unmkpp

例1

使用 spline 和 pchip 插入数据

将 spline 和 pchip 为两个不同函数生成的插值结果进行比较。

创建由 x 值、点 y 处的函数值以及查询点 xq 组成的向量。使用 spline和 pchip 计算查询点处的插值。绘制查询点处的插值函数值以进行比较。

clc;clear;
x = -3:3; %插值点x坐标
y = [-1 -1 -1 0 1 1 1]; %插值点y坐标
xq1 = -3:.01:3; %查询点
p = pchip(x,y,xq1); %返回查询点的y坐标
s = spline(x,y,xq1); %返回查询点的y坐标
plot(x,y,'o',xq1,p,'-',xq1,s,'-.')
legend('Sample Points','pchip','spline','Location','SouthEast')

注:蓝色圆圈是被插值样本点。

可以看到:样条曲线(其实也是分段多项式)在两边有轻微震荡现象,但更加光滑,因为它要求在插值点处插值函数连续,

插值函数一阶导连续,插值函数二阶导连续,而三次分段Hermite插值函数则比价稳定,但不如样条标线的那样光滑,因为

它只要求在插值点处插值函数连续,插值函数的一阶导连续。

例2

x = -:;
y = [ ];
p = pchip(x,y);
xq = -:0.2:;
pp = ppval(p,xq); %返回插值函数的查询点处的y坐标
plot(x,y,'o',xq,pp,'-.')
ylim([-0.2 2.2])

例3

x = -:;
y = [ ];
p = pchip(x,y);
s = spline(x,y);
xq = -:0.1:;
pp = ppval(p,xq); %返回插值函数的查询点处的y坐标
ss = ppval(s,xq); %返回插值函数的查询点处的y坐标
figure();hold on;plot(x,y,'o',xq,pp,'-.',xq,ss,'b-')
ylim([-0.2 2.2])
figure();hold on ;legend('Sample Points','分段三次Hermite','分段三次样条','Location','SouthEast')


PCHIP是分段三次hermit插值,但书中的该方法必须知道点的值和导数值,为什么PCHIP的变量只有函数值而没有导数值?

在用pchip插值的过程中,matlab会基于所给的函数值来帮你估算各导数值。估算的原则是保证导数值能够正确的反映散点图的形状和变化趋势。比如在散点图是单调递增的区间内,相应点的导数值就会是正的;在散点图表现出存在局部极值点的区间,相应的导数也会产生正负的变化。
在matlab的帮助里可以找到详细的解释,但要了解算法的细节,就要看pchip的函数文件了。

来源:https://zhidao.baidu.com/question/573024605.html

分段三次Hermite插值及其与三次样条的比较的更多相关文章

  1. hermite插值

    Hermite 插值就是要求插值函数不仅经过所给节点,而且要保证在该点的导数也相等.<备注:虽然还不理解这句话,但是还是先放这里!> 所谓样条曲线(Spline Curves)是指给定一组 ...

  2. SSE图像算法优化系列十八:三次卷积插值的进一步SSE优化。

    本文是在学习https://blog.csdn.net/housisong/article/details/1452249一文的基础上对算法的理解和重新整理,再次非常感谢原文作者的深入分析以及分享. ...

  3. 数值计算方法实验之按照按三弯矩方程及追赶法的三次样条插值 (MATLAB 代码)

    一.实验目的 在已知f(x),x∈[a,b]的表达式,但函数值不便计算,或不知f(x),x∈[a,b]而又需要给出其在[a,b]上的值时,按插值原则f(xi)= yi(i= 0,1…….,n)求出简单 ...

  4. [Python] Hermite 插值

    # -*- coding: utf-8 -*- #Program 0.5 Hermite Interpolation import matplotlib.pyplot as plt import nu ...

  5. Vue学习之路第三篇:插值表达式和v-text的区别

    上一篇说到插值表达式有一个问题: 页面频繁刷新或者网速加载很慢的时候,页面会先出现“{{ msg }}”,再一闪而过出现真实的数据. 对于这个问题Vue给予了解决办法,看具体事例. <div i ...

  6. 两点三次Hermiter插值C++代码

    #include <math.h> #include <gl/glut.h> #include <iostream> using namespace std; st ...

  7. Matlab随笔之插值与拟合(上)

    原文:Matlab随笔之插值与拟合(上) 1.拉格朗日插值 新建如下函数: function y=lagrange(x0,y0,x) %拉格朗日插值函数 %n 个节点数据以数组 x0, y0 输入(注 ...

  8. Matlab hermite

    保形分段三次hermite插值 % 这是MATLAB里面的pchip.m文件.这里把它的凝视改写成汉语,主要是想弄清楚它是怎么计算在节点处的导数的. function v = pchip(x,y,xx ...

  9. 多普勒失真信号采样Matlab模拟分析

    多普勒失真信号采样Matlab模拟分析 方案 水声通信指的是使用声信号在水中数据传输. 相对而言.电磁信号在水中吸收严重衰减过快,光信号受水中悬浮颗粒的影响,也无法完毕远距离传输. 这两种信号的传播距 ...

随机推荐

  1. LeetCode 669. 修剪二叉搜索树(Trim a Binary Search Tree)

    669. 修剪二叉搜索树 669. Trim a Binary Search Tree 题目描述 LeetCode LeetCode669. Trim a Binary Search Tree简单 J ...

  2. Python学习日记(一) String函数使用

    s = "abcaDa a" s2 = "123a abc ABCSAa s " s3 = "\tas \t\tb123" s4 = ' & ...

  3. 用Python递归做个多层次的文件执行

    想用 递归实现多层次的 '.py'执行但是发现好像不能 import os def func(path): if os.path.isdir(path): for name in os.listdir ...

  4. R学习笔记2 因子

    特殊值: 缺失值 NA(Not Avaiable),是不可用的缩写: NaN为“不是一个数”,意味着计算没有数学意义: NULL值,空值,表示一个空的变量,不会占用任何空间,通过is.null(x)来 ...

  5. Selenium_css 元素定位

    1.通过id定位       # 代表id driver.find_element_by_css_selector("#kw").send_keys("hao" ...

  6. golang --iota 用法

    package main import "fmt" func main() { const ( a = iota //0 b //1 c //2 d = "ha" ...

  7. Linux守护进程编写指南

    Linux守护进程编写指南 守护进程(Daemon)是运行在后台的一种特殊进程.它独立于控制终端并且周期性地执行某种任务或等待处理某些发生的事件.守护进程是一种很有用的进 程.Linux的大多数服务器 ...

  8. MY SQL 两种安装方式

    MySQL基础知识-安装MySQL   前导: 昨天去参加了一个面试,公司不太大,是一家日资企业,在国内有几家分公司,面试官问到了MySQL的基本操作和性能优化,说了一大堆,倒是比较轻松的过了,但是面 ...

  9. java之struts2之文件上传

    1.在大多数应用中,都有文件上传功能.有两种文件上传的方式,一种是自己去解析http协议,获取文件上传的内容.另一种是通过第三方插件来实现文件上传.第三方插件一般有两种,smartfileupload ...

  10. SQL Server 截取日期部分字符

    select GetDate() --用DateName()就可以获得相应的年.月.日 Select Datename(year,GetDate())+'-'+Datename (month,GetD ...