1
## Copyright (C) 2012-2013 Ben Abbott, Jonas Lundgren
3
## This file is part of Octave.
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.
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.
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/>.
19
function splineimages (nm, typ)
20
graphics_toolkit ("gnuplot");
23
if (strcmp (typ, "png"))
24
set (0, "defaulttextfontname", "*");
26
if (strcmp (typ, "eps"))
32
if (strcmp (typ, "txt"))
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));
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
43
xx = linspace (0, 2 * pi, 400);
46
plot (x, y, ".", xx, [y1; y2]);
49
legend ("data", "41 breaks, 40 pieces", "11 breaks, 10 pieces");
50
print ([nm "." typ], d_typ);
51
elseif (strcmp (nm, "splinefit2")) ## Spline orders
53
x = 2 * pi * rand (1, 200);
54
y = sin (x) + sin (2 * x) + 0.1 * randn (size (x));
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.
62
xx = linspace (0, 2 * pi, 400);
68
plot (x, y, ".", xx, [y1; y2; y3; y4; y5]);
71
legend ({"data", "order 0", "order 1", "order 2", "order 3", "order 4"});
72
print ([nm, "." typ], d_typ);
73
elseif (strcmp (nm, "splinefit3"))
75
x = 2 * pi * [0, (rand (1, 98)), 1];
76
y = sin (x) - cos (2 * x) + 0.2 * randn (size (x));
78
pp1 = splinefit (x, y, 10, "order", 5);
79
## Periodic boundaries
80
pp2 = splinefit (x, y, 10, "order", 5, "periodic", true);
82
xx = linspace (0, 2 * pi, 400);
85
plot (x, y, ".", xx, [y1; y2]);
88
legend ({"data", "no constraints", "periodic"});
89
print ([nm "." typ], d_typ);
90
elseif (strcmp (nm, "splinefit4"))
92
x = 2 * pi * rand (1, 200);
93
y = sin (2 * x) + 0.1 * randn (size (x));
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);
105
xx = linspace (0, 2 * pi, 400);
106
y1 = ppval (pp1, xx);
107
y2 = ppval (pp2, xx);
108
plot (x, y, ".", xx, [y1; y2]);
111
legend({"data", "clamped", "hinged periodic"});
112
print ([nm "." typ], d_typ);
113
elseif (strcmp (nm, "splinefit5"))
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;
118
## Curve length parameter
119
ds = sqrt (diff (x).^2 + diff (y).^2);
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);
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"});
133
print ([nm "." typ], d_typ);
134
elseif (strcmp (nm, "splinefit6"))
136
x = linspace (0, 2*pi, 200);
137
y = sin (x) + sin (2 * x) + 0.05 * randn (size (x));
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
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"});
156
print ([nm "." typ], d_typ);
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]);
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 ()
175
set (f, "visible", "off");
178
## generate something for the texinfo @image command to process
179
function image_as_txt(nm)
180
fid = fopen (sprintf ("%s.txt", nm), "wt");
182
fputs (fid, "+---------------------------------+\n");
183
fputs (fid, "| Image unavailable in text mode. |\n");
184
fputs (fid, "+---------------------------------+\n");
191
%! splineimages (sprintf ("splinefit##d", s), "pdf")