Mercurial > octave
annotate scripts/optimization/humps.m @ 29359:7854d5752dd2
maint: merge stable to default.
author | John W. Eaton <jwe@octave.org> |
---|---|
date | Wed, 10 Feb 2021 10:10:40 -0500 |
parents | 28de41192f3c 0a5b15007766 |
children | 796f54d4ddbf |
rev | line source |
---|---|
27923
bd51beb6205e
update formatting of copyright notices
John W. Eaton <jwe@octave.org>
parents:
27919
diff
changeset
|
1 ######################################################################## |
bd51beb6205e
update formatting of copyright notices
John W. Eaton <jwe@octave.org>
parents:
27919
diff
changeset
|
2 ## |
29358
0a5b15007766
update Octave Project Developers copyright for the new year
John W. Eaton <jwe@octave.org>
parents:
27978
diff
changeset
|
3 ## Copyright (C) 2017-2021 The Octave Project Developers |
27918
b442ec6dda5c
use centralized file for copyright info for individual contributors
John W. Eaton <jwe@octave.org>
parents:
26376
diff
changeset
|
4 ## |
27923
bd51beb6205e
update formatting of copyright notices
John W. Eaton <jwe@octave.org>
parents:
27919
diff
changeset
|
5 ## See the file COPYRIGHT.md in the top-level directory of this |
bd51beb6205e
update formatting of copyright notices
John W. Eaton <jwe@octave.org>
parents:
27919
diff
changeset
|
6 ## distribution or <https://octave.org/copyright/>. |
23885
86a49caa5100
new function humps (bug #33935)
Nicholas R. Jankowski <jankowskin@asme.org>
parents:
diff
changeset
|
7 ## |
86a49caa5100
new function humps (bug #33935)
Nicholas R. Jankowski <jankowskin@asme.org>
parents:
diff
changeset
|
8 ## This file is part of Octave. |
86a49caa5100
new function humps (bug #33935)
Nicholas R. Jankowski <jankowskin@asme.org>
parents:
diff
changeset
|
9 ## |
24534
194eb4bd202b
maint: Update punctuation for GPL v3 license text.
Rik <rik@octave.org>
parents:
23896
diff
changeset
|
10 ## Octave is free software: you can redistribute it and/or modify it |
23885
86a49caa5100
new function humps (bug #33935)
Nicholas R. Jankowski <jankowskin@asme.org>
parents:
diff
changeset
|
11 ## under the terms of the GNU General Public License as published by |
24534
194eb4bd202b
maint: Update punctuation for GPL v3 license text.
Rik <rik@octave.org>
parents:
23896
diff
changeset
|
12 ## the Free Software Foundation, either version 3 of the License, or |
23885
86a49caa5100
new function humps (bug #33935)
Nicholas R. Jankowski <jankowskin@asme.org>
parents:
diff
changeset
|
13 ## (at your option) any later version. |
86a49caa5100
new function humps (bug #33935)
Nicholas R. Jankowski <jankowskin@asme.org>
parents:
diff
changeset
|
14 ## |
86a49caa5100
new function humps (bug #33935)
Nicholas R. Jankowski <jankowskin@asme.org>
parents:
diff
changeset
|
15 ## Octave is distributed in the hope that it will be useful, but |
86a49caa5100
new function humps (bug #33935)
Nicholas R. Jankowski <jankowskin@asme.org>
parents:
diff
changeset
|
16 ## WITHOUT ANY WARRANTY; without even the implied warranty of |
86a49caa5100
new function humps (bug #33935)
Nicholas R. Jankowski <jankowskin@asme.org>
parents:
diff
changeset
|
17 ## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
86a49caa5100
new function humps (bug #33935)
Nicholas R. Jankowski <jankowskin@asme.org>
parents:
diff
changeset
|
18 ## GNU General Public License for more details. |
86a49caa5100
new function humps (bug #33935)
Nicholas R. Jankowski <jankowskin@asme.org>
parents:
diff
changeset
|
19 ## |
86a49caa5100
new function humps (bug #33935)
Nicholas R. Jankowski <jankowskin@asme.org>
parents:
diff
changeset
|
20 ## You should have received a copy of the GNU General Public License |
24894
655dfe391ec2
maint: reformat GPLv3 license header blocks for consistency
Mike Miller <mtmiller@octave.org>
parents:
24534
diff
changeset
|
21 ## along with Octave; see the file COPYING. If not, see |
655dfe391ec2
maint: reformat GPLv3 license header blocks for consistency
Mike Miller <mtmiller@octave.org>
parents:
24534
diff
changeset
|
22 ## <https://www.gnu.org/licenses/>. |
27923
bd51beb6205e
update formatting of copyright notices
John W. Eaton <jwe@octave.org>
parents:
27919
diff
changeset
|
23 ## |
bd51beb6205e
update formatting of copyright notices
John W. Eaton <jwe@octave.org>
parents:
27919
diff
changeset
|
24 ######################################################################## |
23885
86a49caa5100
new function humps (bug #33935)
Nicholas R. Jankowski <jankowskin@asme.org>
parents:
diff
changeset
|
25 |
86a49caa5100
new function humps (bug #33935)
Nicholas R. Jankowski <jankowskin@asme.org>
parents:
diff
changeset
|
26 ## -*- texinfo -*- |
23896 | 27 ## @deftypefn {} {@var{y} =} humps (@var{x}) |
23885
86a49caa5100
new function humps (bug #33935)
Nicholas R. Jankowski <jankowskin@asme.org>
parents:
diff
changeset
|
28 ## @deftypefnx {} {[@var{x}, @var{y}] =} humps (@var{x}) |
23896 | 29 ## Evaluate a function with multiple minima, maxima, and zero crossings. |
30 ## | |
31 ## The output @var{y} is the evaluation of the rational function: | |
23885
86a49caa5100
new function humps (bug #33935)
Nicholas R. Jankowski <jankowskin@asme.org>
parents:
diff
changeset
|
32 ## |
86a49caa5100
new function humps (bug #33935)
Nicholas R. Jankowski <jankowskin@asme.org>
parents:
diff
changeset
|
33 ## @tex |
86a49caa5100
new function humps (bug #33935)
Nicholas R. Jankowski <jankowskin@asme.org>
parents:
diff
changeset
|
34 ## $$y = -{ {1200x^4 - 2880x^3 + 2036x^2 - 340x - 88} \over {200x^4 - 480x^3 + 406x^2 - 138x - 17} }$$ |
86a49caa5100
new function humps (bug #33935)
Nicholas R. Jankowski <jankowskin@asme.org>
parents:
diff
changeset
|
35 ## @end tex |
86a49caa5100
new function humps (bug #33935)
Nicholas R. Jankowski <jankowskin@asme.org>
parents:
diff
changeset
|
36 ## @ifnottex |
86a49caa5100
new function humps (bug #33935)
Nicholas R. Jankowski <jankowskin@asme.org>
parents:
diff
changeset
|
37 ## |
86a49caa5100
new function humps (bug #33935)
Nicholas R. Jankowski <jankowskin@asme.org>
parents:
diff
changeset
|
38 ## @example |
86a49caa5100
new function humps (bug #33935)
Nicholas R. Jankowski <jankowskin@asme.org>
parents:
diff
changeset
|
39 ## @group |
86a49caa5100
new function humps (bug #33935)
Nicholas R. Jankowski <jankowskin@asme.org>
parents:
diff
changeset
|
40 ## 1200*@var{x}^4 - 2880*@var{x}^3 + 2036*@var{x}^2 - 348*@var{x} - 88 |
86a49caa5100
new function humps (bug #33935)
Nicholas R. Jankowski <jankowskin@asme.org>
parents:
diff
changeset
|
41 ## @var{y} = - --------------------------------------------- |
86a49caa5100
new function humps (bug #33935)
Nicholas R. Jankowski <jankowskin@asme.org>
parents:
diff
changeset
|
42 ## 200*@var{x}^4 - 480*@var{x}^3 + 406*@var{x}^2 - 138*@var{x} + 17 |
86a49caa5100
new function humps (bug #33935)
Nicholas R. Jankowski <jankowskin@asme.org>
parents:
diff
changeset
|
43 ## @end group |
86a49caa5100
new function humps (bug #33935)
Nicholas R. Jankowski <jankowskin@asme.org>
parents:
diff
changeset
|
44 ## @end example |
86a49caa5100
new function humps (bug #33935)
Nicholas R. Jankowski <jankowskin@asme.org>
parents:
diff
changeset
|
45 ## |
86a49caa5100
new function humps (bug #33935)
Nicholas R. Jankowski <jankowskin@asme.org>
parents:
diff
changeset
|
46 ## @end ifnottex |
86a49caa5100
new function humps (bug #33935)
Nicholas R. Jankowski <jankowskin@asme.org>
parents:
diff
changeset
|
47 ## |
23896 | 48 ## @var{x} may be a scalar, vector or array. If @var{x} is omitted, the |
49 ## default range [0:0.05:1] is used. | |
23885
86a49caa5100
new function humps (bug #33935)
Nicholas R. Jankowski <jankowskin@asme.org>
parents:
diff
changeset
|
50 ## |
23896 | 51 ## When called with two output arguments, [@var{x}, @var{y}], @var{x} will |
52 ## contain the input values, and @var{y} will contain the output from | |
23885
86a49caa5100
new function humps (bug #33935)
Nicholas R. Jankowski <jankowskin@asme.org>
parents:
diff
changeset
|
53 ## @code{humps}. |
86a49caa5100
new function humps (bug #33935)
Nicholas R. Jankowski <jankowskin@asme.org>
parents:
diff
changeset
|
54 ## |
23896 | 55 ## Programming Notes: @code{humps} has two local maxima located near @var{x} = |
56 ## 0.300 and 0.893, a local minimum near @var{x} = 0.637, and zeros near | |
57 ## @var{x} = -0.132 and 1.300. @code{humps} is a useful function for testing | |
58 ## algorithms which find zeros or local minima and maxima. | |
23885
86a49caa5100
new function humps (bug #33935)
Nicholas R. Jankowski <jankowskin@asme.org>
parents:
diff
changeset
|
59 ## |
86a49caa5100
new function humps (bug #33935)
Nicholas R. Jankowski <jankowskin@asme.org>
parents:
diff
changeset
|
60 ## Try @code{demo humps} to see a plot of the @code{humps} function. |
23896 | 61 ## @seealso{fzero, fminbnd, fminunc, fminsearch} |
23885
86a49caa5100
new function humps (bug #33935)
Nicholas R. Jankowski <jankowskin@asme.org>
parents:
diff
changeset
|
62 ## @end deftypefn |
86a49caa5100
new function humps (bug #33935)
Nicholas R. Jankowski <jankowskin@asme.org>
parents:
diff
changeset
|
63 |
23896 | 64 function [x, y] = humps (x = [0:0.05:1]) |
23885
86a49caa5100
new function humps (bug #33935)
Nicholas R. Jankowski <jankowskin@asme.org>
parents:
diff
changeset
|
65 |
23896 | 66 y = - 4*( 300*x.^4 - 720*x.^3 + 509*x.^2 - 87*x - 22) ./ ... |
67 ((10*x.^2 - 6*x + 1).*(20*x.^2 - 36*x + 17)); | |
23885
86a49caa5100
new function humps (bug #33935)
Nicholas R. Jankowski <jankowskin@asme.org>
parents:
diff
changeset
|
68 |
23896 | 69 if (nargout <= 1) |
70 x = y; | |
23885
86a49caa5100
new function humps (bug #33935)
Nicholas R. Jankowski <jankowskin@asme.org>
parents:
diff
changeset
|
71 endif |
86a49caa5100
new function humps (bug #33935)
Nicholas R. Jankowski <jankowskin@asme.org>
parents:
diff
changeset
|
72 |
86a49caa5100
new function humps (bug #33935)
Nicholas R. Jankowski <jankowskin@asme.org>
parents:
diff
changeset
|
73 endfunction |
86a49caa5100
new function humps (bug #33935)
Nicholas R. Jankowski <jankowskin@asme.org>
parents:
diff
changeset
|
74 |
23896 | 75 |
23885
86a49caa5100
new function humps (bug #33935)
Nicholas R. Jankowski <jankowskin@asme.org>
parents:
diff
changeset
|
76 %!demo |
86a49caa5100
new function humps (bug #33935)
Nicholas R. Jankowski <jankowskin@asme.org>
parents:
diff
changeset
|
77 %! clf; |
86a49caa5100
new function humps (bug #33935)
Nicholas R. Jankowski <jankowskin@asme.org>
parents:
diff
changeset
|
78 %! fplot (@humps, [0, 2]); |
86a49caa5100
new function humps (bug #33935)
Nicholas R. Jankowski <jankowskin@asme.org>
parents:
diff
changeset
|
79 %! title ("humps() function"); |
86a49caa5100
new function humps (bug #33935)
Nicholas R. Jankowski <jankowskin@asme.org>
parents:
diff
changeset
|
80 |
86a49caa5100
new function humps (bug #33935)
Nicholas R. Jankowski <jankowskin@asme.org>
parents:
diff
changeset
|
81 ## value checks |
86a49caa5100
new function humps (bug #33935)
Nicholas R. Jankowski <jankowskin@asme.org>
parents:
diff
changeset
|
82 %!assert (humps (0), 88/17, 10*eps) |
86a49caa5100
new function humps (bug #33935)
Nicholas R. Jankowski <jankowskin@asme.org>
parents:
diff
changeset
|
83 %!assert (humps (1), 16, 10*eps) |
86a49caa5100
new function humps (bug #33935)
Nicholas R. Jankowski <jankowskin@asme.org>
parents:
diff
changeset
|
84 %!assert (humps (-1), -6376/1241, 10*eps) |
86a49caa5100
new function humps (bug #33935)
Nicholas R. Jankowski <jankowskin@asme.org>
parents:
diff
changeset
|
85 %!assert (humps (), [88/17, 16106/1769, 263/17, 82802/3133, 2432/53, ... |
86a49caa5100
new function humps (bug #33935)
Nicholas R. Jankowski <jankowskin@asme.org>
parents:
diff
changeset
|
86 %! 2818/37, 193/2, 10538/137, 1376/29, 36434/1261, 19, 5258/377, ... |
86a49caa5100
new function humps (bug #33935)
Nicholas R. Jankowski <jankowskin@asme.org>
parents:
diff
changeset
|
87 %! 152/13, 24562/2173, 421/34, 250/17, 232/13, 1762/85, 803/37, ... |
86a49caa5100
new function humps (bug #33935)
Nicholas R. Jankowski <jankowskin@asme.org>
parents:
diff
changeset
|
88 %! 58354/2941, 16], 1000*eps) |
86a49caa5100
new function humps (bug #33935)
Nicholas R. Jankowski <jankowskin@asme.org>
parents:
diff
changeset
|
89 |
86a49caa5100
new function humps (bug #33935)
Nicholas R. Jankowski <jankowskin@asme.org>
parents:
diff
changeset
|
90 ## vector checks |
86a49caa5100
new function humps (bug #33935)
Nicholas R. Jankowski <jankowskin@asme.org>
parents:
diff
changeset
|
91 %!assert (humps ([0, 1]), [88/17, 16], 10*eps) |
86a49caa5100
new function humps (bug #33935)
Nicholas R. Jankowski <jankowskin@asme.org>
parents:
diff
changeset
|
92 %!assert (humps ([0, 1]'), [88/17, 16]', 10*eps) |
86a49caa5100
new function humps (bug #33935)
Nicholas R. Jankowski <jankowskin@asme.org>
parents:
diff
changeset
|
93 %!assert (humps ([0, 1; 1, 0]'), [88/17, 16; 16, 88/17]', 10*eps) |
86a49caa5100
new function humps (bug #33935)
Nicholas R. Jankowski <jankowskin@asme.org>
parents:
diff
changeset
|
94 |
86a49caa5100
new function humps (bug #33935)
Nicholas R. Jankowski <jankowskin@asme.org>
parents:
diff
changeset
|
95 ## array checks |
86a49caa5100
new function humps (bug #33935)
Nicholas R. Jankowski <jankowskin@asme.org>
parents:
diff
changeset
|
96 %!assert (humps (repmat (eye (2), 1, 1, 2)), |
86a49caa5100
new function humps (bug #33935)
Nicholas R. Jankowski <jankowskin@asme.org>
parents:
diff
changeset
|
97 %! repmat ([16, 88/17; 88/17, 16], 1, 1, 2), 10*eps) |
86a49caa5100
new function humps (bug #33935)
Nicholas R. Jankowski <jankowskin@asme.org>
parents:
diff
changeset
|
98 |
86a49caa5100
new function humps (bug #33935)
Nicholas R. Jankowski <jankowskin@asme.org>
parents:
diff
changeset
|
99 ## other checks |
86a49caa5100
new function humps (bug #33935)
Nicholas R. Jankowski <jankowskin@asme.org>
parents:
diff
changeset
|
100 %!assert (humps (NaN), NaN) |
86a49caa5100
new function humps (bug #33935)
Nicholas R. Jankowski <jankowskin@asme.org>
parents:
diff
changeset
|
101 %!assert (humps ([]), []) |
86a49caa5100
new function humps (bug #33935)
Nicholas R. Jankowski <jankowskin@asme.org>
parents:
diff
changeset
|
102 |
23896 | 103 ## Test input validation |
23885
86a49caa5100
new function humps (bug #33935)
Nicholas R. Jankowski <jankowskin@asme.org>
parents:
diff
changeset
|
104 %!error humps (1,3) |