保形分段三次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. Hacker News网站的文章排名算法工作原理

    In this post I'll try to explain how Hacker News ranking algorithm works and how you can reuse it in ...

  2. HUNNU11342:Chemistry(模拟)

    http://acm.hunnu.edu.cn/online/?action=problem&type=show&id=11342 Problem description The ch ...

  3. NTP工作机制及时间同步的方法

    Network Time Protocol(NTP)是用来使计算机时间同步化的一种协议,它能够使计算机对其server或时钟源做同步化,它能够提供高精准度的时间校正,且可用加密确认的方式来防止恶毒的协 ...

  4. pc2日记——有惊无险的第二天2014/08/29

    今天下午如期的用pc2进行了第二场比赛.因为昨天的出错经历和早上充足的准备,下午的比赛尽管在開始的时候出了点小小的问题,但总的来说还是非常成功的. 早上八点过去504開始又一次配置client,由于开 ...

  5. jbpm部署流程定义到MySql报乱码解决方案

    问题起因: 我在使用ant将流程定义和流程相关资源部署到JBPM数据库中的时候,报了下面一个错误. 错误提示,大概是: 11:33:40,781 ERROR JDBCExceptionReporter ...

  6. Oracle SQL语句执行过程

    前言 QQ群讨论的时候有人遇到这样的问题:where子句中无法访问Oracle自定义的字段别名.这篇 博客就是就这一问题做一个探讨,并发散下思维,谈谈SQL语句的执行顺序问题. 问题呈现 直接给出SQ ...

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

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

  8. CF 327D - Block Tower 数学题 DFS 初看很难,想通了就感觉很简单

    D. Block Tower time limit per test 2 seconds memory limit per test 256 megabytes input standard inpu ...

  9. C语言 realloc为什么要有返回值,realloc返回值具体解释/(解决随意长度字符串输入问题)。

    在C语言操作中会用到大量的内存操作,当中非经常常使用的一个是realloc(). 由字面意思能够知道,该函数的作用是用于又一次分配内存. 使用方式例如以下: NewPtr=(数据类型*)realloc ...

  10. javascript (四) 改变html样式

    <h1 id="domo"> this is testing test</h1> <script> function changecolor() ...