annotate main/splines/pchip.m @ 0:6b33357c7561 octave-forge

Initial revision
author pkienzle
date Wed, 10 Oct 2001 19:54:49 +0000
parents
children 4890c0365bc5
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
1 ## Copyright (C) 2001 Kai Habel
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
2 ##
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
3 ## This program is free software; you can redistribute it and/or modify
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
4 ## it under the terms of the GNU General Public License as published by
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
5 ## the Free Software Foundation; either version 2 of the License, or
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
6 ## (at your option) any later version.
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
7 ##
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
8 ## This program is distributed in the hope that it will be useful,
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
9 ## but WITHOUT ANY WARRANTY; without even the implied warranty of
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
10 ## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
11 ## GNU General Public License for more details.
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
12 ##
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
13 ## You should have received a copy of the GNU General Public License
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
14 ## along with this program; if not, write to the Free Software
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
15 ## Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
16
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
17 ## -*- texinfo -*-
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
18 ## @deftypefn {Function File} {@var{pp} = } pchip (@var{x}, @var{y})
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
19 ## @deftypefnx {Function File} {@var{yi} = } pchip (@var{x}, @var{y}, @var{xi})
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
20 ## piecewise cubic hermite interpolating polynom.
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
21 ## pchip preserves the monotonicity of (x,y)
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
22 ##
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
23 ## @seealso{ppval, spline, csape}
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
24 ## @end deftypefn
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
25
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
26 ## Author: Kai Habel <kai.habel@gmx.de>
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
27 ## Date: 9. mar 2001
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
28 ## 2001-04-03 Paul Kienzle
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
29 ## * move (:) from definition of l,r to use of l,r so it works with 2.0
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
30
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
31 ## S_k = a_k + b_k*x + c_k*x^2 + d_k*x^3; (spline polynom)
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
32 ##
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
33 ## 4 conditions:
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
34 ## S_k(x_k) = y_k;
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
35 ## S_k(x_k+1) = y_k+1;
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
36 ## S_k'(x_k) = y_k';
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
37 ## S_k'(x_k+1) = y_k+1';
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
38 ##
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
39 ## 22. april 2001: Hmm, something is wrong, it seems pchip doesn't
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
40 ## preserve the monotonicity, as expected. So if _you_ know how to
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
41 ## do it right, please contact me. Kai
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
42
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
43 function ret = pchip (x, y, xi)
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
44
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
45 if (nargin < 2 || nargin > 3)
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
46 usage ("pchip (x, y, [xi])");
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
47 endif
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
48
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
49 x = x(:);
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
50 n = length (x);
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
51
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
52 if (columns(y) == n) y = y'; endif
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
53
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
54 [ry,cy] = size (y);
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
55 if (cy > 1)
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
56 h = kron (diff (x), ones (1, cy));
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
57 else
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
58 h = diff (x);
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
59 endif
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
60
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
61 a = y;
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
62
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
63 dy = diff (y) ./ h;
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
64 t = diff (sign (dy)) == 0;
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
65 l = dy(1:n - 2, :);
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
66 r = dy(2:n - 1, :);
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
67 b = zeros (size (y));
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
68 s = reshape (0.5 * (l(:) + r(:)), ry - 2, cy);
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
69 b(2:ry - 1,:) = s .* t;
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
70
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
71 c = - (b(2:n, :) + 2 * b(1:n - 1, :)) ./ h + 3 * diff (a) ./ h .^ 2;
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
72
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
73 d = (b(1:n - 1, :) + b(2:n, :)) ./ h.^2 - 2 * diff (a) ./ h.^3;
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
74
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
75 d = d(1:n - 1, :); c = c(1:n - 1, :);
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
76 b = b(1:n - 1, :); a = a(1:n - 1, :);
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
77
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
78 coeffs = [d(:), c(:), b(:), a(:)];
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
79 pp = mkpp (x, coeffs);
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
80
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
81 if (nargin == 2)
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
82 ret = pp;
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
83 else
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
84 ret = ppval(pp,xi);
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
85 endif
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
86
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
87 endfunction