保形分段三次hermite插值

% 这是MATLAB里面的pchip.m文件。这里把它的凝视改写成汉语,主要是想弄清楚它是怎么计算在节点处的导数的。



function v = pchip(x,y,xx)

%输入:n个插值节点的纵坐标向量x;横坐标向量y;插值点xx。

%输出:分段三次Hermite插值结果。

%   PCHIP  Piecewise Cubic Hermite Interpolating Polynomial.

%   PP = PCHIP(X,Y)为X处的值Y提供了一种特定的保形分段三次厄尔米特插值(shape-preserving piecewise cubic Hermite interpolant)

%   的分段多项式形式,在后面的PPVAL和样条功能UNMKPP(spline utility UNMKPP)将用到这个函数。

%   X必须是个向量。

%   假设Y是个向量,则Y的第j个元素Y(j)被取为和X的第j个元素X(j)匹配的值,因此Y和X的长度必须一样。

%   假设Y是一个矩阵,或者N维数组,则Y(:,...,:,j)被取为和X(j)相匹配的值,因此Y的最后一维必须等于length(X).

%   YY = PCHIP(X,Y,XX)和YY = PPVAL(PCHIP(X,Y),XX)是一样的,因此在YY中给出了在XX处的插值。

%   PCHIP插值函数p(x)满足:

%   在每一个子区间X(k) <= x <= X(k+1),p(x)都是三阶Hermite插值多项式(给定插值点和两个端点的斜率)。

%   因而。p(x) interpolates Y,也就是说。p(X(j)) = Y(:,j),而且一阶导数Dp(x)是连续的,可是

%   二阶导数D^2p(x)可能不是连续的;在X(j)处可能会出现跳跃.

%   在X(j)处的斜率的选取方法。确保了p(x)是"shape preserving"和"respects monotonicity"的,

%   这意味着,在那些数据是单调的区间里,p(x)也是单调的;在那些数据是局部极值(local extremum)的点,

%   p(x)也取局部极值。

%

%  PCHIP与SPLINE的对照:

%   SPLINE提供的函数s(x)的构建方法和PCHIP里面的函数p(x)全然同样,仅仅只是在X(j)处的斜率的选择方法不一样,

%   SPLINE函数的s(x)在X(j)的二阶导数D^2s(x)也是连续的,这导致了例如以下结果:

%   SPLINE更加光滑。也就是说。D^2s(x)是连续的。

%   假设数据是一个光滑函数的值。则SPLINE更加精确。

%   假设数据不是光滑的,则PCHIP没有overshoots,也不太震荡(less oscillation)。

%   PCHIP建立的难度较小(is less expensive to set up).

%   这两种函数预计的难度是一样的。



%   样条比pchip光滑,样条的两阶导数连续。而pchip一阶导数连续。不连续的两阶导数隐含着不连续的曲率。

人的眼睛能够检測出图形上曲率的不连续。还有一方面,pchip是保形状的,而样条不一定保形状。



%

%   样例:

%     x = -3:3;

%     y = [-1 -1 -1 0 1 1 1];

%     t = -3:.01:3;

%     plot(x,y,'o',t,[pchip(x,y,t); spline(x,y,t)])

%     legend('data','pchip','spline',4)

%

%   Class support for inputs x, y, xx:

%      float: double, single

%

%   还可參见INTERP1, SPLINE, PPVAL, UNMKPP.



% 參考文献:

%   F. N. Fritsch and R. E. Carlson, "Monotone Piecewise Cubic

%   Interpolation", SIAM J. Numerical Analysis 17, 1980, 238-246.

%   David Kahaner, Cleve Moler and Stephen Nash, Numerical Methods

%   and Software, Prentice Hall, 1988.

%

%   Copyright 1984-2004 The MathWorks, Inc.

%   $Revision: 1.7.4.4 $  $Date: 2004/03/02 21:47:53 $



% 检验数据的可接受性,假设不可接受,则对其进行适当的调整

[x,y,sizey] = chckxy(x,y);          %chckxy返回三个变量:x,y,和sizey。

可是不知道chckxy是什么意思。

n = length(x);                      %n为向量x的长度。也就是后面要用的节点数目。

h = diff(x);                        %diff表示把向量x的相邻元素相减。

得到h=[X(2)-X(1) X(3)-X(2) ... X(n)-X(n-1)]

m = prod(sizey);                    %



%确保插值点是实数

if nargin==3 && any(~isreal(reshape(xx,numel(xx),1)))

  error('MATLAB:pchip:ComplexInterpPts',...

        'The interpolation points should be real.')

end



%计算斜率

del = diff(y,1,2)./repmat(h,m,1);

% diff(y,n,dim)是在标量dim指定的维度上进行n次差分。假设阶数n等于或超过第dim维的长度,则diff返回一个空的数组。

% 比如y=[1 3 4 6 9 10 8 12];则diff(y,1,2)=[2 1 2 3 1 -2 4];

% repmat(h,m,1)把矩阵h在纵向方面复制m次。二者相除就是一阶差商。

slopes = zeros(size(y));                                % 设定一个全是0的向量。准备存放斜率数值。

for r = 1:m

      slopes(r,:) = pchipslopes(x,y(r,:),del(r,:));     %调用函数见下。

end



% 对上述值x,y,和斜率计算分段三次Hermite插值

v = pwch(x,y,slopes,h,del); v.dim = sizey;

if nargin == 3   % if values are wanted instead, provide them

   v = ppval(v,xx);

end







% 以下是计算节点处的斜率的函数pchipslopes------------------------------------------

function d = pchipslopes(x,y,del)

%PCHIPSLOPES Derivative values for shape-preserving Piecewise Cubic Hermite Interpolation.

% d = pchipslopes(x,y,del)计算一阶导数d(k)=P'(x(k)).



% 特殊情况:n=2,此时使用线性插值.

   n = length(x);

   if n==2 

      d = repmat(del(1),size(y));

      return

   end



%  内点(interior points)处的斜率.

%  假设第k个节点处的左右差商del(k-1)和del(k)符号同样,则设定d(k)等于二者的加权平均。

%  假设第k个节点处的左右差商del(k-1)和del(k)符号相反,或者当中一个为0。则设定d(k)=0.

   d = zeros(size(y));

   if isreal(del)                                          %假设del是实数。

k = find(sign(del(1:n-2)).*sign(del(2:n-1)) > 0);    %则把其左右差商同号的那个序号赋值给k.

   else

      k = find(~(del(1:n-2) == 0 & del(2:n-1) == 0));

   end

   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));

%函数congj(a)返回数组a的每一个元素的共轭复数组成的数组。



  

%  区间端点处的斜率(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 isreal(d) && (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);

   end

   d(n) = ((2*h(n-1)+h(n-2))*del(n-1) - h(n-1)*del(n-2))/(h(n-1)+h(n-2));

   if isreal(d) && (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

Matlab hermite的更多相关文章

  1. Matlab插值函数

    x=0:2*pi; y=sin(x); xx=0:0.5:2*pi; %interp1对sin函数进行分段线性插值,调用interp1的时候,默认的是分段线性插值 y1=interp1(x,y,xx) ...

  2. Interpolation in MATLAB

    Mathematics     One-Dimensional Interpolation There are two kinds of one-dimensional interpolation i ...

  3. matlab 2012 vs2010混合编程

    电脑配置: 操作系统:window 8.1 Matlab 2012a安装路径:D:\Program Files\MATLAB\R2012a VS2010 : OpenCV 2.4.3:D:\Progr ...

  4. MATLAB函数表(转自:http://bbs.06climate.com/forum.php?mod=viewthread&tid=16041&extra=page%3D4)

    MATLAB函数表 4.1.1特殊变量与常数 ans 计算结果的变量名 computer 确定运行的计算机 eps 浮点相对精度 Inf 无穷大 I 虚数单位 inputname 输入参数名 NaN ...

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

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

  6. Matlab中插值函数汇总(上)

    Matlab中插值函数汇总分上下两个部分,主要整合自matlabsky论坛dynamic发表于2009-2-21 21:53:26 的主题帖,以及豆丁网rickoon上传的教材第8章<插值,拟合 ...

  7. [转载]Matlab中插值函数汇总和使用说明

    http://blog.sciencenet.cn/blog-457143-679275.html MATLAB中的插值函数为interp1,其调用格式为:  yi= interp1(x,y,xi,' ...

  8. MATLAB数学实验总结

    L1 MATLAB 基础知识 P6 表1-3 数据显示格式 format rat format long P20 表2-5 常用的矩阵函数 zeros(m,n) %零阵 eye(n) %单位阵 one ...

  9. matlab 常用函数汇总

    1. 特殊变量与常数 主题词 意义 主题词 意义 ans 计算结果的变量名 computer 确定运行的计算机 eps 浮点相对精度 Inf 无穷大 I 虚数单位 inputname 输入参数名 Na ...

随机推荐

  1. Type Unknown error: java.lang.NullPointerException

    Android 项目开发的时候 出现: Description Resource Path Location Type Unknown error: java.lang.NullPointerExce ...

  2. JAVA中IO和NIO的详解分析,内容来自网络和自己总结

    用一个例子来阐释: 一辆客车上有10个乘客,他们的目的地各不相同,当没有售票员的时候,司机就需要不断的询问每一站是否有乘客需要下车,需要则停下,不需要则继续开车,这种就是阻塞的方式. 当有售票员的时候 ...

  3. STL之涉及到的算法

    一.非变异算法 是一组不破坏操作数据的模板函数,用来对序列数据进行逐个处理.元素查找.子序列搜索.统计和匹配.非变异算法具有极为广泛的适用性,基本上可应用与各种容器. 1查找容器元素find 它用于查 ...

  4. 使用简单的 5 个步骤设置 Web 服务器集群

    通过在多个处理器之间分担工作负载并采用多种软件恢复技术,能够提供高度可用的环境并提高环境的总体 RAS(可靠性.可用性和可服务性).可以得到的好处包括:更快地从意外中断中恢复运行,以及将意外中断对终端 ...

  5. js 常用正则表达式分析详解

    1.整数或者小数:/^((0{1}|[1-9]{1}[0-9]+)\.{1}[0-9]+|[1-9]{1}[0-9]*|0)$/ 分析:分类讨论,如果是小数,则有两种形式   0.111对应的是 0{ ...

  6. uva 10655 - Contemplation! Algebra(矩阵高速幂)

    题目连接:uva 10655 - Contemplation! Algebra 题目大意:输入非负整数,p.q,n,求an+bn的值,当中a和b满足a+b=p,ab=q,注意a和b不一定是实数. 解题 ...

  7. Memcahce(MC)系列(一)Memcache介绍、使用、存储、算法、优化

    写在前面:前不久在工作中被问到关于MC一致哈希的问题,由于时隔太久差点儿忘记,特前来恶补一下MC,下面是前几年在工作中学习MC时的一些资料,来历不明,特整理一下,希望对大家的学习也能有帮助. 32 的 ...

  8. HDU 4921 Map

    题意: 给n个节点  他们形成了最多10条链  每条最多1000的长度  每一个节点有个val  你能够选择任何位置截断链  断点前的全部节点被你获得  通过题中计算公式得出你的val  问  通过随 ...

  9. win7下怎样设置putty免用户名密码登陆

    putty是一款好用的远程登录linux服务器软件,但每次输入用户名密码毕竟有些烦人,这里教你免用户名密码登陆.   工具/原料 putty 方法/步骤   去百度下载putty,小巧易用,仅有0.5 ...

  10. Note:This element neither has attached source nor attached Javadoc

    在用Eclipse编写程序时,发现把鼠标放到类名上时出现标题的提示 解决方法: 右击项目,选择 properties –> Java Build Path –> Libraries,如图 ...