function [yi] = interp1TestHermite(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% 修正Akima插值计算点的导数
len = length(x);
extendInt = 0;
slope = (y(2 : end) - y(1 : end -1))./(x(2 : end) - x(1 : end -1));w1 = zeros(1, len-1);
w2 = zeros(1, len-1);for i = 3 : len-2w1(i) = abs(slope(i+1+extendInt) - slope(i+extendInt)) + abs(slope(i+1+extendInt) + slope(i+extendInt))/2;w2(i) = abs(slope(i-1+extendInt) - slope(i-2+extendInt)) + abs(slope(i-1+extendInt) + slope(i-2+extendInt))/2;
end
d = zeros(1, len-1);
for i = 3 : len-2d(i) = w1(i)/(w1(i)+w2(i))*slope(i-1+extendInt) + w2(i)/(w1(i)+w2(i)) * slope(i+extendInt);
end% 三次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);yi(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;%     % 已知x的间距全部为1
%     frac = xi(i)-x(xIndex);
%     fracInv = frac - 1;
%     yi(i) = ((1+2*frac)*y(xIndex) + frac * d(xIndex))*fracInv*fracInv  + ...
%             ((1-2*fracInv)*y(xIndex+1) + fracInv * d(xIndex+1))*frac*frac;
endend
function [yi] = interp1TestHermiteMakima(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% 修正Akima插值计算点的导数
len = length(x);
if len < 2error('the lenth of x can not be smaller than 2!');
end
extendInt = 2;
slope0 = (y(2 : end) - y(1 : end -1))./(x(2 : end) - x(1 : end -1));
% slope 需要向左和右各扩展两个点
slope = zeros(1, length(slope0)+2*extendInt);
slope(3 : end-2) = slope0;
if len >= 3slope(1) = 2*slope0(1) - slope0(2);slope(2) = 3*slope0(1) - 2 * slope0(2);slope(end-1) = 2*slope0(end) - slope0(end-1);slope(end) = 3*slope0(end) - 2*slope0(end-1);
end
if len == 2slope(1) = slope0(1);slope(2) = slope0(1);slope(end-1) = slope0(1);slope(end) = slope0(1);
endw1 = zeros(1, len-1);
w2 = zeros(1, len-1);for i = 3-extendInt : len-2+extendIntw1(i) = abs(slope(i+1+extendInt) - slope(i+extendInt)) + abs(slope(i+1+extendInt) + slope(i+extendInt))/2;w2(i) = abs(slope(i-1+extendInt) - slope(i-2+extendInt)) + abs(slope(i-1+extendInt) + slope(i-2+extendInt))/2;
end
d = zeros(1, len-1);
for i = 3-extendInt : len-2+extendIntd(i) = w1(i)/(w1(i)+w2(i))*slope(i-1+extendInt) + w2(i)/(w1(i)+w2(i)) * slope(i+extendInt);
end
d(isnan(d)) = 0;% 三次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;endend
clc
clear all; close all;%% 测试只考虑中间部分的hermite插值
slen = 16;
space = 0.1;
x = 1 : slen;
y = rand(1, slen)*10;
xi = 3 : space : slen-2 ;
yi = interp1(x, y, xi, 'makima');
yis = interp1TestHermite(x, y, xi);figure
plot(x,y,'*-', xi, yi, 'r*-', xi, yis, 'bo-');
legend('origin data','matlab interp1-makima', 'hermite-makima');
title('interpolation hermite-makima test');
mean((yis - yi))%% 测试只有两个点的makima修正的hermite插值
slen = 2;
space = 0.1;
x = 1 : slen;
y = rand(1, slen)*10;
xi = 1 : space : slen ;
yi = interp1(x, y, xi, 'makima');
yis = interp1TestHermiteMakima(x, y, xi);figure
plot(x,y,'*-', xi, yi, 'r*-', xi, yis, 'bo-');
legend('origin data','matlab interp1-makima', 'hermite-makima(two points)');
title('interpolation hermite-makima only two point test');
mean((yis - yi))%% 测试包含多个点的makima修正hermite插值
slen = 16;
space = 0.1;
x = 1 : slen;
y = rand(1, slen)*10;
xi = 1 : space : slen ;
yi = interp1(x, y, xi, 'makima');
yis = interp1TestHermiteMakima(x, y, xi);figure
plot(x,y,'*-', xi, yi, 'r*-', xi, yis, 'bo-');
legend('origin data','matlab interp1-makima', 'hermite-makima');
title('interpolation hermite-makima extral four-points');
mean((yis - yi))

代码如上所示,分别测试了不外扩的makima修正三阶hermite插值、外扩4个点的makima修正三阶hermite插值(仅包含两个点,包含多个点的情况)。结果如图所示。


Makima修正Hermite插值相关推荐

  1. Hermite插值是牛顿插值的极限情形

    Hermite插值可以看作牛顿插值的极限状况.为什么可以这么说呢?我们来看一个实例: 构造一个三次多项式 $p_3$ 使得 $p_3(0)=0$,$p_3(1)=1,p_3'(0)=1,p_3'(1) ...

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

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

  3. 埃尔米特(Hermite)插值

    Hermite插值满足在节点上等于给定函数值,而且在节点上的导数值也等于给定的导数值.对于高阶导数的情况,Hermite插值多项式比较复杂,在实际情况中,常常遇到的是函数值与一阶导数给定的情况.在此情 ...

  4. c语言埃尔米特插值思路,【数学建模算法】(26)插值和拟合:埃尔米特(Hermite)插值和样条插值...

    1.埃尔米特(Hermite)插值 1.1.Hermite插值多项式 如果对插值函数,不仅要求它在节点处与函数同值,而且要求它与函数有相同的一阶.二阶甚至更高阶的导数值,这就是 Hermite 插值问 ...

  5. 艾尔米特插值的MATLAB实现,埃尔米特(Hermite)插值

    Hermite插值满足在节点上等于给定函数值,而且在节点上的导数值也等于给定的导数值.对于高阶导数的情况,Hermite插值多项式比较复杂,在实际情况中,常常遇到的是函数值与一阶导数给定的情况.在此情 ...

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

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

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

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

  8. C#实现拉格朗日、牛顿、Hermite插值

    拉格朗日.牛顿插值法 初始时需要至少两个参考坐标点,在参考点的基础之上构造插值函数y=f(x),然后由插值函数确定需要求解的x坐标的函数值.相较于拉格朗日插值,牛顿插值公式更加复杂,但是在增加一个参考 ...

  9. 【12月学习进度3/31—计算机图形学期末准备01】拉格朗日插值 + 三次Hermite插值

    相关概念 型值点:事先给定的离散点 插值:得到的曲线通过所有的型值点 逼近:不要求通过给定的所有型值点,用给定型值点控制曲线形状 Hermite多项式 拉格朗日插值 拉格朗日插值是当 j=0j=0j= ...

  10. Hermite插值及其Julia实现

    文章目录 基本原理 算法实现 无论是Newton插值还是Lagrange插值,都只能在数值本身上满足插值函数与数据节点的重合,Hermite插值则要求其导数值相等. 基本原理 设在节点 a ⩽ x 0 ...

最新文章

  1. Swift之缓存文件处理
  2. 玩转u-boot之【初探环境变量env/bootcmd/bootargs】
  3. 阿里云+wordpress搭建个人网站及博客
  4. python内置函数map_Python内置函数(34)——map
  5. 梯度投影算法 matlab,梯度投影法及其Matlab实现
  6. OpenSSL新手自学:如何生成RSA私钥并用于数字签名
  7. 天下无贼中经典的句子
  8. Leetcode 1218.最长定差子序列
  9. 国外大牛最终还是放弃迁移到微服务,为什么?
  10. Logistic回归以及LR与SVM异同
  11. Foobar2000中文版增强安装版
  12. vue整合ueditor
  13. Anaconda安装python包的几种方法
  14. idm站点抓取不了html,IDM站点抓取功能使用详解(下)
  15. 手机wps怎么设置打印横竖_wps怎么设置横向打印
  16. 识别“百度权重”作弊的方法
  17. connect to address IP: No route to host
  18. Hugo 建站经验之谈
  19. 顺序结构不属于python语言控制结构_顺的解释|顺的意思|汉典“顺”字的基本解释...
  20. 什么是梯度爆炸与梯度消失

热门文章

  1. mac使用bootcamp安装win7遇到的一些坑
  2. 狮子鱼社区团购小程序独立版 安装教程及后台设置小程序APPID,微信支付,腾讯地图AppKey
  3. linux 设置注释颜色,【转】vim注释和光标高亮行列的颜色设置
  4. python卡方拟合优度检验_如何理解拟合优度检验 ?
  5. 通过CImageList加载图标 报错
  6. Nokia最新PC套件下载 Nokia PC Suite 6.86.9.0 手机型号和PC套件对应表最新7.1
  7. windows下面刷新dns
  8. 关于网络知识(网络运作方式)的常识
  9. 彩虹六号按键精灵挂机脚本制作教程
  10. matlab潮流计算ppt,matlab潮流计算.doc