annotate scripts/plot/fplot.m @ 16950:b34202b24212

fplot.m: Overhaul function for Matlab compatibility and performance (bug #38961). * scripts/plot/fplot.m: Add ability to specify n,tol,fmt in any order and simultaneously. Return data rather than plotting it if asked. Use additional test on progress of algorithm to decide whether to quit. Add %!demo and %!tests.
author Rik <rik@octave.org>
date Thu, 11 Jul 2013 09:25:54 -0700
parents 5ec3f4aea91c
children a7c9be4a2c0f
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
14138
72c96de7a403 maint: update copyright notices for 2012
John W. Eaton <jwe@octave.org>
parents: 14092
diff changeset
1 ## Copyright (C) 2005-2012 Paul Kienzle
5820
27c966e4b2dc [project @ 2006-05-17 21:00:54 by jwe]
jwe
parents:
diff changeset
2 ##
27c966e4b2dc [project @ 2006-05-17 21:00:54 by jwe]
jwe
parents:
diff changeset
3 ## This file is part of Octave.
27c966e4b2dc [project @ 2006-05-17 21:00:54 by jwe]
jwe
parents:
diff changeset
4 ##
27c966e4b2dc [project @ 2006-05-17 21:00:54 by jwe]
jwe
parents:
diff changeset
5 ## Octave is free software; you can redistribute it and/or modify it
27c966e4b2dc [project @ 2006-05-17 21:00:54 by jwe]
jwe
parents:
diff changeset
6 ## under the terms of the GNU General Public License as published by
7016
93c65f2a5668 [project @ 2007-10-12 06:40:56 by jwe]
jwe
parents: 6895
diff changeset
7 ## the Free Software Foundation; either version 3 of the License, or (at
93c65f2a5668 [project @ 2007-10-12 06:40:56 by jwe]
jwe
parents: 6895
diff changeset
8 ## your option) any later version.
5820
27c966e4b2dc [project @ 2006-05-17 21:00:54 by jwe]
jwe
parents:
diff changeset
9 ##
27c966e4b2dc [project @ 2006-05-17 21:00:54 by jwe]
jwe
parents:
diff changeset
10 ## Octave is distributed in the hope that it will be useful, but
27c966e4b2dc [project @ 2006-05-17 21:00:54 by jwe]
jwe
parents:
diff changeset
11 ## WITHOUT ANY WARRANTY; without even the implied warranty of
27c966e4b2dc [project @ 2006-05-17 21:00:54 by jwe]
jwe
parents:
diff changeset
12 ## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
27c966e4b2dc [project @ 2006-05-17 21:00:54 by jwe]
jwe
parents:
diff changeset
13 ## General Public License for more details.
27c966e4b2dc [project @ 2006-05-17 21:00:54 by jwe]
jwe
parents:
diff changeset
14 ##
27c966e4b2dc [project @ 2006-05-17 21:00:54 by jwe]
jwe
parents:
diff changeset
15 ## You should have received a copy of the GNU General Public License
7016
93c65f2a5668 [project @ 2007-10-12 06:40:56 by jwe]
jwe
parents: 6895
diff changeset
16 ## along with Octave; see the file COPYING. If not, see
93c65f2a5668 [project @ 2007-10-12 06:40:56 by jwe]
jwe
parents: 6895
diff changeset
17 ## <http://www.gnu.org/licenses/>.
5820
27c966e4b2dc [project @ 2006-05-17 21:00:54 by jwe]
jwe
parents:
diff changeset
18
27c966e4b2dc [project @ 2006-05-17 21:00:54 by jwe]
jwe
parents:
diff changeset
19 ## -*- texinfo -*-
10793
be55736a0783 Grammarcheck the documentation from m-files.
Rik <octave@nomad.inbox5.com>
parents: 10549
diff changeset
20 ## @deftypefn {Function File} {} fplot (@var{fn}, @var{limits})
6781
3058060c560f [project @ 2007-07-19 08:07:31 by dbateman]
dbateman
parents: 6699
diff changeset
21 ## @deftypefnx {Function File} {} fplot (@var{fn}, @var{limits}, @var{tol})
5820
27c966e4b2dc [project @ 2006-05-17 21:00:54 by jwe]
jwe
parents:
diff changeset
22 ## @deftypefnx {Function File} {} fplot (@var{fn}, @var{limits}, @var{n})
16950
b34202b24212 fplot.m: Overhaul function for Matlab compatibility and performance (bug #38961).
Rik <rik@octave.org>
parents: 16775
diff changeset
23 ## @deftypefnx {Function File} {} fplot (@var{fn}, @var{limits}, @var{fmt})
b34202b24212 fplot.m: Overhaul function for Matlab compatibility and performance (bug #38961).
Rik <rik@octave.org>
parents: 16775
diff changeset
24 ## @deftypefnx {Function File} {} fplot (@var{fn}, @var{limits}, @var{tol}, @var{n}, @var{fmt})
b34202b24212 fplot.m: Overhaul function for Matlab compatibility and performance (bug #38961).
Rik <rik@octave.org>
parents: 16775
diff changeset
25 ## @deftypefnx {Function File} {[@var{x}, @var{y}] =} fplot (@dots{})
b34202b24212 fplot.m: Overhaul function for Matlab compatibility and performance (bug #38961).
Rik <rik@octave.org>
parents: 16775
diff changeset
26 ## Plot a function @var{fn} within the range defined by @var{limits}.
b34202b24212 fplot.m: Overhaul function for Matlab compatibility and performance (bug #38961).
Rik <rik@octave.org>
parents: 16775
diff changeset
27 ##
12632
2dbac27e0e40 doc: miscellaneous touch-ups to documentation strings
Rik <octave@nomad.inbox5.com>
parents: 11587
diff changeset
28 ## @var{fn} is a function handle, inline function, or string
2dbac27e0e40 doc: miscellaneous touch-ups to documentation strings
Rik <octave@nomad.inbox5.com>
parents: 11587
diff changeset
29 ## containing the name of the function to evaluate.
16950
b34202b24212 fplot.m: Overhaul function for Matlab compatibility and performance (bug #38961).
Rik <rik@octave.org>
parents: 16775
diff changeset
30 ## The limits of the plot are of the form @code{[@var{xlo}, @var{xhi}]} or
b34202b24212 fplot.m: Overhaul function for Matlab compatibility and performance (bug #38961).
Rik <rik@octave.org>
parents: 16775
diff changeset
31 ## @code{[@var{xlo}, @var{xhi}, @var{ylo}, @var{yhi}]}.
b34202b24212 fplot.m: Overhaul function for Matlab compatibility and performance (bug #38961).
Rik <rik@octave.org>
parents: 16775
diff changeset
32 ## The next three arguments are all optional and any number of them may be
b34202b24212 fplot.m: Overhaul function for Matlab compatibility and performance (bug #38961).
Rik <rik@octave.org>
parents: 16775
diff changeset
33 ## given in any order.
b34202b24212 fplot.m: Overhaul function for Matlab compatibility and performance (bug #38961).
Rik <rik@octave.org>
parents: 16775
diff changeset
34 ## @var{tol} is the relative tolerance to use for the plot and defaults
b34202b24212 fplot.m: Overhaul function for Matlab compatibility and performance (bug #38961).
Rik <rik@octave.org>
parents: 16775
diff changeset
35 ## to 2e-3 (.2%).
b34202b24212 fplot.m: Overhaul function for Matlab compatibility and performance (bug #38961).
Rik <rik@octave.org>
parents: 16775
diff changeset
36 ## @var{n} is the minimum number of of points to use. When @var{n} is
b34202b24212 fplot.m: Overhaul function for Matlab compatibility and performance (bug #38961).
Rik <rik@octave.org>
parents: 16775
diff changeset
37 ## specified, the maximum stepsize will be
b34202b24212 fplot.m: Overhaul function for Matlab compatibility and performance (bug #38961).
Rik <rik@octave.org>
parents: 16775
diff changeset
38 ## @code{@var{xhi} - @var{xlo} / @var{n}}. More than @var{n} points may still
b34202b24212 fplot.m: Overhaul function for Matlab compatibility and performance (bug #38961).
Rik <rik@octave.org>
parents: 16775
diff changeset
39 ## be used in order to meet the relative tolerance requirement.
b34202b24212 fplot.m: Overhaul function for Matlab compatibility and performance (bug #38961).
Rik <rik@octave.org>
parents: 16775
diff changeset
40 ## The @var{fmt} argument specifies the linestyle to be used by the plot
b34202b24212 fplot.m: Overhaul function for Matlab compatibility and performance (bug #38961).
Rik <rik@octave.org>
parents: 16775
diff changeset
41 ## command.
b34202b24212 fplot.m: Overhaul function for Matlab compatibility and performance (bug #38961).
Rik <rik@octave.org>
parents: 16775
diff changeset
42 ##
b34202b24212 fplot.m: Overhaul function for Matlab compatibility and performance (bug #38961).
Rik <rik@octave.org>
parents: 16775
diff changeset
43 ## With no output arguments the results are immediately plotted. With two
b34202b24212 fplot.m: Overhaul function for Matlab compatibility and performance (bug #38961).
Rik <rik@octave.org>
parents: 16775
diff changeset
44 ## output arguments the 2-D plot data is returned. The data can subsequently
b34202b24212 fplot.m: Overhaul function for Matlab compatibility and performance (bug #38961).
Rik <rik@octave.org>
parents: 16775
diff changeset
45 ## be plotted manually with @code{plot (@var{x}, @var{y}).
b34202b24212 fplot.m: Overhaul function for Matlab compatibility and performance (bug #38961).
Rik <rik@octave.org>
parents: 16775
diff changeset
46 ##
b34202b24212 fplot.m: Overhaul function for Matlab compatibility and performance (bug #38961).
Rik <rik@octave.org>
parents: 16775
diff changeset
47 ## Example:
5820
27c966e4b2dc [project @ 2006-05-17 21:00:54 by jwe]
jwe
parents:
diff changeset
48 ##
27c966e4b2dc [project @ 2006-05-17 21:00:54 by jwe]
jwe
parents:
diff changeset
49 ## @example
9051
1bf0ce0930be Grammar check TexInfo in all .m files
Rik <rdrider0-list@yahoo.com>
parents: 9040
diff changeset
50 ## @group
16950
b34202b24212 fplot.m: Overhaul function for Matlab compatibility and performance (bug #38961).
Rik <rik@octave.org>
parents: 16775
diff changeset
51 ## fplot (@cos, [0, 2*pi])
14327
4d917a6a858b doc: Use Octave coding conventions in @example blocks of docstrings.
Rik <octave@nomad.inbox5.com>
parents: 14138
diff changeset
52 ## fplot ("[cos(x), sin(x)]", [0, 2*pi])
9051
1bf0ce0930be Grammar check TexInfo in all .m files
Rik <rdrider0-list@yahoo.com>
parents: 9040
diff changeset
53 ## @end group
5820
27c966e4b2dc [project @ 2006-05-17 21:00:54 by jwe]
jwe
parents:
diff changeset
54 ## @end example
16950
b34202b24212 fplot.m: Overhaul function for Matlab compatibility and performance (bug #38961).
Rik <rik@octave.org>
parents: 16775
diff changeset
55 ##
b34202b24212 fplot.m: Overhaul function for Matlab compatibility and performance (bug #38961).
Rik <rik@octave.org>
parents: 16775
diff changeset
56 ## Note: @code{fplot} works best with continuous functions. Functions with
b34202b24212 fplot.m: Overhaul function for Matlab compatibility and performance (bug #38961).
Rik <rik@octave.org>
parents: 16775
diff changeset
57 ## discontinuities are unlikely to plot well. This restriction may be
b34202b24212 fplot.m: Overhaul function for Matlab compatibility and performance (bug #38961).
Rik <rik@octave.org>
parents: 16775
diff changeset
58 ## removed in the future.
6781
3058060c560f [project @ 2007-07-19 08:07:31 by dbateman]
dbateman
parents: 6699
diff changeset
59 ## @seealso{plot}
5820
27c966e4b2dc [project @ 2006-05-17 21:00:54 by jwe]
jwe
parents:
diff changeset
60 ## @end deftypefn
27c966e4b2dc [project @ 2006-05-17 21:00:54 by jwe]
jwe
parents:
diff changeset
61
7017
a1dbe9d80eee [project @ 2007-10-12 21:27:11 by jwe]
jwe
parents: 7016
diff changeset
62 ## Author: Paul Kienzle <pkienzle@users.sf.net>
a1dbe9d80eee [project @ 2007-10-12 21:27:11 by jwe]
jwe
parents: 7016
diff changeset
63
16950
b34202b24212 fplot.m: Overhaul function for Matlab compatibility and performance (bug #38961).
Rik <rik@octave.org>
parents: 16775
diff changeset
64 function [X, Y] = fplot (fn, limits, varargin)
5820
27c966e4b2dc [project @ 2006-05-17 21:00:54 by jwe]
jwe
parents:
diff changeset
65
16950
b34202b24212 fplot.m: Overhaul function for Matlab compatibility and performance (bug #38961).
Rik <rik@octave.org>
parents: 16775
diff changeset
66 if (nargin < 2 || nargin > 5)
b34202b24212 fplot.m: Overhaul function for Matlab compatibility and performance (bug #38961).
Rik <rik@octave.org>
parents: 16775
diff changeset
67 print_usage ();
6781
3058060c560f [project @ 2007-07-19 08:07:31 by dbateman]
dbateman
parents: 6699
diff changeset
68 endif
3058060c560f [project @ 2007-07-19 08:07:31 by dbateman]
dbateman
parents: 6699
diff changeset
69
6699
3f4ccca05612 [project @ 2007-06-12 20:48:02 by jwe]
jwe
parents: 6220
diff changeset
70 if (strcmp (typeinfo (fn), "inline function"))
3f4ccca05612 [project @ 2007-06-12 20:48:02 by jwe]
jwe
parents: 6220
diff changeset
71 fn = vectorize (fn);
3f4ccca05612 [project @ 2007-06-12 20:48:02 by jwe]
jwe
parents: 6220
diff changeset
72 nam = formula (fn);
3f4ccca05612 [project @ 2007-06-12 20:48:02 by jwe]
jwe
parents: 6220
diff changeset
73 elseif (isa (fn, "function_handle"))
3f4ccca05612 [project @ 2007-06-12 20:48:02 by jwe]
jwe
parents: 6220
diff changeset
74 nam = func2str (fn);
5820
27c966e4b2dc [project @ 2006-05-17 21:00:54 by jwe]
jwe
parents:
diff changeset
75 elseif (all (isalnum (fn)))
6781
3058060c560f [project @ 2007-07-19 08:07:31 by dbateman]
dbateman
parents: 6699
diff changeset
76 nam = fn;
10400
b14fd5116c29 Ensure that 'limits' is a 2 or 4 vector, and that 'fn' is a function
Soren Hauberg <hauberg@gmail.com>
parents: 9051
diff changeset
77 elseif (ischar (fn))
16338
8aeb5d5c3747 fplot.m: Overhaul code to use modern coding practices.
Rik <rik@octave.org>
parents: 14868
diff changeset
78 fn = vectorize (inline (fn));
8aeb5d5c3747 fplot.m: Overhaul code to use modern coding practices.
Rik <rik@octave.org>
parents: 14868
diff changeset
79 nam = formula (fn);
5820
27c966e4b2dc [project @ 2006-05-17 21:00:54 by jwe]
jwe
parents:
diff changeset
80 else
16338
8aeb5d5c3747 fplot.m: Overhaul code to use modern coding practices.
Rik <rik@octave.org>
parents: 14868
diff changeset
81 error ("fplot: FN must be a function handle, inline function, or string");
6781
3058060c560f [project @ 2007-07-19 08:07:31 by dbateman]
dbateman
parents: 6699
diff changeset
82 endif
3058060c560f [project @ 2007-07-19 08:07:31 by dbateman]
dbateman
parents: 6699
diff changeset
83
16950
b34202b24212 fplot.m: Overhaul function for Matlab compatibility and performance (bug #38961).
Rik <rik@octave.org>
parents: 16775
diff changeset
84 if (iscomplex (limits) || (numel (limits) != 2 && numel (limits) != 4))
b34202b24212 fplot.m: Overhaul function for Matlab compatibility and performance (bug #38961).
Rik <rik@octave.org>
parents: 16775
diff changeset
85 error ("fplot: LIMITS must be a real vector with 2 or 4 elements");
b34202b24212 fplot.m: Overhaul function for Matlab compatibility and performance (bug #38961).
Rik <rik@octave.org>
parents: 16775
diff changeset
86 endif
b34202b24212 fplot.m: Overhaul function for Matlab compatibility and performance (bug #38961).
Rik <rik@octave.org>
parents: 16775
diff changeset
87
b34202b24212 fplot.m: Overhaul function for Matlab compatibility and performance (bug #38961).
Rik <rik@octave.org>
parents: 16775
diff changeset
88 n = 5;
b34202b24212 fplot.m: Overhaul function for Matlab compatibility and performance (bug #38961).
Rik <rik@octave.org>
parents: 16775
diff changeset
89 tol = 2e-3;
b34202b24212 fplot.m: Overhaul function for Matlab compatibility and performance (bug #38961).
Rik <rik@octave.org>
parents: 16775
diff changeset
90 fmt = "";
b34202b24212 fplot.m: Overhaul function for Matlab compatibility and performance (bug #38961).
Rik <rik@octave.org>
parents: 16775
diff changeset
91 for i = 1:numel (varargin)
b34202b24212 fplot.m: Overhaul function for Matlab compatibility and performance (bug #38961).
Rik <rik@octave.org>
parents: 16775
diff changeset
92 arg = varargin{i};
b34202b24212 fplot.m: Overhaul function for Matlab compatibility and performance (bug #38961).
Rik <rik@octave.org>
parents: 16775
diff changeset
93 if (ischar (arg))
b34202b24212 fplot.m: Overhaul function for Matlab compatibility and performance (bug #38961).
Rik <rik@octave.org>
parents: 16775
diff changeset
94 fmt = arg;
b34202b24212 fplot.m: Overhaul function for Matlab compatibility and performance (bug #38961).
Rik <rik@octave.org>
parents: 16775
diff changeset
95 elseif (isnumeric (arg) && isscalar (arg) && arg > 0)
b34202b24212 fplot.m: Overhaul function for Matlab compatibility and performance (bug #38961).
Rik <rik@octave.org>
parents: 16775
diff changeset
96 if (arg == fix (arg))
b34202b24212 fplot.m: Overhaul function for Matlab compatibility and performance (bug #38961).
Rik <rik@octave.org>
parents: 16775
diff changeset
97 n = arg;
b34202b24212 fplot.m: Overhaul function for Matlab compatibility and performance (bug #38961).
Rik <rik@octave.org>
parents: 16775
diff changeset
98 else
b34202b24212 fplot.m: Overhaul function for Matlab compatibility and performance (bug #38961).
Rik <rik@octave.org>
parents: 16775
diff changeset
99 tol = arg;
b34202b24212 fplot.m: Overhaul function for Matlab compatibility and performance (bug #38961).
Rik <rik@octave.org>
parents: 16775
diff changeset
100 endif
b34202b24212 fplot.m: Overhaul function for Matlab compatibility and performance (bug #38961).
Rik <rik@octave.org>
parents: 16775
diff changeset
101 else
b34202b24212 fplot.m: Overhaul function for Matlab compatibility and performance (bug #38961).
Rik <rik@octave.org>
parents: 16775
diff changeset
102 error ("fplot: bad input in position %d", i+2);
b34202b24212 fplot.m: Overhaul function for Matlab compatibility and performance (bug #38961).
Rik <rik@octave.org>
parents: 16775
diff changeset
103 endif
b34202b24212 fplot.m: Overhaul function for Matlab compatibility and performance (bug #38961).
Rik <rik@octave.org>
parents: 16775
diff changeset
104 endfor
b34202b24212 fplot.m: Overhaul function for Matlab compatibility and performance (bug #38961).
Rik <rik@octave.org>
parents: 16775
diff changeset
105
b34202b24212 fplot.m: Overhaul function for Matlab compatibility and performance (bug #38961).
Rik <rik@octave.org>
parents: 16775
diff changeset
106 if (n != 5)
b34202b24212 fplot.m: Overhaul function for Matlab compatibility and performance (bug #38961).
Rik <rik@octave.org>
parents: 16775
diff changeset
107 ## n was specified
b34202b24212 fplot.m: Overhaul function for Matlab compatibility and performance (bug #38961).
Rik <rik@octave.org>
parents: 16775
diff changeset
108 x0 = linspace (limits(1), limits(2), n/2 + 1)';
6781
3058060c560f [project @ 2007-07-19 08:07:31 by dbateman]
dbateman
parents: 6699
diff changeset
109 y0 = feval (fn, x0);
3058060c560f [project @ 2007-07-19 08:07:31 by dbateman]
dbateman
parents: 6699
diff changeset
110 x = linspace (limits(1), limits(2), n)';
3058060c560f [project @ 2007-07-19 08:07:31 by dbateman]
dbateman
parents: 6699
diff changeset
111 y = feval (fn, x);
3058060c560f [project @ 2007-07-19 08:07:31 by dbateman]
dbateman
parents: 6699
diff changeset
112 else
16950
b34202b24212 fplot.m: Overhaul function for Matlab compatibility and performance (bug #38961).
Rik <rik@octave.org>
parents: 16775
diff changeset
113 x0 = linspace (limits(1), limits(2), 5)';
b34202b24212 fplot.m: Overhaul function for Matlab compatibility and performance (bug #38961).
Rik <rik@octave.org>
parents: 16775
diff changeset
114 y0 = feval (fn, x0);
b34202b24212 fplot.m: Overhaul function for Matlab compatibility and performance (bug #38961).
Rik <rik@octave.org>
parents: 16775
diff changeset
115 n = 8;
6781
3058060c560f [project @ 2007-07-19 08:07:31 by dbateman]
dbateman
parents: 6699
diff changeset
116 x = linspace (limits(1), limits(2), n)';
3058060c560f [project @ 2007-07-19 08:07:31 by dbateman]
dbateman
parents: 6699
diff changeset
117 y = feval (fn, x);
5820
27c966e4b2dc [project @ 2006-05-17 21:00:54 by jwe]
jwe
parents:
diff changeset
118 endif
27c966e4b2dc [project @ 2006-05-17 21:00:54 by jwe]
jwe
parents:
diff changeset
119
16950
b34202b24212 fplot.m: Overhaul function for Matlab compatibility and performance (bug #38961).
Rik <rik@octave.org>
parents: 16775
diff changeset
120 if (rows (x0) != rows (y0))
b34202b24212 fplot.m: Overhaul function for Matlab compatibility and performance (bug #38961).
Rik <rik@octave.org>
parents: 16775
diff changeset
121 ## FN is a constant value function
b34202b24212 fplot.m: Overhaul function for Matlab compatibility and performance (bug #38961).
Rik <rik@octave.org>
parents: 16775
diff changeset
122 y0 = repmat (y0, size (x0));
b34202b24212 fplot.m: Overhaul function for Matlab compatibility and performance (bug #38961).
Rik <rik@octave.org>
parents: 16775
diff changeset
123 y = repmat (y, size (x));
8145
7ef5b1b4e029 fplot.m: call axis after plot
John W. Eaton <jwe@octave.org>
parents: 7280
diff changeset
124 endif
7ef5b1b4e029 fplot.m: call axis after plot
John W. Eaton <jwe@octave.org>
parents: 7280
diff changeset
125
16950
b34202b24212 fplot.m: Overhaul function for Matlab compatibility and performance (bug #38961).
Rik <rik@octave.org>
parents: 16775
diff changeset
126 err0 = Inf;
b34202b24212 fplot.m: Overhaul function for Matlab compatibility and performance (bug #38961).
Rik <rik@octave.org>
parents: 16775
diff changeset
127
b34202b24212 fplot.m: Overhaul function for Matlab compatibility and performance (bug #38961).
Rik <rik@octave.org>
parents: 16775
diff changeset
128 ## FIXME: This algorithm should really use adaptive scaling as the
b34202b24212 fplot.m: Overhaul function for Matlab compatibility and performance (bug #38961).
Rik <rik@octave.org>
parents: 16775
diff changeset
129 ## the numerical quadrature algorithms do so that extra points are
b34202b24212 fplot.m: Overhaul function for Matlab compatibility and performance (bug #38961).
Rik <rik@octave.org>
parents: 16775
diff changeset
130 ## used where they are needed and not spread evenly over the entire
b34202b24212 fplot.m: Overhaul function for Matlab compatibility and performance (bug #38961).
Rik <rik@octave.org>
parents: 16775
diff changeset
131 ## x-range. Try any function with a discontinuity such as
b34202b24212 fplot.m: Overhaul function for Matlab compatibility and performance (bug #38961).
Rik <rik@octave.org>
parents: 16775
diff changeset
132 ## fplot (@tan, [-2, 2]) or fplot ("1./x", [-3, 2]) to see the
b34202b24212 fplot.m: Overhaul function for Matlab compatibility and performance (bug #38961).
Rik <rik@octave.org>
parents: 16775
diff changeset
133 ## problems with the current solution.
b34202b24212 fplot.m: Overhaul function for Matlab compatibility and performance (bug #38961).
Rik <rik@octave.org>
parents: 16775
diff changeset
134
b34202b24212 fplot.m: Overhaul function for Matlab compatibility and performance (bug #38961).
Rik <rik@octave.org>
parents: 16775
diff changeset
135 while (n < 2^18) # Something is wrong if we need more than 250K points
b34202b24212 fplot.m: Overhaul function for Matlab compatibility and performance (bug #38961).
Rik <rik@octave.org>
parents: 16775
diff changeset
136 yi = interp1 (x0, y0, x, "linear");
b34202b24212 fplot.m: Overhaul function for Matlab compatibility and performance (bug #38961).
Rik <rik@octave.org>
parents: 16775
diff changeset
137 ## relative error calculation using average of [yi,y] as reference
b34202b24212 fplot.m: Overhaul function for Matlab compatibility and performance (bug #38961).
Rik <rik@octave.org>
parents: 16775
diff changeset
138 ## since neither estimate is known a priori to be better than the other.
b34202b24212 fplot.m: Overhaul function for Matlab compatibility and performance (bug #38961).
Rik <rik@octave.org>
parents: 16775
diff changeset
139 err = 0.5 * max (abs ((yi - y) ./ (yi + y))(:));
b34202b24212 fplot.m: Overhaul function for Matlab compatibility and performance (bug #38961).
Rik <rik@octave.org>
parents: 16775
diff changeset
140 if (err < tol || abs (err - err0) < tol/2)
b34202b24212 fplot.m: Overhaul function for Matlab compatibility and performance (bug #38961).
Rik <rik@octave.org>
parents: 16775
diff changeset
141 ## Either relative tolerance has been met OR
b34202b24212 fplot.m: Overhaul function for Matlab compatibility and performance (bug #38961).
Rik <rik@octave.org>
parents: 16775
diff changeset
142 ## algorithm has stopped making any reasonable progress per iteration.
b34202b24212 fplot.m: Overhaul function for Matlab compatibility and performance (bug #38961).
Rik <rik@octave.org>
parents: 16775
diff changeset
143 break;
b34202b24212 fplot.m: Overhaul function for Matlab compatibility and performance (bug #38961).
Rik <rik@octave.org>
parents: 16775
diff changeset
144 endif
b34202b24212 fplot.m: Overhaul function for Matlab compatibility and performance (bug #38961).
Rik <rik@octave.org>
parents: 16775
diff changeset
145 x0 = x;
b34202b24212 fplot.m: Overhaul function for Matlab compatibility and performance (bug #38961).
Rik <rik@octave.org>
parents: 16775
diff changeset
146 y0 = y;
b34202b24212 fplot.m: Overhaul function for Matlab compatibility and performance (bug #38961).
Rik <rik@octave.org>
parents: 16775
diff changeset
147 err0 = err;
b34202b24212 fplot.m: Overhaul function for Matlab compatibility and performance (bug #38961).
Rik <rik@octave.org>
parents: 16775
diff changeset
148 n = 2 * (n - 1) + 1;
b34202b24212 fplot.m: Overhaul function for Matlab compatibility and performance (bug #38961).
Rik <rik@octave.org>
parents: 16775
diff changeset
149 x = linspace (limits(1), limits(2), n)';
b34202b24212 fplot.m: Overhaul function for Matlab compatibility and performance (bug #38961).
Rik <rik@octave.org>
parents: 16775
diff changeset
150 y = feval (fn, x);
b34202b24212 fplot.m: Overhaul function for Matlab compatibility and performance (bug #38961).
Rik <rik@octave.org>
parents: 16775
diff changeset
151 endwhile
b34202b24212 fplot.m: Overhaul function for Matlab compatibility and performance (bug #38961).
Rik <rik@octave.org>
parents: 16775
diff changeset
152
b34202b24212 fplot.m: Overhaul function for Matlab compatibility and performance (bug #38961).
Rik <rik@octave.org>
parents: 16775
diff changeset
153 if (nargout == 2)
b34202b24212 fplot.m: Overhaul function for Matlab compatibility and performance (bug #38961).
Rik <rik@octave.org>
parents: 16775
diff changeset
154 X = x;
b34202b24212 fplot.m: Overhaul function for Matlab compatibility and performance (bug #38961).
Rik <rik@octave.org>
parents: 16775
diff changeset
155 Y = y;
6781
3058060c560f [project @ 2007-07-19 08:07:31 by dbateman]
dbateman
parents: 6699
diff changeset
156 else
16950
b34202b24212 fplot.m: Overhaul function for Matlab compatibility and performance (bug #38961).
Rik <rik@octave.org>
parents: 16775
diff changeset
157 plot (x, y, fmt);
b34202b24212 fplot.m: Overhaul function for Matlab compatibility and performance (bug #38961).
Rik <rik@octave.org>
parents: 16775
diff changeset
158 axis (limits);
b34202b24212 fplot.m: Overhaul function for Matlab compatibility and performance (bug #38961).
Rik <rik@octave.org>
parents: 16775
diff changeset
159 if (isvector (y))
b34202b24212 fplot.m: Overhaul function for Matlab compatibility and performance (bug #38961).
Rik <rik@octave.org>
parents: 16775
diff changeset
160 legend (nam);
b34202b24212 fplot.m: Overhaul function for Matlab compatibility and performance (bug #38961).
Rik <rik@octave.org>
parents: 16775
diff changeset
161 else
b34202b24212 fplot.m: Overhaul function for Matlab compatibility and performance (bug #38961).
Rik <rik@octave.org>
parents: 16775
diff changeset
162 for i = 1:columns (y)
b34202b24212 fplot.m: Overhaul function for Matlab compatibility and performance (bug #38961).
Rik <rik@octave.org>
parents: 16775
diff changeset
163 nams{i} = sprintf ("%s(:,%i)", nam, i);
b34202b24212 fplot.m: Overhaul function for Matlab compatibility and performance (bug #38961).
Rik <rik@octave.org>
parents: 16775
diff changeset
164 endfor
b34202b24212 fplot.m: Overhaul function for Matlab compatibility and performance (bug #38961).
Rik <rik@octave.org>
parents: 16775
diff changeset
165 legend (nams{:});
b34202b24212 fplot.m: Overhaul function for Matlab compatibility and performance (bug #38961).
Rik <rik@octave.org>
parents: 16775
diff changeset
166 endif
6781
3058060c560f [project @ 2007-07-19 08:07:31 by dbateman]
dbateman
parents: 6699
diff changeset
167 endif
16338
8aeb5d5c3747 fplot.m: Overhaul code to use modern coding practices.
Rik <rik@octave.org>
parents: 14868
diff changeset
168
5820
27c966e4b2dc [project @ 2006-05-17 21:00:54 by jwe]
jwe
parents:
diff changeset
169 endfunction
7245
d65670971cbc [project @ 2007-12-04 03:03:54 by jwe]
jwe
parents: 7017
diff changeset
170
d65670971cbc [project @ 2007-12-04 03:03:54 by jwe]
jwe
parents: 7017
diff changeset
171
d65670971cbc [project @ 2007-12-04 03:03:54 by jwe]
jwe
parents: 7017
diff changeset
172 %!demo
14237
11949c9795a0 Revamp %!demos in m-files to use Octave coding conventions on spacing, etc.
Rik <octave@nomad.inbox5.com>
parents: 14138
diff changeset
173 %! clf;
16950
b34202b24212 fplot.m: Overhaul function for Matlab compatibility and performance (bug #38961).
Rik <rik@octave.org>
parents: 16775
diff changeset
174 %! fplot (@cos, [0, 2*pi]);
14237
11949c9795a0 Revamp %!demos in m-files to use Octave coding conventions on spacing, etc.
Rik <octave@nomad.inbox5.com>
parents: 14138
diff changeset
175
11949c9795a0 Revamp %!demos in m-files to use Octave coding conventions on spacing, etc.
Rik <octave@nomad.inbox5.com>
parents: 14138
diff changeset
176 %!demo
11949c9795a0 Revamp %!demos in m-files to use Octave coding conventions on spacing, etc.
Rik <octave@nomad.inbox5.com>
parents: 14138
diff changeset
177 %! clf;
14245
4506eade9f04 Use Matlab coding conventions for demos in plot/ directory.
Rik <octave@nomad.inbox5.com>
parents: 14237
diff changeset
178 %! fplot ('[cos(x), sin(x)]', [0, 2*pi]);
14237
11949c9795a0 Revamp %!demos in m-files to use Octave coding conventions on spacing, etc.
Rik <octave@nomad.inbox5.com>
parents: 14138
diff changeset
179
16950
b34202b24212 fplot.m: Overhaul function for Matlab compatibility and performance (bug #38961).
Rik <rik@octave.org>
parents: 16775
diff changeset
180 %!demo
b34202b24212 fplot.m: Overhaul function for Matlab compatibility and performance (bug #38961).
Rik <rik@octave.org>
parents: 16775
diff changeset
181 %! clf;
b34202b24212 fplot.m: Overhaul function for Matlab compatibility and performance (bug #38961).
Rik <rik@octave.org>
parents: 16775
diff changeset
182 %! ## sinc function
b34202b24212 fplot.m: Overhaul function for Matlab compatibility and performance (bug #38961).
Rik <rik@octave.org>
parents: 16775
diff changeset
183 %! fh = @(x) sin (x*pi) ./ (x*pi);
b34202b24212 fplot.m: Overhaul function for Matlab compatibility and performance (bug #38961).
Rik <rik@octave.org>
parents: 16775
diff changeset
184 %! fplot (fh, [-5, 5]);
b34202b24212 fplot.m: Overhaul function for Matlab compatibility and performance (bug #38961).
Rik <rik@octave.org>
parents: 16775
diff changeset
185
b34202b24212 fplot.m: Overhaul function for Matlab compatibility and performance (bug #38961).
Rik <rik@octave.org>
parents: 16775
diff changeset
186 %!test
b34202b24212 fplot.m: Overhaul function for Matlab compatibility and performance (bug #38961).
Rik <rik@octave.org>
parents: 16775
diff changeset
187 %! [x, y] = fplot ("[cos(x), sin(x)]", [0, 2*pi]);
b34202b24212 fplot.m: Overhaul function for Matlab compatibility and performance (bug #38961).
Rik <rik@octave.org>
parents: 16775
diff changeset
188 %! assert (columns (y) == 2);
b34202b24212 fplot.m: Overhaul function for Matlab compatibility and performance (bug #38961).
Rik <rik@octave.org>
parents: 16775
diff changeset
189 %! assert (rows (x) == rows (y));
b34202b24212 fplot.m: Overhaul function for Matlab compatibility and performance (bug #38961).
Rik <rik@octave.org>
parents: 16775
diff changeset
190 %! assert (y, [cos(x), sin(x)], -2e-3);
b34202b24212 fplot.m: Overhaul function for Matlab compatibility and performance (bug #38961).
Rik <rik@octave.org>
parents: 16775
diff changeset
191
16775
5ec3f4aea91c fplot.m: Fix bug when FN is a constant function (bug #39287)
Rik <rik@octave.org>
parents: 16338
diff changeset
192 %% Test input validation
5ec3f4aea91c fplot.m: Fix bug when FN is a constant function (bug #39287)
Rik <rik@octave.org>
parents: 16338
diff changeset
193 %!error fplot (1)
16950
b34202b24212 fplot.m: Overhaul function for Matlab compatibility and performance (bug #38961).
Rik <rik@octave.org>
parents: 16775
diff changeset
194 %!error fplot (1,2,3,4,5,6)
b34202b24212 fplot.m: Overhaul function for Matlab compatibility and performance (bug #38961).
Rik <rik@octave.org>
parents: 16775
diff changeset
195 %!error <FN must be a function handle> fplot (1, [0 1])
16775
5ec3f4aea91c fplot.m: Fix bug when FN is a constant function (bug #39287)
Rik <rik@octave.org>
parents: 16338
diff changeset
196 %!error <LIMITS must be a real vector> fplot (@cos, [i, 2*i])
5ec3f4aea91c fplot.m: Fix bug when FN is a constant function (bug #39287)
Rik <rik@octave.org>
parents: 16338
diff changeset
197 %!error <LIMITS must be a real vector with 2 or 4> fplot (@cos, [1])
5ec3f4aea91c fplot.m: Fix bug when FN is a constant function (bug #39287)
Rik <rik@octave.org>
parents: 16338
diff changeset
198 %!error <LIMITS must be a real vector with 2 or 4> fplot (@cos, [1 2 3])
16950
b34202b24212 fplot.m: Overhaul function for Matlab compatibility and performance (bug #38961).
Rik <rik@octave.org>
parents: 16775
diff changeset
199 %!error <bad input in position 3> fplot (@cos,[-1,1], {1})
16775
5ec3f4aea91c fplot.m: Fix bug when FN is a constant function (bug #39287)
Rik <rik@octave.org>
parents: 16338
diff changeset
200