comparison doc/interpreter/splineimages.m @ 14509:a88f8e4fae56

New Function, splinefit.m * __splinefit__.m: New private file. Jonas Lundgren's splinefit.m with BSD License. Jonas emailed this version to Octave's developers. * splinefit.m: New File. Piece-wise polynomial fit. This is a wrapper for __splinefit__.m. The wrapper allows for Octave's tex-info documentation, demos, and tests to be added. In addition the input syntax has been sligtly modified to allow new options to be added without breaking compatiblity. * doc/splineimages.m: New file to produce splineimages<#> for the docs. * doc/images: Include splineimages.m and the figues for the docs. * scripts/polynomial/module.mk: Add new files. * doc/interpreter/poly.txi: Minimal description of splinefit.
author Ben Abbott <bpabbott@mac.com>
date Thu, 29 Mar 2012 19:13:21 -0400
parents
children e12945668746
comparison
equal deleted inserted replaced
14508:0901f926ed50 14509:a88f8e4fae56
1 ## Copyright (C) 2012 Ben Abbott, Jonas Lundgren
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 function splineimages (nm, typ)
20 graphics_toolkit ("gnuplot");
21 set_print_size ();
22 hide_output ();
23 if (strcmp (typ, "png"))
24 set (0, "defaulttextfontname", "*");
25 endif
26 if (strcmp (typ, "eps"))
27 d_typ = "-depsc2";
28 else
29 d_typ = cstrcat ("-d", typ);
30 endif
31
32 if (strcmp (typ, "txt"))
33 image_as_txt (nm);
34 elseif (strcmp (nm, "splinefit1")) ## Breaks and Pieces
35 x = 2 * pi * rand (1, 200);
36 y = sin (x) + sin (2 * x) + 0.2 * randn (size (x));
37 ## Uniform breaks
38 breaks = linspace (0, 2 * pi, 41); ## 41 breaks, 40 pieces
39 pp1 = splinefit (x, y, breaks);
40 ## Breaks interpolated from data
41 pp2 = splinefit (x, y, 10); ## 11 breaks, 10 pieces
42 ## Plot
43 xx = linspace (0, 2 * pi, 400);
44 y1 = ppval (pp1, xx);
45 y2 = ppval (pp2, xx);
46 plot (x, y, ".", xx, [y1; y2])
47 axis tight
48 ylim ([-2.5 2.5])
49 legend ("data", "41 breaks, 40 pieces", "11 breaks, 10 pieces")
50 print (cstrcat (nm, ".", typ), d_typ)
51 elseif (strcmp (nm, "splinefit2")) ## Spline orders
52 ## Data (200 points)
53 x = 2 * pi * rand (1, 200);
54 y = sin (x) + sin (2 * x) + 0.1 * randn (size (x));
55 ## Splines
56 pp1 = splinefit (x, y, 8, "order", 0); ## Piecewise constant
57 pp2 = splinefit (x, y, 8, "order", 1); ## Piecewise linear
58 pp3 = splinefit (x, y, 8, "order", 2); ## Piecewise quadratic
59 pp4 = splinefit (x, y, 8, "order", 3); ## Piecewise cubic
60 pp5 = splinefit (x, y, 8, "order", 4); ## Etc.
61 ## Plot
62 xx = linspace (0, 2 * pi, 400);
63 y1 = ppval (pp1, xx);
64 y2 = ppval (pp2, xx);
65 y3 = ppval (pp3, xx);
66 y4 = ppval (pp4, xx);
67 y5 = ppval (pp5, xx);
68 plot (x, y, ".", xx, [y1; y2; y3; y4; y5])
69 axis tight
70 ylim ([-2.5 2.5])
71 legend ({"data", "order 0", "order 1", "order 2", "order 3", "order 4"})
72 print (cstrcat (nm, ".", typ), d_typ)
73 elseif (strcmp (nm, "splinefit3"))
74 ## Data (100 points)
75 x = 2 * pi * [0, (rand (1, 98)), 1];
76 y = sin (x) - cos (2 * x) + 0.2 * randn (size (x));
77 ## No constraints
78 pp1 = splinefit (x, y, 10, "order", 5);
79 ## Periodic boundaries
80 pp2 = splinefit (x, y, 10, "order", 5, "periodic", true);
81 ## Plot
82 xx = linspace (0, 2 * pi, 400);
83 y1 = ppval (pp1, xx);
84 y2 = ppval (pp2, xx);
85 plot (x, y, ".", xx, [y1; y2])
86 axis tight
87 ylim ([-2 3])
88 legend ({"data", "no constraints", "periodic"})
89 print (cstrcat (nm, ".", typ), d_typ)
90 elseif (strcmp (nm, "splinefit4"))
91 ## Data (200 points)
92 x = 2 * pi * rand (1, 200);
93 y = sin (2 * x) + 0.1 * randn (size (x));
94 ## Breaks
95 breaks = linspace (0, 2 * pi, 10);
96 ## Clamped endpoints, y = y" = 0
97 xc = [0, 0, 2*pi, 2*pi];
98 cc = [(eye (2)), (eye (2))];
99 con = struct ("xc", xc, "cc", cc);
100 pp1 = splinefit (x, y, breaks, "constraints", con);
101 ## Hinged periodic endpoints, y = 0
102 con = struct ("xc", 0);
103 pp2 = splinefit (x, y, breaks, "constraints", con, "periodic", true);
104 ## Plot
105 xx = linspace (0, 2 * pi, 400);
106 y1 = ppval (pp1, xx);
107 y2 = ppval (pp2, xx);
108 plot (x, y, ".", xx, [y1; y2])
109 axis tight
110 ylim ([-1.5 1.5])
111 legend({"data", "clamped", "hinged periodic"})
112 print (cstrcat (nm, ".", typ), d_typ)
113 elseif (strcmp (nm, "splinefit5"))
114 ## Truncated data
115 x = [0, 1, 2, 4, 8, 16, 24, 40, 56, 72, 80] / 80;
116 y = [0, 28, 39, 53, 70, 86, 90, 79, 55, 22, 2] / 1000;
117 xy = [x; y];
118 ## Curve length parameter
119 ds = sqrt (diff (x).^2 + diff (y).^2);
120 s = [0, cumsum(ds)];
121 ## Constraints at s = 0: (x,y) = (0,0), (dx/ds,dy/ds) = (0,1)
122 con = struct ("xc", [0 0], "yc", [0 0; 0 1], "cc", eye (2));
123 ## Fit a spline with 4 pieces
124 pp = splinefit (s, xy, 4, "constraints", con);
125 ## Plot
126 ss = linspace (0, s(end), 400);
127 xyfit = ppval (pp, ss);
128 xyb = ppval(pp, pp.breaks);
129 plot (x, y, ".", xyfit(1,:), xyfit(2,:), "r", xyb(1,:), xyb(2,:), "ro")
130 legend ({"data", "spline", "breaks"})
131 axis tight
132 ylim ([0 0.1])
133 print (cstrcat (nm, ".", typ), d_typ)
134 elseif (strcmp (nm, "splinefit6"))
135 ## Data
136 x = linspace (0, 2*pi, 200);
137 y = sin (x) + sin (2 * x) + 0.05 * randn (size (x));
138 ## Add outliers
139 x = [x, linspace(0,2*pi,60)];
140 y = [y, -ones(1,60)];
141 ## Fit splines with hinged conditions
142 con = struct ("xc", [0, 2*pi]);
143 pp1 = splinefit (x, y, 8, "constraints", con, "beta", 0.25); ## Robust fitting
144 pp2 = splinefit (x, y, 8, "constraints", con, "beta", 0.75); ## Robust fitting
145 pp3 = splinefit (x, y, 8, "constraints", con); ## No robust fitting
146 ## Plot
147 xx = linspace (0, 2*pi, 400);
148 y1 = ppval (pp1, xx);
149 y2 = ppval (pp2, xx);
150 y3 = ppval (pp3, xx);
151 plot (x, y, ".", xx, [y1; y2; y3])
152 legend({"data with outliers","robust, beta = 0.25", ...
153 "robust, beta = 0.75", "no robust fitting"})
154 axis tight
155 ylim ([-2 2])
156 print (cstrcat (nm, ".", typ), d_typ)
157 endif
158 hide_output ();
159 endfunction
160
161 function set_print_size ()
162 image_size = [5.0, 3.5]; # in inches, 16:9 format
163 border = 0; # For postscript use 50/72
164 set (0, "defaultfigurepapertype", "<custom>");
165 set (0, "defaultfigurepaperorientation", "landscape");
166 set (0, "defaultfigurepapersize", image_size + 2*border);
167 set (0, "defaultfigurepaperposition", [border, border, image_size]);
168 endfunction
169
170 ## Use this function before plotting commands and after every call to
171 ## print since print() resets output to stdout (unfortunately, gnpulot
172 ## can't pop output as it can the terminal type).
173 function hide_output ()
174 f = figure (1);
175 set (f, "visible", "off");
176 endfunction
177
178 ## generate something for the texinfo @image command to process
179 function image_as_txt(nm)
180 fid = fopen (sprintf ("##s.txt", nm), "wt");
181 fputs (fid, "\n");
182 fputs (fid, "+---------------------------------+\n");
183 fputs (fid, "| Image unavailable in text mode. |\n");
184 fputs (fid, "+---------------------------------+\n");
185 fclose (fid);
186 endfunction
187
188 %!demo
189 %! for s = 1:6
190 %! splineimages (sprintf ("splinefit##d", s), "pdf")
191 %! endfor
192