]> Creatis software - CreaPhase.git/blob - octave_packages/m/polynomial/mkpp.m
update packages
[CreaPhase.git] / octave_packages / m / polynomial / mkpp.m
1 ## Copyright (C) 2000-2012 Paul Kienzle
2 ##
3 ## This file is part of Octave.
4 ##
5 ## Octave is free software; you can redistribute it and/or modify it
6 ## under the terms of the GNU General Public License as published by
7 ## the Free Software Foundation; either version 3 of the License, or (at
8 ## your option) any later version.
9 ##
10 ## Octave is distributed in the hope that it will be useful, but
11 ## WITHOUT ANY WARRANTY; without even the implied warranty of
12 ## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
13 ## General Public License for more details.
14 ##
15 ## You should have received a copy of the GNU General Public License
16 ## along with Octave; see the file COPYING.  If not, see
17 ## <http://www.gnu.org/licenses/>.
18
19 ## -*- texinfo -*-
20 ## @deftypefn  {Function File} {@var{pp} =} mkpp (@var{breaks}, @var{coefs})
21 ## @deftypefnx {Function File} {@var{pp} =} mkpp (@var{breaks}, @var{coefs}, @var{d})
22 ##
23 ## Construct a piecewise polynomial (pp) structure from sample points
24 ## @var{breaks} and coefficients @var{coefs}.  @var{breaks} must be a vector of
25 ## strictly increasing values.  The number of intervals is given by
26 ## @code{@var{ni} = length (@var{breaks}) - 1}.
27 ## When @var{m} is the polynomial order @var{coefs} must be of
28 ## size: @var{ni} x @var{m} + 1.
29 ##
30 ## The i-th row of @var{coefs},
31 ## @code{@var{coefs} (@var{i},:)}, contains the coefficients for the polynomial
32 ## over the @var{i}-th interval, ordered from highest (@var{m}) to
33 ## lowest (@var{0}).
34 ##
35 ## @var{coefs} may also be a multi-dimensional array, specifying a vector-valued
36 ## or array-valued polynomial.  In that case the polynomial order is defined
37 ## by the length of the last dimension of @var{coefs}.
38 ## The size of first dimension(s) are given by the scalar or
39 ## vector @var{d}.  If @var{d} is not given it is set to @code{1}.
40 ## In any case @var{coefs} is reshaped to a 2-D matrix of
41 ## size @code{[@var{ni}*prod(@var{d} @var{m})] }
42 ##
43 ## @seealso{unmkpp, ppval, spline, pchip, ppder, ppint, ppjumps}
44 ## @end deftypefn
45
46 function pp = mkpp (x, P, d)
47
48   # check number of arguments
49   if (nargin < 2 || nargin > 3)
50     print_usage ();
51   endif
52
53   # check x
54   if (length (x) < 2)
55     error ("mkpp: at least one interval is needed");
56   endif
57
58   if (!isvector (x))
59     error ("mkpp: x must be a vector");
60   endif
61
62   len = length (x) - 1;
63   dP = length (size (P));
64
65   pp = struct ("form", "pp",
66                "breaks", x(:).',
67                "coefs", [],
68                "pieces", len,
69                "order", prod (size (P)) / len,
70                "dim", 1);
71
72   if (nargin == 3)
73     pp.dim = d;
74     pp.order /= prod (d);
75   endif
76
77   dim_vec = [pp.pieces * prod(pp.dim), pp.order];
78   pp.coefs = reshape (P, dim_vec);
79
80 endfunction
81
82 %!demo # linear interpolation
83 %! x=linspace(0,pi,5)';
84 %! t=[sin(x),cos(x)];
85 %! m=diff(t)./(x(2)-x(1));
86 %! b=t(1:4,:);
87 %! pp = mkpp(x, [m(:),b(:)]);
88 %! xi=linspace(0,pi,50);
89 %! plot(x,t,"x",xi,ppval(pp,xi));
90 %! legend("control","interp");
91
92 %!shared b,c,pp
93 %! b = 1:3; c = 1:24; pp=mkpp(b,c);
94 %!assert (pp.pieces,2);
95 %!assert (pp.order,12);
96 %!assert (pp.dim,1);
97 %!assert (size(pp.coefs),[2,12]);
98 %! pp=mkpp(b,c,2);
99 %!assert (pp.pieces,2);
100 %!assert (pp.order,6);
101 %!assert (pp.dim,2);
102 %!assert (size(pp.coefs),[4,6]);
103 %! pp=mkpp(b,c,3);
104 %!assert (pp.pieces,2);
105 %!assert (pp.order,4);
106 %!assert (pp.dim,3);
107 %!assert (size(pp.coefs),[6,4]);
108 %! pp=mkpp(b,c,[2,3]);
109 %!assert (pp.pieces,2);
110 %!assert (pp.order,2);
111 %!assert (pp.dim,[2,3]);
112 %!assert (size(pp.coefs),[12,2]);