pchip-三阶Hermite插值
使用MATLAB测试pchip方法,其中Function pchipslopes是从MATLAB处拷贝而来。
function [yi] = interp1TestHermitePchip(x, y, xi)
% 测试makima插值
% 输入 - x: 距离, y: 函数值 , xi 待插值点
% 输出 - yi: 待插值点的函数值
% 不考虑越界的情况% 保证一维输入且x与y的长度一致
sizex = (size(x));
sizey = (size(y));
if ~(sizex(1)*sizex(2)==sizex(1) || sizex(1)*sizex(2)==sizex(2)) || ~(sizey(1)*sizey(2)==sizey(1) || sizey(1)*sizey(2)==sizey(2))error('the input x or y must be one dimension!')
endif length(x) ~= length(y)error('the lenth of x or y must be same!');
end% 插值计算点的导数
len = length(x);
if len < 2error('the lenth of x can not be smaller than 2!');
endslope = (y(2 : end) - y(1 : end -1))./(x(2 : end) - x(1 : end -1));d = pchipslopes(x,y,slope);% 三次hermite插值
yi = zeros(1, length(xi));
for i = 1 : length(xi)xIndex = 0;for j = 1 : 1 : length(x)if xi(i) - x(j) >= 0xIndex = j;endendfprintf(2, 'xIndex = %d\n', xIndex);if xIndex < 1xIndex = 1;endif xIndex >= lenxIndex = len - 1;endyi(i) = ((1+2*(xi(i)-x(xIndex))/(x(xIndex+1)-x(xIndex)))*y(xIndex) + (xi(i)-x(xIndex))*d(xIndex))*((xi(i)-x(xIndex+1))/(x(xIndex)-x(xIndex+1)))^2+...((1+2*(xi(i)-x(xIndex+1))/(x(xIndex)-x(xIndex+1)))*y(xIndex+1) + (xi(i)-x(xIndex+1))*d(xIndex+1))*((xi(i)-x(xIndex))/(x(xIndex+1)-x(xIndex)))^2;endfunction d = pchipslopes(x,y,del)
% copy from MATLAB
% d = pchipslopes(x,y,del) computes the first derivatives, d(k) = P'(x(k)).% Special case n=2, use linear interpolation.n = length(x);if n==2 d = repmat(del(1),size(y));returnend% Slopes at interior points.
% d(k) = weighted average of del(k-1) and del(k) when they have the same sign.
% d(k) = 0 when del(k-1) and del(k) have opposites signs or either is zero.d = zeros(size(y));k = find(sign(del(1:n-2)).*sign(del(2:n-1)) > 0);h = diff(x);hs = h(k)+h(k+1);w1 = (h(k)+hs)./(3*hs);w2 = (hs+h(k+1))./(3*hs);dmax = max(abs(del(k)), abs(del(k+1)));dmin = min(abs(del(k)), abs(del(k+1)));d(k+1) = dmin./conj(w1.*(del(k)./dmax) + w2.*(del(k+1)./dmax));% Slopes at end points.
% Set d(1) and d(n) via non-centered, shape-preserving three-point formulae.d(1) = ((2*h(1)+h(2))*del(1) - h(1)*del(2))/(h(1)+h(2));if sign(d(1)) ~= sign(del(1))d(1) = 0;elseif (sign(del(1)) ~= sign(del(2))) && (abs(d(1)) > abs(3*del(1)))d(1) = 3*del(1);endd(n) = ((2*h(n-1)+h(n-2))*del(n-1) - h(n-1)*del(n-2))/(h(n-1)+h(n-2));if sign(d(n)) ~= sign(del(n-1))d(n) = 0;elseif (sign(del(n-1)) ~= sign(del(n-2))) && (abs(d(n)) > abs(3*del(n-1)))d(n) = 3*del(n-1);end
% testPchip.m文件
clc
% clear all; close all;%% 测试6个点的三次样条插值
slen = 12;
space = 0.1;
x = 1 : slen;
y = rand(1, slen)*10;
xi = 0 : space : slen+1;
yi = pchip(x, y, xi);yis = interp1TestHermitePchip(x, y, xi);yiPchip = interp1(x,y,xi,'pchip');mean(yi - yis)
mean(yiPchip-yi)figure
plot(x,y,'*-', xi, yi, 'r*-', xi, yis, 'bo-');
legend('origin data','matlab pchip','test pchip');
title('interpolation')
显示的图像为:
pchip-三阶Hermite插值相关推荐
- 机器人路径规划之分段三次Hermite插值(PCHIP) [包括Python和Matlab代码实现]
前言 在机器人的路径规划中针对离散采样点做插值计算生成平滑的曲线轨迹也是挺重要的一部分,本文主要介绍一下目前使用较多也是个人觉得挺好用的一个插值方法--分段三次 Hermite 插值(PCHIP),并 ...
- 【数学与算法】【分段三次Hermite插值】和【分段三次样条插值】
光滑曲线在数学上的定义是什么?? 原文链接:光滑曲线在数学上的定义是什么? 回答1: 定义:切线随切点的移动而连续转动. 若函数f(x)f(x)f(x)在区间(a,b)(a,b)(a,b)内具有一阶连 ...
- c语言埃尔米特插值思路,【数学建模算法】(26)插值和拟合:埃尔米特(Hermite)插值和样条插值...
1.埃尔米特(Hermite)插值 1.1.Hermite插值多项式 如果对插值函数,不仅要求它在节点处与函数同值,而且要求它与函数有相同的一阶.二阶甚至更高阶的导数值,这就是 Hermite 插值问 ...
- 数学建模准备 插值(拉格朗日多项式插值,牛顿多项式插值,分段线性插值,分段三次样条插值,分段三次Hermite插值)
文章目录 摘要(必看) 0 基础概念 什么是插值 插值用途 什么是拟合 插值和拟合的相同点 插值和拟合的不同点 1 常用的基本插值方法 1.1 多项式插值法 1.1.1 拉格朗日多项式插值法 多项式插 ...
- 插值与拟合 (一) : 拉格朗日多项式插值 、Newton插值 、分段线性插值、Hermite插值 、样条插值、 B 样条函数插值、二维插值
插值:求过已知有限个数据点的近似函数. 拟合:已知有限个数据点,求近似函数,不要求过已知数据点,只要求在某种意义下它在这些点上的总偏差最小. 插值和拟合都是要根据一组数据构造一个函数作为近似,由于近似 ...
- 数学建模之Hermite插值法和三次样条插值法(附上详细的matlab代码)
插值算法 一般定义 若P(x)为次数不超过n的代数多项式,即 P(x)=a0+a1x+...+anxnP(x)=a_0+a_1x+...+a_nx^n P(x)=a0+a1x+...+anxn ...
- 2021-07-21 分段三次Hermite插值及其与三次样条的比较
Numpy数组自身加和与乘积运算 http://www.weixueyuan.net/a/794.html python-scipy -hermite插值,分段三次Hermite插值 import n ...
- Hermite插值是牛顿插值的极限情形
Hermite插值可以看作牛顿插值的极限状况.为什么可以这么说呢?我们来看一个实例: 构造一个三次多项式 $p_3$ 使得 $p_3(0)=0$,$p_3(1)=1,p_3'(0)=1,p_3'(1) ...
- 埃尔米特(Hermite)插值
Hermite插值满足在节点上等于给定函数值,而且在节点上的导数值也等于给定的导数值.对于高阶导数的情况,Hermite插值多项式比较复杂,在实际情况中,常常遇到的是函数值与一阶导数给定的情况.在此情 ...
- 艾尔米特插值的MATLAB实现,埃尔米特(Hermite)插值
Hermite插值满足在节点上等于给定函数值,而且在节点上的导数值也等于给定的导数值.对于高阶导数的情况,Hermite插值多项式比较复杂,在实际情况中,常常遇到的是函数值与一阶导数给定的情况.在此情 ...
最新文章
- 在阿里当PM都需要做什么?
- Eclipse中新建WEB项目,JSP页面报错。
- 2-02字符编码的演化
- Algorithms_基础数据结构(02)_线性表之链表_单向链表
- mybatis的mapper.xml文件中含有中文注释时运行出错,mybatis配置优化和别名优化 mybatis配置之映射器说明
- 按值传递时 php必须复制值,PHP笔试题汇总
- php中var_dump()函数
- PHP物业居民小区业主房产办公管理系统源码-支持多小区管理系统
- 如何实现TextBox与DropDownList的级联
- AFNetworking 图片的本地缓存问题
- 穿越机F4飞控F405代码pcb文件,原理图
- c3300 京瓷km5050_京瓷复印机通用维修代码2
- 使用Androidkiller或APKIDE编译APK文件时出现libpng error: Not a PNG file的错误
- 天啦噜,小白后台的一波新功能,看完世界杯 看这里!(最后有福利 哦~~)
- for horner_霍纳法则(Horner Rule)
- nginx不转发static下文件_文件存储老大难,随取随用不心烦!玩转最强私人云盘群晖NAS(下)...
- POI设置和读取excel分组信息,多级分组设置
- IE8 base64 编码 解码
- SVM支持向量机-拉格朗日乘子与对偶问题(1)
- 遥感影像波段与波段合成