annotate scripts/optimization/fminsearch.m @ 25930:a00379f6f8c4

* fminsearch.m: Accept problem structure for Matlab compatibility.
author John W. Eaton <jwe@octave.org>
date Mon, 15 Oct 2018 15:27:36 -0400
parents 8b548f2f8086
children 7fa5ee67094a
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
25054
6652d3823428 maint: Update copyright dates in all source files.
John W. Eaton <jwe@octave.org>
parents: 24534
diff changeset
1 ## Copyright (C) 2003-2018 Andy Adler
17744
d63878346099 maint: Update copyright notices for release.
John W. Eaton <jwe@octave.org>
parents: 17281
diff changeset
2 ## Copyright (C) 2002, 2013 N.J.Higham
14895
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
3 ##
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
4 ## This file is part of Octave.
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
5 ##
24534
194eb4bd202b maint: Update punctuation for GPL v3 license text.
Rik <rik@octave.org>
parents: 23567
diff changeset
6 ## Octave is free software: you can redistribute it and/or modify it
14895
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
7 ## 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: 23567
diff changeset
8 ## the Free Software Foundation, either version 3 of the License, or
22755
3a2b891d0b33 maint: Standardize Copyright formatting.
Rik <rik@octave.org>
parents: 22323
diff changeset
9 ## (at your option) any later version.
14895
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
10 ##
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
11 ## Octave is distributed in the hope that it will be useful, but
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
12 ## WITHOUT ANY WARRANTY; without even the implied warranty of
22755
3a2b891d0b33 maint: Standardize Copyright formatting.
Rik <rik@octave.org>
parents: 22323
diff changeset
13 ## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
3a2b891d0b33 maint: Standardize Copyright formatting.
Rik <rik@octave.org>
parents: 22323
diff changeset
14 ## GNU General Public License for more details.
14895
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
15 ##
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
16 ## You should have received a copy of the GNU General Public License
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
17 ## along with Octave; see the file COPYING. If not, see
24534
194eb4bd202b maint: Update punctuation for GPL v3 license text.
Rik <rik@octave.org>
parents: 23567
diff changeset
18 ## <https://www.gnu.org/licenses/>.
14895
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
19
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
20 ## -*- texinfo -*-
20852
516bb87ea72e 2015 Code Sprint: remove class of function from docstring for all m-files.
Rik <rik@octave.org>
parents: 20735
diff changeset
21 ## @deftypefn {} {@var{x} =} fminsearch (@var{fun}, @var{x0})
516bb87ea72e 2015 Code Sprint: remove class of function from docstring for all m-files.
Rik <rik@octave.org>
parents: 20735
diff changeset
22 ## @deftypefnx {} {@var{x} =} fminsearch (@var{fun}, @var{x0}, @var{options})
22967
3c896180df16 Pass additional arguments for fminsearch to called function (bug #41888).
Markus Muetzel <markus.muetzel@gmx.de>
parents: 22963
diff changeset
23 ## @deftypefnx {} {@var{x} =} fminsearch (@var{fun}, @var{x0}, @var{options}, @var{fun_arg1}, @var{fun_arg2}, @dots{})
25930
a00379f6f8c4 * fminsearch.m: Accept problem structure for Matlab compatibility.
John W. Eaton <jwe@octave.org>
parents: 25828
diff changeset
24 ## @deftypefnx {} {@var{x} =} fminsearch (@var{problem})
23113
9241a0fa7873 Additional output arguments for fminsearch (bug #44220).
Markus Muetzel <markus.muetzel@gmx.de>
parents: 23085
diff changeset
25 ## @deftypefnx {} {[@var{x}, @var{fval}, @var{exitflag}, @var{output}] =} fminsearch (@dots{})
14895
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
26 ##
25739
8eec0403a370 fminsearch.m: Update default TolFun to 1e-4 for Matlab compatibility.
Rik <rik@octave.org>
parents: 25231
diff changeset
27 ## Find a value of @var{x} which minimizes the multi-variable function
8eec0403a370 fminsearch.m: Update default TolFun to 1e-4 for Matlab compatibility.
Rik <rik@octave.org>
parents: 25231
diff changeset
28 ## @var{fun}.
20165
f1d0f506ee78 doc: Update more docstrings to have one sentence summary as first line.
Rik <rik@octave.org>
parents: 19596
diff changeset
29 ##
14895
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
30 ## The search begins at the point @var{x0} and iterates using the
19040
0850b5212619 doc: Add @nospell macro around proper names in documentation.
Rik <rik@octave.org>
parents: 17744
diff changeset
31 ## @nospell{Nelder & Mead} Simplex algorithm (a derivative-free method). This
0850b5212619 doc: Add @nospell macro around proper names in documentation.
Rik <rik@octave.org>
parents: 17744
diff changeset
32 ## algorithm is better-suited to functions which have discontinuities or for
0850b5212619 doc: Add @nospell macro around proper names in documentation.
Rik <rik@octave.org>
parents: 17744
diff changeset
33 ## which a gradient-based search such as @code{fminunc} fails.
14895
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
34 ##
20165
f1d0f506ee78 doc: Update more docstrings to have one sentence summary as first line.
Rik <rik@octave.org>
parents: 19596
diff changeset
35 ## Options for the search are provided in the parameter @var{options} using the
f1d0f506ee78 doc: Update more docstrings to have one sentence summary as first line.
Rik <rik@octave.org>
parents: 19596
diff changeset
36 ## function @code{optimset}. Currently, @code{fminsearch} accepts the options:
25739
8eec0403a370 fminsearch.m: Update default TolFun to 1e-4 for Matlab compatibility.
Rik <rik@octave.org>
parents: 25231
diff changeset
37 ## @qcode{"Display"}, @qcode{"FunValCheck"},@qcode{"MaxFunEvals"},
25828
8b548f2f8086 maint: Strip trailing whitespace from source files.
John W. Eaton <jwe@octave.org>
parents: 25739
diff changeset
38 ## @qcode{"MaxIter"}, @qcode{"OutputFcn"}, @qcode{"TolFun"}, @qcode{"TolX"}.
25739
8eec0403a370 fminsearch.m: Update default TolFun to 1e-4 for Matlab compatibility.
Rik <rik@octave.org>
parents: 25231
diff changeset
39 ##
8eec0403a370 fminsearch.m: Update default TolFun to 1e-4 for Matlab compatibility.
Rik <rik@octave.org>
parents: 25231
diff changeset
40 ## @qcode{"MaxFunEvals"} proscribes the maximum number of function evaluations
8eec0403a370 fminsearch.m: Update default TolFun to 1e-4 for Matlab compatibility.
Rik <rik@octave.org>
parents: 25231
diff changeset
41 ## before optimization is halted. The default value is
8eec0403a370 fminsearch.m: Update default TolFun to 1e-4 for Matlab compatibility.
Rik <rik@octave.org>
parents: 25231
diff changeset
42 ## @code{200 * number_of_variables}, i.e., @code{200 * length (@var{x0})}.
8eec0403a370 fminsearch.m: Update default TolFun to 1e-4 for Matlab compatibility.
Rik <rik@octave.org>
parents: 25231
diff changeset
43 ## The value must be a positive integer.
8eec0403a370 fminsearch.m: Update default TolFun to 1e-4 for Matlab compatibility.
Rik <rik@octave.org>
parents: 25231
diff changeset
44 ##
8eec0403a370 fminsearch.m: Update default TolFun to 1e-4 for Matlab compatibility.
Rik <rik@octave.org>
parents: 25231
diff changeset
45 ## @qcode{"MaxIter"} proscribes the maximum number of algorithm iterations
8eec0403a370 fminsearch.m: Update default TolFun to 1e-4 for Matlab compatibility.
Rik <rik@octave.org>
parents: 25231
diff changeset
46 ## before optimization is halted. The default value is
8eec0403a370 fminsearch.m: Update default TolFun to 1e-4 for Matlab compatibility.
Rik <rik@octave.org>
parents: 25231
diff changeset
47 ## @code{200 * number_of_variables}, i.e., @code{200 * length (@var{x0})}.
8eec0403a370 fminsearch.m: Update default TolFun to 1e-4 for Matlab compatibility.
Rik <rik@octave.org>
parents: 25231
diff changeset
48 ## The value must be a positive integer.
25828
8b548f2f8086 maint: Strip trailing whitespace from source files.
John W. Eaton <jwe@octave.org>
parents: 25739
diff changeset
49 ##
25739
8eec0403a370 fminsearch.m: Update default TolFun to 1e-4 for Matlab compatibility.
Rik <rik@octave.org>
parents: 25231
diff changeset
50 ## For a description of the other options, see @code{optimset}. To initialize
8eec0403a370 fminsearch.m: Update default TolFun to 1e-4 for Matlab compatibility.
Rik <rik@octave.org>
parents: 25231
diff changeset
51 ## an options structure with default values for @code{fminsearch} use
8eec0403a370 fminsearch.m: Update default TolFun to 1e-4 for Matlab compatibility.
Rik <rik@octave.org>
parents: 25231
diff changeset
52 ## @code{options = optimset ("fminsearch")}.
14895
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
53 ##
22967
3c896180df16 Pass additional arguments for fminsearch to called function (bug #41888).
Markus Muetzel <markus.muetzel@gmx.de>
parents: 22963
diff changeset
54 ## Additional inputs for the function @var{fun} can be passed as the fourth
3c896180df16 Pass additional arguments for fminsearch to called function (bug #41888).
Markus Muetzel <markus.muetzel@gmx.de>
parents: 22963
diff changeset
55 ## and higher arguments. To pass function arguments while using the default
3c896180df16 Pass additional arguments for fminsearch to called function (bug #41888).
Markus Muetzel <markus.muetzel@gmx.de>
parents: 22963
diff changeset
56 ## @var{options} values, use @code{[]} for @var{options}.
3c896180df16 Pass additional arguments for fminsearch to called function (bug #41888).
Markus Muetzel <markus.muetzel@gmx.de>
parents: 22963
diff changeset
57 ##
25930
a00379f6f8c4 * fminsearch.m: Accept problem structure for Matlab compatibility.
John W. Eaton <jwe@octave.org>
parents: 25828
diff changeset
58 ## @code{fminsearch} may also be called with a single structure argument
a00379f6f8c4 * fminsearch.m: Accept problem structure for Matlab compatibility.
John W. Eaton <jwe@octave.org>
parents: 25828
diff changeset
59 ## with the following fields:
a00379f6f8c4 * fminsearch.m: Accept problem structure for Matlab compatibility.
John W. Eaton <jwe@octave.org>
parents: 25828
diff changeset
60 ##
a00379f6f8c4 * fminsearch.m: Accept problem structure for Matlab compatibility.
John W. Eaton <jwe@octave.org>
parents: 25828
diff changeset
61 ## @table @code
a00379f6f8c4 * fminsearch.m: Accept problem structure for Matlab compatibility.
John W. Eaton <jwe@octave.org>
parents: 25828
diff changeset
62 ## @item objective
a00379f6f8c4 * fminsearch.m: Accept problem structure for Matlab compatibility.
John W. Eaton <jwe@octave.org>
parents: 25828
diff changeset
63 ## The objective function.
a00379f6f8c4 * fminsearch.m: Accept problem structure for Matlab compatibility.
John W. Eaton <jwe@octave.org>
parents: 25828
diff changeset
64 ##
a00379f6f8c4 * fminsearch.m: Accept problem structure for Matlab compatibility.
John W. Eaton <jwe@octave.org>
parents: 25828
diff changeset
65 ## @item x0
a00379f6f8c4 * fminsearch.m: Accept problem structure for Matlab compatibility.
John W. Eaton <jwe@octave.org>
parents: 25828
diff changeset
66 ## The initial point.
a00379f6f8c4 * fminsearch.m: Accept problem structure for Matlab compatibility.
John W. Eaton <jwe@octave.org>
parents: 25828
diff changeset
67 ##
a00379f6f8c4 * fminsearch.m: Accept problem structure for Matlab compatibility.
John W. Eaton <jwe@octave.org>
parents: 25828
diff changeset
68 ## @item solver
a00379f6f8c4 * fminsearch.m: Accept problem structure for Matlab compatibility.
John W. Eaton <jwe@octave.org>
parents: 25828
diff changeset
69 ## Must be set to @qcode{"fminsearch"}.
a00379f6f8c4 * fminsearch.m: Accept problem structure for Matlab compatibility.
John W. Eaton <jwe@octave.org>
parents: 25828
diff changeset
70 ##
a00379f6f8c4 * fminsearch.m: Accept problem structure for Matlab compatibility.
John W. Eaton <jwe@octave.org>
parents: 25828
diff changeset
71 ## @item options
a00379f6f8c4 * fminsearch.m: Accept problem structure for Matlab compatibility.
John W. Eaton <jwe@octave.org>
parents: 25828
diff changeset
72 ## A structure returned from @code{optimset} or an empty matrix to
a00379f6f8c4 * fminsearch.m: Accept problem structure for Matlab compatibility.
John W. Eaton <jwe@octave.org>
parents: 25828
diff changeset
73 ## indicate that defaults should be used.
a00379f6f8c4 * fminsearch.m: Accept problem structure for Matlab compatibility.
John W. Eaton <jwe@octave.org>
parents: 25828
diff changeset
74 ## @end table
a00379f6f8c4 * fminsearch.m: Accept problem structure for Matlab compatibility.
John W. Eaton <jwe@octave.org>
parents: 25828
diff changeset
75 ##
a00379f6f8c4 * fminsearch.m: Accept problem structure for Matlab compatibility.
John W. Eaton <jwe@octave.org>
parents: 25828
diff changeset
76 ## @noindent
a00379f6f8c4 * fminsearch.m: Accept problem structure for Matlab compatibility.
John W. Eaton <jwe@octave.org>
parents: 25828
diff changeset
77 ## The field @code{options} is optional. All others are required.
a00379f6f8c4 * fminsearch.m: Accept problem structure for Matlab compatibility.
John W. Eaton <jwe@octave.org>
parents: 25828
diff changeset
78 ##
20165
f1d0f506ee78 doc: Update more docstrings to have one sentence summary as first line.
Rik <rik@octave.org>
parents: 19596
diff changeset
79 ## On exit, the function returns @var{x}, the minimum point, and @var{fval},
22967
3c896180df16 Pass additional arguments for fminsearch to called function (bug #41888).
Markus Muetzel <markus.muetzel@gmx.de>
parents: 22963
diff changeset
80 ## the function value at the minimum.
14895
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
81 ##
25739
8eec0403a370 fminsearch.m: Update default TolFun to 1e-4 for Matlab compatibility.
Rik <rik@octave.org>
parents: 25231
diff changeset
82 ## The third output @var{exitflag} reports whether the algorithm succeeded and
8eec0403a370 fminsearch.m: Update default TolFun to 1e-4 for Matlab compatibility.
Rik <rik@octave.org>
parents: 25231
diff changeset
83 ## may take one of the following values:
23113
9241a0fa7873 Additional output arguments for fminsearch (bug #44220).
Markus Muetzel <markus.muetzel@gmx.de>
parents: 23085
diff changeset
84 ##
23114
19e958974410 fminsearch.m: fix texinfo header (bug #50178)
Philip Nienhuis <prnienhuis@users.sf.net>
parents: 23113
diff changeset
85 ## @table @asis
23113
9241a0fa7873 Additional output arguments for fminsearch (bug #44220).
Markus Muetzel <markus.muetzel@gmx.de>
parents: 23085
diff changeset
86 ## @item 1
9241a0fa7873 Additional output arguments for fminsearch (bug #44220).
Markus Muetzel <markus.muetzel@gmx.de>
parents: 23085
diff changeset
87 ## if the algorithm converged
25739
8eec0403a370 fminsearch.m: Update default TolFun to 1e-4 for Matlab compatibility.
Rik <rik@octave.org>
parents: 25231
diff changeset
88 ## (size of the simplex is smaller than @code{TolX} @strong{AND} the step in
8eec0403a370 fminsearch.m: Update default TolFun to 1e-4 for Matlab compatibility.
Rik <rik@octave.org>
parents: 25231
diff changeset
89 ## function value between iterations is smaller than @code{TolFun}).
14895
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
90 ##
23113
9241a0fa7873 Additional output arguments for fminsearch (bug #44220).
Markus Muetzel <markus.muetzel@gmx.de>
parents: 23085
diff changeset
91 ## @item 0
9241a0fa7873 Additional output arguments for fminsearch (bug #44220).
Markus Muetzel <markus.muetzel@gmx.de>
parents: 23085
diff changeset
92 ## if the maximum number of iterations or the maximum number of function
9241a0fa7873 Additional output arguments for fminsearch (bug #44220).
Markus Muetzel <markus.muetzel@gmx.de>
parents: 23085
diff changeset
93 ## evaluations are exceeded.
9241a0fa7873 Additional output arguments for fminsearch (bug #44220).
Markus Muetzel <markus.muetzel@gmx.de>
parents: 23085
diff changeset
94 ##
9241a0fa7873 Additional output arguments for fminsearch (bug #44220).
Markus Muetzel <markus.muetzel@gmx.de>
parents: 23085
diff changeset
95 ## @item -1
9241a0fa7873 Additional output arguments for fminsearch (bug #44220).
Markus Muetzel <markus.muetzel@gmx.de>
parents: 23085
diff changeset
96 ## if the iteration is stopped by the @qcode{"OutputFcn"}.
9241a0fa7873 Additional output arguments for fminsearch (bug #44220).
Markus Muetzel <markus.muetzel@gmx.de>
parents: 23085
diff changeset
97 ## @end table
9241a0fa7873 Additional output arguments for fminsearch (bug #44220).
Markus Muetzel <markus.muetzel@gmx.de>
parents: 23085
diff changeset
98 ##
25739
8eec0403a370 fminsearch.m: Update default TolFun to 1e-4 for Matlab compatibility.
Rik <rik@octave.org>
parents: 25231
diff changeset
99 ## The fourth output is a structure @var{output} containing runtime
8eec0403a370 fminsearch.m: Update default TolFun to 1e-4 for Matlab compatibility.
Rik <rik@octave.org>
parents: 25231
diff changeset
100 ## about the algorithm. Fields in the structure are @code{funcCount}
8eec0403a370 fminsearch.m: Update default TolFun to 1e-4 for Matlab compatibility.
Rik <rik@octave.org>
parents: 25231
diff changeset
101 ## containing the number of function calls to @var{fun}, @code{iterations}
8eec0403a370 fminsearch.m: Update default TolFun to 1e-4 for Matlab compatibility.
Rik <rik@octave.org>
parents: 25231
diff changeset
102 ## containing the number of iteration steps, @code{algorithm} with the name of
25828
8b548f2f8086 maint: Strip trailing whitespace from source files.
John W. Eaton <jwe@octave.org>
parents: 25739
diff changeset
103 ## the search algorithm (always:
23567
71bfd507663c doc: Periodic spellcheck of documentation.
Rik <rik@octave.org>
parents: 23220
diff changeset
104 ## @nospell{@qcode{"Nelder-Mead simplex direct search"}}), and @code{message}
71bfd507663c doc: Periodic spellcheck of documentation.
Rik <rik@octave.org>
parents: 23220
diff changeset
105 ## with the exit message.
23113
9241a0fa7873 Additional output arguments for fminsearch (bug #44220).
Markus Muetzel <markus.muetzel@gmx.de>
parents: 23085
diff changeset
106 ##
9241a0fa7873 Additional output arguments for fminsearch (bug #44220).
Markus Muetzel <markus.muetzel@gmx.de>
parents: 23085
diff changeset
107 ## Example:
14895
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
108 ##
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
109 ## @example
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
110 ## fminsearch (@@(x) (x(1)-5).^2+(x(2)-8).^4, [0;0])
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
111 ## @end example
25739
8eec0403a370 fminsearch.m: Update default TolFun to 1e-4 for Matlab compatibility.
Rik <rik@octave.org>
parents: 25231
diff changeset
112 ##
8eec0403a370 fminsearch.m: Update default TolFun to 1e-4 for Matlab compatibility.
Rik <rik@octave.org>
parents: 25231
diff changeset
113 ## Note: If you need to find the minimum of a single variable function it is
8eec0403a370 fminsearch.m: Update default TolFun to 1e-4 for Matlab compatibility.
Rik <rik@octave.org>
parents: 25231
diff changeset
114 ## probably better to use @code{fminbnd}.
14895
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
115 ## @seealso{fminbnd, fminunc, optimset}
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
116 ## @end deftypefn
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
117
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
118 ## PKG_ADD: ## Discard result to avoid polluting workspace with ans at startup.
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
119 ## PKG_ADD: [~] = __all_opts__ ("fminsearch");
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
120
23113
9241a0fa7873 Additional output arguments for fminsearch (bug #44220).
Markus Muetzel <markus.muetzel@gmx.de>
parents: 23085
diff changeset
121 ## FIXME: Add support for output function with "state" set to "interrupt".
14895
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
122
25930
a00379f6f8c4 * fminsearch.m: Accept problem structure for Matlab compatibility.
John W. Eaton <jwe@octave.org>
parents: 25828
diff changeset
123 function [x, fval, exitflag, output] = fminsearch (varargin)
a00379f6f8c4 * fminsearch.m: Accept problem structure for Matlab compatibility.
John W. Eaton <jwe@octave.org>
parents: 25828
diff changeset
124
a00379f6f8c4 * fminsearch.m: Accept problem structure for Matlab compatibility.
John W. Eaton <jwe@octave.org>
parents: 25828
diff changeset
125 if (nargin < 1)
a00379f6f8c4 * fminsearch.m: Accept problem structure for Matlab compatibility.
John W. Eaton <jwe@octave.org>
parents: 25828
diff changeset
126 print_usage ();
a00379f6f8c4 * fminsearch.m: Accept problem structure for Matlab compatibility.
John W. Eaton <jwe@octave.org>
parents: 25828
diff changeset
127 endif
14895
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
128
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
129 ## Get default options if requested.
25930
a00379f6f8c4 * fminsearch.m: Accept problem structure for Matlab compatibility.
John W. Eaton <jwe@octave.org>
parents: 25828
diff changeset
130 if (nargin == 1 && ischar (varargin{1}) && strcmp (varargin{1}, "defaults"))
14895
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
131 x = optimset ("Display", "notify", "FunValCheck", "off",
25739
8eec0403a370 fminsearch.m: Update default TolFun to 1e-4 for Matlab compatibility.
Rik <rik@octave.org>
parents: 25231
diff changeset
132 "MaxFunEvals", [], "MaxIter", [],
14895
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
133 "OutputFcn", [],
25739
8eec0403a370 fminsearch.m: Update default TolFun to 1e-4 for Matlab compatibility.
Rik <rik@octave.org>
parents: 25231
diff changeset
134 "TolFun", 1e-4, "TolX", 1e-4);
14895
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
135 return;
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
136 endif
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
137
25930
a00379f6f8c4 * fminsearch.m: Accept problem structure for Matlab compatibility.
John W. Eaton <jwe@octave.org>
parents: 25828
diff changeset
138 if (nargin == 1)
a00379f6f8c4 * fminsearch.m: Accept problem structure for Matlab compatibility.
John W. Eaton <jwe@octave.org>
parents: 25828
diff changeset
139 problem = varargin{1};
a00379f6f8c4 * fminsearch.m: Accept problem structure for Matlab compatibility.
John W. Eaton <jwe@octave.org>
parents: 25828
diff changeset
140 varargin = {};
a00379f6f8c4 * fminsearch.m: Accept problem structure for Matlab compatibility.
John W. Eaton <jwe@octave.org>
parents: 25828
diff changeset
141 if (! isstruct (problem))
a00379f6f8c4 * fminsearch.m: Accept problem structure for Matlab compatibility.
John W. Eaton <jwe@octave.org>
parents: 25828
diff changeset
142 error ("fminsearch: PROBLEM must be a structure");
a00379f6f8c4 * fminsearch.m: Accept problem structure for Matlab compatibility.
John W. Eaton <jwe@octave.org>
parents: 25828
diff changeset
143 endif
a00379f6f8c4 * fminsearch.m: Accept problem structure for Matlab compatibility.
John W. Eaton <jwe@octave.org>
parents: 25828
diff changeset
144 fun = problem.objective;
a00379f6f8c4 * fminsearch.m: Accept problem structure for Matlab compatibility.
John W. Eaton <jwe@octave.org>
parents: 25828
diff changeset
145 x0 = problem.x0;
a00379f6f8c4 * fminsearch.m: Accept problem structure for Matlab compatibility.
John W. Eaton <jwe@octave.org>
parents: 25828
diff changeset
146 if (! strcmp (problem.solver, "fminsearch"))
a00379f6f8c4 * fminsearch.m: Accept problem structure for Matlab compatibility.
John W. Eaton <jwe@octave.org>
parents: 25828
diff changeset
147 error ('fminsearch: problem.solver must be set to "fminsearch"');
a00379f6f8c4 * fminsearch.m: Accept problem structure for Matlab compatibility.
John W. Eaton <jwe@octave.org>
parents: 25828
diff changeset
148 endif
a00379f6f8c4 * fminsearch.m: Accept problem structure for Matlab compatibility.
John W. Eaton <jwe@octave.org>
parents: 25828
diff changeset
149 if (isfield (problem, "options"))
a00379f6f8c4 * fminsearch.m: Accept problem structure for Matlab compatibility.
John W. Eaton <jwe@octave.org>
parents: 25828
diff changeset
150 options = problem.options;
a00379f6f8c4 * fminsearch.m: Accept problem structure for Matlab compatibility.
John W. Eaton <jwe@octave.org>
parents: 25828
diff changeset
151 else
a00379f6f8c4 * fminsearch.m: Accept problem structure for Matlab compatibility.
John W. Eaton <jwe@octave.org>
parents: 25828
diff changeset
152 options = [];
a00379f6f8c4 * fminsearch.m: Accept problem structure for Matlab compatibility.
John W. Eaton <jwe@octave.org>
parents: 25828
diff changeset
153 endif
a00379f6f8c4 * fminsearch.m: Accept problem structure for Matlab compatibility.
John W. Eaton <jwe@octave.org>
parents: 25828
diff changeset
154 elseif (nargin > 1)
a00379f6f8c4 * fminsearch.m: Accept problem structure for Matlab compatibility.
John W. Eaton <jwe@octave.org>
parents: 25828
diff changeset
155 fun = varargin{1};
a00379f6f8c4 * fminsearch.m: Accept problem structure for Matlab compatibility.
John W. Eaton <jwe@octave.org>
parents: 25828
diff changeset
156 x0 = varargin{2};
a00379f6f8c4 * fminsearch.m: Accept problem structure for Matlab compatibility.
John W. Eaton <jwe@octave.org>
parents: 25828
diff changeset
157 if (nargin > 2)
a00379f6f8c4 * fminsearch.m: Accept problem structure for Matlab compatibility.
John W. Eaton <jwe@octave.org>
parents: 25828
diff changeset
158 options = varargin{3};
a00379f6f8c4 * fminsearch.m: Accept problem structure for Matlab compatibility.
John W. Eaton <jwe@octave.org>
parents: 25828
diff changeset
159 varargin(1:3) = [];
a00379f6f8c4 * fminsearch.m: Accept problem structure for Matlab compatibility.
John W. Eaton <jwe@octave.org>
parents: 25828
diff changeset
160 else
a00379f6f8c4 * fminsearch.m: Accept problem structure for Matlab compatibility.
John W. Eaton <jwe@octave.org>
parents: 25828
diff changeset
161 options = [];
a00379f6f8c4 * fminsearch.m: Accept problem structure for Matlab compatibility.
John W. Eaton <jwe@octave.org>
parents: 25828
diff changeset
162 varargin = {};
a00379f6f8c4 * fminsearch.m: Accept problem structure for Matlab compatibility.
John W. Eaton <jwe@octave.org>
parents: 25828
diff changeset
163 endif
14895
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
164 endif
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
165
25930
a00379f6f8c4 * fminsearch.m: Accept problem structure for Matlab compatibility.
John W. Eaton <jwe@octave.org>
parents: 25828
diff changeset
166 if (isempty (options))
22967
3c896180df16 Pass additional arguments for fminsearch to called function (bug #41888).
Markus Muetzel <markus.muetzel@gmx.de>
parents: 22963
diff changeset
167 options = struct ();
3c896180df16 Pass additional arguments for fminsearch to called function (bug #41888).
Markus Muetzel <markus.muetzel@gmx.de>
parents: 22963
diff changeset
168 endif
14895
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
169
23113
9241a0fa7873 Additional output arguments for fminsearch (bug #44220).
Markus Muetzel <markus.muetzel@gmx.de>
parents: 23085
diff changeset
170 [x, exitflag, output] = nmsmax (fun, x0, options, varargin{:});
14895
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
171
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
172 if (isargout (2))
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
173 fval = feval (fun, x);
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
174 endif
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
175
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
176 endfunction
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
177
23113
9241a0fa7873 Additional output arguments for fminsearch (bug #44220).
Markus Muetzel <markus.muetzel@gmx.de>
parents: 23085
diff changeset
178 ## NMSMAX Nelder-Mead simplex method for direct search optimization.
14895
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
179 ## [x, fmax, nf] = NMSMAX(FUN, x0, STOPIT, SAVIT) attempts to
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
180 ## maximize the function FUN, using the starting vector x0.
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
181 ## The Nelder-Mead direct search method is used.
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
182 ## Output arguments:
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
183 ## x = vector yielding largest function value found,
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
184 ## fmax = function value at x,
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
185 ## nf = number of function evaluations.
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
186 ## The iteration is terminated when either
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
187 ## - the relative size of the simplex is <= STOPIT(1)
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
188 ## (default 1e-3),
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
189 ## - STOPIT(2) function evaluations have been performed
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
190 ## (default inf, i.e., no limit), or
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
191 ## - a function value equals or exceeds STOPIT(3)
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
192 ## (default inf, i.e., no test on function values).
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
193 ## The form of the initial simplex is determined by STOPIT(4):
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
194 ## STOPIT(4) = 0: regular simplex (sides of equal length, the default)
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
195 ## STOPIT(4) = 1: right-angled simplex.
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
196 ## Progress of the iteration is not shown if STOPIT(5) = 0 (default 1).
21751
b571fc85953f maint: Use two spaces after period to indicate sentence break.
Rik <rik@octave.org>
parents: 21099
diff changeset
197 ## STOPIT(6) indicates the direction (i.e., minimization or
14895
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
198 ## maximization.) Default is 1, maximization.
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
199 ## set STOPIT(6)=-1 for minimization
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
200 ## If a non-empty fourth parameter string SAVIT is present, then
15468
6437fa7263dd use ' instead of ` in error messages, warnings and most comments
John W. Eaton <jwe@octave.org>
parents: 14895
diff changeset
201 ## 'SAVE SAVIT x fmax nf' is executed after each inner iteration.
14895
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
202 ## NB: x0 can be a matrix. In the output argument, in SAVIT saves,
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
203 ## and in function calls, x has the same shape as x0.
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
204 ## NMSMAX(fun, x0, STOPIT, SAVIT, P1, P2,...) allows additional
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
205 ## arguments to be passed to fun, via feval(fun,x,P1,P2,...).
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
206 ## References:
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
207 ## N. J. Higham, Optimization by direct search in matrix computations,
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
208 ## SIAM J. Matrix Anal. Appl, 14(2): 317-333, 1993.
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
209 ## C. T. Kelley, Iterative Methods for Optimization, Society for Industrial
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
210 ## and Applied Mathematics, Philadelphia, PA, 1999.
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
211
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
212 ## From Matrix Toolbox
17744
d63878346099 maint: Update copyright notices for release.
John W. Eaton <jwe@octave.org>
parents: 17281
diff changeset
213 ## Copyright (C) 2002, 2013 N.J.Higham
14895
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
214 ## www.maths.man.ac.uk/~higham/mctoolbox
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
215 ##
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
216 ## Modifications for Octave by A.Adler 2003
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
217
23113
9241a0fa7873 Additional output arguments for fminsearch (bug #44220).
Markus Muetzel <markus.muetzel@gmx.de>
parents: 23085
diff changeset
218 function [stopit, savit, dirn, trace, tol, maxiter, tol_f, outfcn] = ...
9241a0fa7873 Additional output arguments for fminsearch (bug #44220).
Markus Muetzel <markus.muetzel@gmx.de>
parents: 23085
diff changeset
219 parse_options (options, x)
14895
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
220
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
221 ## Tolerance for cgce test based on relative size of simplex.
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
222 stopit(1) = tol = optimget (options, "TolX", 1e-4);
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
223
23113
9241a0fa7873 Additional output arguments for fminsearch (bug #44220).
Markus Muetzel <markus.muetzel@gmx.de>
parents: 23085
diff changeset
224 ## Tolerance for cgce test based on step in function value.
25739
8eec0403a370 fminsearch.m: Update default TolFun to 1e-4 for Matlab compatibility.
Rik <rik@octave.org>
parents: 25231
diff changeset
225 tol_f = optimget (options, "TolFun", 1e-4);
23113
9241a0fa7873 Additional output arguments for fminsearch (bug #44220).
Markus Muetzel <markus.muetzel@gmx.de>
parents: 23085
diff changeset
226
9241a0fa7873 Additional output arguments for fminsearch (bug #44220).
Markus Muetzel <markus.muetzel@gmx.de>
parents: 23085
diff changeset
227 ## Max number of function evaluations.
25739
8eec0403a370 fminsearch.m: Update default TolFun to 1e-4 for Matlab compatibility.
Rik <rik@octave.org>
parents: 25231
diff changeset
228 stopit(2) = optimget (options, "MaxFunEvals", 200 * length (x));
14895
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
229
23113
9241a0fa7873 Additional output arguments for fminsearch (bug #44220).
Markus Muetzel <markus.muetzel@gmx.de>
parents: 23085
diff changeset
230 ## Max number of iterations
25739
8eec0403a370 fminsearch.m: Update default TolFun to 1e-4 for Matlab compatibility.
Rik <rik@octave.org>
parents: 25231
diff changeset
231 maxiter = optimget (options, "MaxIter", 200 * length (x));
14895
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
232
23113
9241a0fa7873 Additional output arguments for fminsearch (bug #44220).
Markus Muetzel <markus.muetzel@gmx.de>
parents: 23085
diff changeset
233 ## Default target for function values.
14895
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
234 stopit(3) = Inf; # FIXME: expose this parameter to the outside
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
235
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
236 ## Default initial simplex.
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
237 stopit(4) = 0; # FIXME: expose this parameter to the outside
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
238
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
239 ## Default: show progress.
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
240 display = optimget (options, "Display", "notify");
23113
9241a0fa7873 Additional output arguments for fminsearch (bug #44220).
Markus Muetzel <markus.muetzel@gmx.de>
parents: 23085
diff changeset
241 switch (display)
9241a0fa7873 Additional output arguments for fminsearch (bug #44220).
Markus Muetzel <markus.muetzel@gmx.de>
parents: 23085
diff changeset
242 case "iter"
9241a0fa7873 Additional output arguments for fminsearch (bug #44220).
Markus Muetzel <markus.muetzel@gmx.de>
parents: 23085
diff changeset
243 stopit(5) = 1;
9241a0fa7873 Additional output arguments for fminsearch (bug #44220).
Markus Muetzel <markus.muetzel@gmx.de>
parents: 23085
diff changeset
244 case "final"
9241a0fa7873 Additional output arguments for fminsearch (bug #44220).
Markus Muetzel <markus.muetzel@gmx.de>
parents: 23085
diff changeset
245 stopit(5) = 2;
9241a0fa7873 Additional output arguments for fminsearch (bug #44220).
Markus Muetzel <markus.muetzel@gmx.de>
parents: 23085
diff changeset
246 case "notify"
9241a0fa7873 Additional output arguments for fminsearch (bug #44220).
Markus Muetzel <markus.muetzel@gmx.de>
parents: 23085
diff changeset
247 stopit(5) = 3;
9241a0fa7873 Additional output arguments for fminsearch (bug #44220).
Markus Muetzel <markus.muetzel@gmx.de>
parents: 23085
diff changeset
248 otherwise # "none"
9241a0fa7873 Additional output arguments for fminsearch (bug #44220).
Markus Muetzel <markus.muetzel@gmx.de>
parents: 23085
diff changeset
249 stopit(5) = 0;
9241a0fa7873 Additional output arguments for fminsearch (bug #44220).
Markus Muetzel <markus.muetzel@gmx.de>
parents: 23085
diff changeset
250 endswitch
14895
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
251 trace = stopit(5);
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
252
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
253 ## Use function to minimize, not maximize
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
254 stopit(6) = dirn = -1;
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
255
20713
2469d78a1d8b Consistently use 'filename' rather than 'file name' throughout code base.
Rik <rik@octave.org>
parents: 20231
diff changeset
256 ## Filename for snapshots.
14895
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
257 savit = []; # FIXME: expose this parameter to the outside
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
258
23113
9241a0fa7873 Additional output arguments for fminsearch (bug #44220).
Markus Muetzel <markus.muetzel@gmx.de>
parents: 23085
diff changeset
259 ## OutputFcn
9241a0fa7873 Additional output arguments for fminsearch (bug #44220).
Markus Muetzel <markus.muetzel@gmx.de>
parents: 23085
diff changeset
260 outfcn = optimget (options, "OutputFcn");
9241a0fa7873 Additional output arguments for fminsearch (bug #44220).
Markus Muetzel <markus.muetzel@gmx.de>
parents: 23085
diff changeset
261
14895
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
262 endfunction
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
263
23113
9241a0fa7873 Additional output arguments for fminsearch (bug #44220).
Markus Muetzel <markus.muetzel@gmx.de>
parents: 23085
diff changeset
264 function [x, exitflag, output] = nmsmax (fun, x, options, varargin)
14895
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
265
23113
9241a0fa7873 Additional output arguments for fminsearch (bug #44220).
Markus Muetzel <markus.muetzel@gmx.de>
parents: 23085
diff changeset
266 [stopit, savit, dirn, trace, tol, maxiter, tol_f, outfcn] = ...
9241a0fa7873 Additional output arguments for fminsearch (bug #44220).
Markus Muetzel <markus.muetzel@gmx.de>
parents: 23085
diff changeset
267 parse_options (options, x);
14895
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
268
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
269 if (strcmpi (optimget (options, "FunValCheck", "off"), "on"))
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
270 ## Replace fcn with a guarded version.
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
271 fun = @(x) guarded_eval (fun, x);
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
272 endif
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
273
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
274 x0 = x(:); # Work with column vector internally.
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
275 n = length (x0);
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
276
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
277 V = [zeros(n,1) eye(n)];
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
278 f = zeros (n+1,1);
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
279 V(:,1) = x0;
25930
a00379f6f8c4 * fminsearch.m: Accept problem structure for Matlab compatibility.
John W. Eaton <jwe@octave.org>
parents: 25828
diff changeset
280 f(1) = dirn * fun (x, varargin{:});
14895
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
281 fmax_old = f(1);
23113
9241a0fa7873 Additional output arguments for fminsearch (bug #44220).
Markus Muetzel <markus.muetzel@gmx.de>
parents: 23085
diff changeset
282 nf = 1;
14895
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
283
23113
9241a0fa7873 Additional output arguments for fminsearch (bug #44220).
Markus Muetzel <markus.muetzel@gmx.de>
parents: 23085
diff changeset
284 if (trace == 1)
9241a0fa7873 Additional output arguments for fminsearch (bug #44220).
Markus Muetzel <markus.muetzel@gmx.de>
parents: 23085
diff changeset
285 printf ("f(x0) = %9.4e\n", f(1));
14895
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
286 endif
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
287
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
288 k = 0; m = 0;
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
289
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
290 ## Set up initial simplex.
23113
9241a0fa7873 Additional output arguments for fminsearch (bug #44220).
Markus Muetzel <markus.muetzel@gmx.de>
parents: 23085
diff changeset
291 scale = max (norm (x0, Inf), 1);
14895
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
292 if (stopit(4) == 0)
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
293 ## Regular simplex - all edges have same length.
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
294 ## Generated from construction given in reference [18, pp. 80-81] of [1].
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
295 alpha = scale / (n*sqrt (2)) * [sqrt(n+1)-1+n, sqrt(n+1)-1];
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
296 V(:,2:n+1) = (x0 + alpha(2)*ones (n,1)) * ones (1,n);
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
297 for j = 2:n+1
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
298 V(j-1,j) = x0(j-1) + alpha(1);
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
299 x(:) = V(:,j);
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
300 f(j) = dirn * feval (fun,x,varargin{:});
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
301 endfor
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
302 else
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
303 ## Right-angled simplex based on co-ordinate axes.
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
304 alpha = scale * ones(n+1,1);
23113
9241a0fa7873 Additional output arguments for fminsearch (bug #44220).
Markus Muetzel <markus.muetzel@gmx.de>
parents: 23085
diff changeset
305 for j = 2:n+1
14895
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
306 V(:,j) = x0 + alpha(j)*V(:,j);
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
307 x(:) = V(:,j);
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
308 f(j) = dirn * feval (fun,x,varargin{:});
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
309 endfor
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
310 endif
23113
9241a0fa7873 Additional output arguments for fminsearch (bug #44220).
Markus Muetzel <markus.muetzel@gmx.de>
parents: 23085
diff changeset
311 nf += n;
14895
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
312 how = "initial ";
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
313
23113
9241a0fa7873 Additional output arguments for fminsearch (bug #44220).
Markus Muetzel <markus.muetzel@gmx.de>
parents: 23085
diff changeset
314 [~, j] = sort (f);
14895
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
315 j = j(n+1:-1:1);
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
316 f = f(j);
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
317 V = V(:,j);
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
318
23113
9241a0fa7873 Additional output arguments for fminsearch (bug #44220).
Markus Muetzel <markus.muetzel@gmx.de>
parents: 23085
diff changeset
319 exitflag = 0;
9241a0fa7873 Additional output arguments for fminsearch (bug #44220).
Markus Muetzel <markus.muetzel@gmx.de>
parents: 23085
diff changeset
320
9241a0fa7873 Additional output arguments for fminsearch (bug #44220).
Markus Muetzel <markus.muetzel@gmx.de>
parents: 23085
diff changeset
321 if (! isempty (outfcn))
9241a0fa7873 Additional output arguments for fminsearch (bug #44220).
Markus Muetzel <markus.muetzel@gmx.de>
parents: 23085
diff changeset
322 optimvalues.iteration = 0;
9241a0fa7873 Additional output arguments for fminsearch (bug #44220).
Markus Muetzel <markus.muetzel@gmx.de>
parents: 23085
diff changeset
323 optimvalues.funccount = nf;
9241a0fa7873 Additional output arguments for fminsearch (bug #44220).
Markus Muetzel <markus.muetzel@gmx.de>
parents: 23085
diff changeset
324 optimvalues.fval = f(1);
9241a0fa7873 Additional output arguments for fminsearch (bug #44220).
Markus Muetzel <markus.muetzel@gmx.de>
parents: 23085
diff changeset
325 optimvalues.procedure = how;
9241a0fa7873 Additional output arguments for fminsearch (bug #44220).
Markus Muetzel <markus.muetzel@gmx.de>
parents: 23085
diff changeset
326 state = "init";
9241a0fa7873 Additional output arguments for fminsearch (bug #44220).
Markus Muetzel <markus.muetzel@gmx.de>
parents: 23085
diff changeset
327 stop = outfcn (x, optimvalues, state);
9241a0fa7873 Additional output arguments for fminsearch (bug #44220).
Markus Muetzel <markus.muetzel@gmx.de>
parents: 23085
diff changeset
328 if (stop)
9241a0fa7873 Additional output arguments for fminsearch (bug #44220).
Markus Muetzel <markus.muetzel@gmx.de>
parents: 23085
diff changeset
329 msg = "Stopped by OutputFcn\n";
9241a0fa7873 Additional output arguments for fminsearch (bug #44220).
Markus Muetzel <markus.muetzel@gmx.de>
parents: 23085
diff changeset
330 exitflag = -1;
9241a0fa7873 Additional output arguments for fminsearch (bug #44220).
Markus Muetzel <markus.muetzel@gmx.de>
parents: 23085
diff changeset
331 endif
9241a0fa7873 Additional output arguments for fminsearch (bug #44220).
Markus Muetzel <markus.muetzel@gmx.de>
parents: 23085
diff changeset
332 endif
9241a0fa7873 Additional output arguments for fminsearch (bug #44220).
Markus Muetzel <markus.muetzel@gmx.de>
parents: 23085
diff changeset
333
14895
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
334 alpha = 1; beta = 1/2; gamma = 2;
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
335
23113
9241a0fa7873 Additional output arguments for fminsearch (bug #44220).
Markus Muetzel <markus.muetzel@gmx.de>
parents: 23085
diff changeset
336 while (exitflag != -1) # Outer (and only) loop.
20735
418ae0cb752f Replace ++,-- with in-place operators for performance.
Rik <rik@octave.org>
parents: 20713
diff changeset
337 k += 1;
14895
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
338
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
339 if (k > maxiter)
25739
8eec0403a370 fminsearch.m: Update default TolFun to 1e-4 for Matlab compatibility.
Rik <rik@octave.org>
parents: 25231
diff changeset
340 msg = "Exceeded maximum iterations\n";
14895
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
341 break;
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
342 endif
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
343
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
344 fmax = f(1);
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
345 if (fmax > fmax_old)
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
346 if (! isempty (savit))
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
347 x(:) = V(:,1);
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
348 eval (["save " savit " x fmax nf"]);
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
349 endif
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
350 endif
23113
9241a0fa7873 Additional output arguments for fminsearch (bug #44220).
Markus Muetzel <markus.muetzel@gmx.de>
parents: 23085
diff changeset
351 if (trace == 1)
9241a0fa7873 Additional output arguments for fminsearch (bug #44220).
Markus Muetzel <markus.muetzel@gmx.de>
parents: 23085
diff changeset
352 printf ("Iter. %2.0f,", k);
9241a0fa7873 Additional output arguments for fminsearch (bug #44220).
Markus Muetzel <markus.muetzel@gmx.de>
parents: 23085
diff changeset
353 printf (" how = %-11s", [how ","]);
9241a0fa7873 Additional output arguments for fminsearch (bug #44220).
Markus Muetzel <markus.muetzel@gmx.de>
parents: 23085
diff changeset
354 printf ("nf = %3.0f, f = %9.4e (%2.1f%%)\n", nf, fmax, ...
9241a0fa7873 Additional output arguments for fminsearch (bug #44220).
Markus Muetzel <markus.muetzel@gmx.de>
parents: 23085
diff changeset
355 100*(fmax-fmax_old)/(abs(fmax_old)+eps));
14895
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
356 endif
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
357 fmax_old = fmax;
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
358
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
359 ## Three stopping tests from MDSMAX.M
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
360
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
361 ## Stopping Test 1 - f reached target value?
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
362 if (fmax >= stopit(3))
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
363 msg = "Exceeded target...quitting\n";
25739
8eec0403a370 fminsearch.m: Update default TolFun to 1e-4 for Matlab compatibility.
Rik <rik@octave.org>
parents: 25231
diff changeset
364 ## FIXME: Add documentation when stopit(3) gets exposed to the outside
23113
9241a0fa7873 Additional output arguments for fminsearch (bug #44220).
Markus Muetzel <markus.muetzel@gmx.de>
parents: 23085
diff changeset
365 exitflag = -1;
14895
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
366 break;
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
367 endif
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
368
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
369 ## Stopping Test 2 - too many f-evals?
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
370 if (nf >= stopit(2))
25739
8eec0403a370 fminsearch.m: Update default TolFun to 1e-4 for Matlab compatibility.
Rik <rik@octave.org>
parents: 25231
diff changeset
371 msg = "Exceeded maximum number of function evaluations\n";
8eec0403a370 fminsearch.m: Update default TolFun to 1e-4 for Matlab compatibility.
Rik <rik@octave.org>
parents: 25231
diff changeset
372 exitflag = 0;
14895
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
373 break;
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
374 endif
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
375
23113
9241a0fa7873 Additional output arguments for fminsearch (bug #44220).
Markus Muetzel <markus.muetzel@gmx.de>
parents: 23085
diff changeset
376 ## Stopping Test 3 - converged? The first part is test (4.3) in [1].
14895
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
377 v1 = V(:,1);
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
378 size_simplex = norm (V(:,2:n+1)-v1(:,ones (1,n)),1) / max (1, norm (v1,1));
23113
9241a0fa7873 Additional output arguments for fminsearch (bug #44220).
Markus Muetzel <markus.muetzel@gmx.de>
parents: 23085
diff changeset
379 step_f = max (abs (f(1) - f(2:n+1)));
9241a0fa7873 Additional output arguments for fminsearch (bug #44220).
Markus Muetzel <markus.muetzel@gmx.de>
parents: 23085
diff changeset
380 if (size_simplex <= tol && step_f <= tol_f )
25739
8eec0403a370 fminsearch.m: Update default TolFun to 1e-4 for Matlab compatibility.
Rik <rik@octave.org>
parents: 25231
diff changeset
381 msg = sprintf (["Algorithm converged. Simplex size %9.4e <= %9.4e ", ...
8eec0403a370 fminsearch.m: Update default TolFun to 1e-4 for Matlab compatibility.
Rik <rik@octave.org>
parents: 25231
diff changeset
382 "and step in function value %9.4e <= %9.4e\n"], ...
23113
9241a0fa7873 Additional output arguments for fminsearch (bug #44220).
Markus Muetzel <markus.muetzel@gmx.de>
parents: 23085
diff changeset
383 size_simplex, tol, step_f, tol_f);
9241a0fa7873 Additional output arguments for fminsearch (bug #44220).
Markus Muetzel <markus.muetzel@gmx.de>
parents: 23085
diff changeset
384 exitflag = 1;
14895
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
385 break;
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
386 endif
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
387
23113
9241a0fa7873 Additional output arguments for fminsearch (bug #44220).
Markus Muetzel <markus.muetzel@gmx.de>
parents: 23085
diff changeset
388 ## Call OutputFcn
9241a0fa7873 Additional output arguments for fminsearch (bug #44220).
Markus Muetzel <markus.muetzel@gmx.de>
parents: 23085
diff changeset
389 if (! isempty (outfcn))
9241a0fa7873 Additional output arguments for fminsearch (bug #44220).
Markus Muetzel <markus.muetzel@gmx.de>
parents: 23085
diff changeset
390 optimvalues.funccount = nf;
9241a0fa7873 Additional output arguments for fminsearch (bug #44220).
Markus Muetzel <markus.muetzel@gmx.de>
parents: 23085
diff changeset
391 optimvalues.fval = f(1);
9241a0fa7873 Additional output arguments for fminsearch (bug #44220).
Markus Muetzel <markus.muetzel@gmx.de>
parents: 23085
diff changeset
392 optimvalues.iteration = k;
9241a0fa7873 Additional output arguments for fminsearch (bug #44220).
Markus Muetzel <markus.muetzel@gmx.de>
parents: 23085
diff changeset
393 optimvalues.procedure = how;
9241a0fa7873 Additional output arguments for fminsearch (bug #44220).
Markus Muetzel <markus.muetzel@gmx.de>
parents: 23085
diff changeset
394 state = "iter";
9241a0fa7873 Additional output arguments for fminsearch (bug #44220).
Markus Muetzel <markus.muetzel@gmx.de>
parents: 23085
diff changeset
395 stop = outfcn (x, optimvalues, state);
9241a0fa7873 Additional output arguments for fminsearch (bug #44220).
Markus Muetzel <markus.muetzel@gmx.de>
parents: 23085
diff changeset
396 if (stop)
9241a0fa7873 Additional output arguments for fminsearch (bug #44220).
Markus Muetzel <markus.muetzel@gmx.de>
parents: 23085
diff changeset
397 msg = "Stopped by OutputFcn\n";
9241a0fa7873 Additional output arguments for fminsearch (bug #44220).
Markus Muetzel <markus.muetzel@gmx.de>
parents: 23085
diff changeset
398 exitflag = -1;
9241a0fa7873 Additional output arguments for fminsearch (bug #44220).
Markus Muetzel <markus.muetzel@gmx.de>
parents: 23085
diff changeset
399 break;
9241a0fa7873 Additional output arguments for fminsearch (bug #44220).
Markus Muetzel <markus.muetzel@gmx.de>
parents: 23085
diff changeset
400 endif
9241a0fa7873 Additional output arguments for fminsearch (bug #44220).
Markus Muetzel <markus.muetzel@gmx.de>
parents: 23085
diff changeset
401 endif
9241a0fa7873 Additional output arguments for fminsearch (bug #44220).
Markus Muetzel <markus.muetzel@gmx.de>
parents: 23085
diff changeset
402
14895
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
403 ## One step of the Nelder-Mead simplex algorithm
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
404 ## NJH: Altered function calls and changed CNT to NF.
15468
6437fa7263dd use ' instead of ` in error messages, warnings and most comments
John W. Eaton <jwe@octave.org>
parents: 14895
diff changeset
405 ## Changed each 'fr < f(1)' type test to '>' for maximization
14895
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
406 ## and re-ordered function values after sort.
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
407
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
408 vbar = (sum (V(:,1:n)')/n)'; # Mean value
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
409 vr = (1 + alpha)*vbar - alpha*V(:,n+1);
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
410 x(:) = vr;
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
411 fr = dirn * feval (fun,x,varargin{:});
20231
83792dd9bcc1 Use in-place operators in m-files where possible.
Rik <rik@octave.org>
parents: 20165
diff changeset
412 nf += 1;
23113
9241a0fa7873 Additional output arguments for fminsearch (bug #44220).
Markus Muetzel <markus.muetzel@gmx.de>
parents: 23085
diff changeset
413 vk = vr; fk = fr; how = "reflect";
14895
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
414 if (fr > f(n))
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
415 if (fr > f(1))
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
416 ve = gamma*vr + (1-gamma)*vbar;
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
417 x(:) = ve;
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
418 fe = dirn * feval (fun,x,varargin{:});
20231
83792dd9bcc1 Use in-place operators in m-files where possible.
Rik <rik@octave.org>
parents: 20165
diff changeset
419 nf += 1;
14895
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
420 if (fe > f(1))
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
421 vk = ve;
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
422 fk = fe;
23113
9241a0fa7873 Additional output arguments for fminsearch (bug #44220).
Markus Muetzel <markus.muetzel@gmx.de>
parents: 23085
diff changeset
423 how = "expand";
14895
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
424 endif
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
425 endif
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
426 else
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
427 vt = V(:,n+1);
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
428 ft = f(n+1);
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
429 if (fr > ft)
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
430 vt = vr;
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
431 ft = fr;
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
432 endif
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
433 vc = beta*vt + (1-beta)*vbar;
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
434 x(:) = vc;
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
435 fc = dirn * feval (fun,x,varargin{:});
20231
83792dd9bcc1 Use in-place operators in m-files where possible.
Rik <rik@octave.org>
parents: 20165
diff changeset
436 nf += 1;
14895
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
437 if (fc > f(n))
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
438 vk = vc; fk = fc;
23113
9241a0fa7873 Additional output arguments for fminsearch (bug #44220).
Markus Muetzel <markus.muetzel@gmx.de>
parents: 23085
diff changeset
439 how = "contract";
14895
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
440 else
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
441 for j = 2:n
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
442 V(:,j) = (V(:,1) + V(:,j))/2;
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
443 x(:) = V(:,j);
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
444 f(j) = dirn * feval (fun,x,varargin{:});
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
445 endfor
20231
83792dd9bcc1 Use in-place operators in m-files where possible.
Rik <rik@octave.org>
parents: 20165
diff changeset
446 nf += n-1;
14895
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
447 vk = (V(:,1) + V(:,n+1))/2;
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
448 x(:) = vk;
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
449 fk = dirn * feval (fun,x,varargin{:});
20231
83792dd9bcc1 Use in-place operators in m-files where possible.
Rik <rik@octave.org>
parents: 20165
diff changeset
450 nf += 1;
23113
9241a0fa7873 Additional output arguments for fminsearch (bug #44220).
Markus Muetzel <markus.muetzel@gmx.de>
parents: 23085
diff changeset
451 how = "shrink";
14895
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
452 endif
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
453 endif
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
454 V(:,n+1) = vk;
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
455 f(n+1) = fk;
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
456 [~,j] = sort(f);
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
457 j = j(n+1:-1:1);
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
458 f = f(j);
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
459 V = V(:,j);
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
460
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
461 endwhile # End of outer (and only) loop.
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
462
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
463 ## Finished.
23113
9241a0fa7873 Additional output arguments for fminsearch (bug #44220).
Markus Muetzel <markus.muetzel@gmx.de>
parents: 23085
diff changeset
464 if ( (trace == 1) || (trace == 2) || (trace == 3 && exitflag != 1) )
9241a0fa7873 Additional output arguments for fminsearch (bug #44220).
Markus Muetzel <markus.muetzel@gmx.de>
parents: 23085
diff changeset
465 printf (msg);
14895
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
466 endif
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
467 x(:) = V(:,1);
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
468
23113
9241a0fa7873 Additional output arguments for fminsearch (bug #44220).
Markus Muetzel <markus.muetzel@gmx.de>
parents: 23085
diff changeset
469 ## FIXME: Should outputfcn be called only if exitflag != 0,
9241a0fa7873 Additional output arguments for fminsearch (bug #44220).
Markus Muetzel <markus.muetzel@gmx.de>
parents: 23085
diff changeset
470 ## i.e., only when we have successfully converged?
9241a0fa7873 Additional output arguments for fminsearch (bug #44220).
Markus Muetzel <markus.muetzel@gmx.de>
parents: 23085
diff changeset
471 if (! isempty (outfcn))
9241a0fa7873 Additional output arguments for fminsearch (bug #44220).
Markus Muetzel <markus.muetzel@gmx.de>
parents: 23085
diff changeset
472 optimvalues.funccount = nf;
9241a0fa7873 Additional output arguments for fminsearch (bug #44220).
Markus Muetzel <markus.muetzel@gmx.de>
parents: 23085
diff changeset
473 optimvalues.fval = f(1);
9241a0fa7873 Additional output arguments for fminsearch (bug #44220).
Markus Muetzel <markus.muetzel@gmx.de>
parents: 23085
diff changeset
474 optimvalues.iteration = k;
9241a0fa7873 Additional output arguments for fminsearch (bug #44220).
Markus Muetzel <markus.muetzel@gmx.de>
parents: 23085
diff changeset
475 optimvalues.procedure = how;
9241a0fa7873 Additional output arguments for fminsearch (bug #44220).
Markus Muetzel <markus.muetzel@gmx.de>
parents: 23085
diff changeset
476 state = "done";
9241a0fa7873 Additional output arguments for fminsearch (bug #44220).
Markus Muetzel <markus.muetzel@gmx.de>
parents: 23085
diff changeset
477 outfcn (x, optimvalues, state);
9241a0fa7873 Additional output arguments for fminsearch (bug #44220).
Markus Muetzel <markus.muetzel@gmx.de>
parents: 23085
diff changeset
478 endif
9241a0fa7873 Additional output arguments for fminsearch (bug #44220).
Markus Muetzel <markus.muetzel@gmx.de>
parents: 23085
diff changeset
479
9241a0fa7873 Additional output arguments for fminsearch (bug #44220).
Markus Muetzel <markus.muetzel@gmx.de>
parents: 23085
diff changeset
480 ## output
9241a0fa7873 Additional output arguments for fminsearch (bug #44220).
Markus Muetzel <markus.muetzel@gmx.de>
parents: 23085
diff changeset
481 output.iterations = k;
9241a0fa7873 Additional output arguments for fminsearch (bug #44220).
Markus Muetzel <markus.muetzel@gmx.de>
parents: 23085
diff changeset
482 output.funcCount = nf;
9241a0fa7873 Additional output arguments for fminsearch (bug #44220).
Markus Muetzel <markus.muetzel@gmx.de>
parents: 23085
diff changeset
483 output.algorithm = "Nelder-Mead simplex direct search";
9241a0fa7873 Additional output arguments for fminsearch (bug #44220).
Markus Muetzel <markus.muetzel@gmx.de>
parents: 23085
diff changeset
484 output.message = msg;
9241a0fa7873 Additional output arguments for fminsearch (bug #44220).
Markus Muetzel <markus.muetzel@gmx.de>
parents: 23085
diff changeset
485
14895
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
486 endfunction
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
487
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
488 ## A helper function that evaluates a function and checks for bad results.
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
489 function y = guarded_eval (fun, x)
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
490
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
491 y = fun (x);
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
492
22962
fba8a6c742c6 fminsearch.m: Fix error in "guarded_eval".
Markus Muetzel <markus.muetzel@gmx.de>
parents: 22323
diff changeset
493 if (! (isreal (y)))
14895
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
494 error ("fminsearch:notreal", "fminsearch: non-real value encountered");
22962
fba8a6c742c6 fminsearch.m: Fix error in "guarded_eval".
Markus Muetzel <markus.muetzel@gmx.de>
parents: 22323
diff changeset
495 elseif (any (isnan (y(:))))
14895
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
496 error ("fminsearch:isnan", "fminsearch: NaN value encountered");
22962
fba8a6c742c6 fminsearch.m: Fix error in "guarded_eval".
Markus Muetzel <markus.muetzel@gmx.de>
parents: 22323
diff changeset
497 elseif (any (isinf (y(:))))
14895
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
498 error ("fminsearch:isinf", "fminsearch: Inf value encountered");
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
499 endif
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
500
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
501 endfunction
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
502
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
503
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
504 %!demo
23113
9241a0fa7873 Additional output arguments for fminsearch (bug #44220).
Markus Muetzel <markus.muetzel@gmx.de>
parents: 23085
diff changeset
505 %! clf;
9241a0fa7873 Additional output arguments for fminsearch (bug #44220).
Markus Muetzel <markus.muetzel@gmx.de>
parents: 23085
diff changeset
506 %! hold on;
9241a0fa7873 Additional output arguments for fminsearch (bug #44220).
Markus Muetzel <markus.muetzel@gmx.de>
parents: 23085
diff changeset
507 %! draw_fcn = @(x) (plot (x(1), x(2)) && false);
22962
fba8a6c742c6 fminsearch.m: Fix error in "guarded_eval".
Markus Muetzel <markus.muetzel@gmx.de>
parents: 22323
diff changeset
508 %! fcn = @(x) (x(1)-5).^2 + (x(2)-8).^4;
14895
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
509 %! x0 = [0;0];
23113
9241a0fa7873 Additional output arguments for fminsearch (bug #44220).
Markus Muetzel <markus.muetzel@gmx.de>
parents: 23085
diff changeset
510 %! [xmin, fval] = fminsearch (fcn, x0, optimset ("OutputFcn", draw_fcn))
9241a0fa7873 Additional output arguments for fminsearch (bug #44220).
Markus Muetzel <markus.muetzel@gmx.de>
parents: 23085
diff changeset
511 %! hold off;
14895
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
512
22962
fba8a6c742c6 fminsearch.m: Fix error in "guarded_eval".
Markus Muetzel <markus.muetzel@gmx.de>
parents: 22323
diff changeset
513 %!assert (fminsearch (@sin, 3, optimset ("MaxIter", 30)), 3*pi/2, 1e-4)
23113
9241a0fa7873 Additional output arguments for fminsearch (bug #44220).
Markus Muetzel <markus.muetzel@gmx.de>
parents: 23085
diff changeset
514
25231
e1024058833c test: change remaining %!xtests into %!tests
Mike Miller <mtmiller@octave.org>
parents: 25054
diff changeset
515 ## FIXME: The following test is for checking that fminsearch stops earlier
e1024058833c test: change remaining %!xtests into %!tests
Mike Miller <mtmiller@octave.org>
parents: 25054
diff changeset
516 ## with these settings. If the optimizer algorithm is changed, it
e1024058833c test: change remaining %!xtests into %!tests
Mike Miller <mtmiller@octave.org>
parents: 25054
diff changeset
517 ## may fail. Just adapt the values to make it pass again.
e1024058833c test: change remaining %!xtests into %!tests
Mike Miller <mtmiller@octave.org>
parents: 25054
diff changeset
518 %!test
23113
9241a0fa7873 Additional output arguments for fminsearch (bug #44220).
Markus Muetzel <markus.muetzel@gmx.de>
parents: 23085
diff changeset
519 %! x = fminsearch (@sin, 3, optimset ("MaxIter", 3, "Display", "none"));
9241a0fa7873 Additional output arguments for fminsearch (bug #44220).
Markus Muetzel <markus.muetzel@gmx.de>
parents: 23085
diff changeset
520 %! assert (x, 4.8750, 1e-4);
9241a0fa7873 Additional output arguments for fminsearch (bug #44220).
Markus Muetzel <markus.muetzel@gmx.de>
parents: 23085
diff changeset
521 %! x = fminsearch (@sin, 3, optimset ("MaxFunEvals", 18, "Display", "none"));
9241a0fa7873 Additional output arguments for fminsearch (bug #44220).
Markus Muetzel <markus.muetzel@gmx.de>
parents: 23085
diff changeset
522 %! assert (x, 4.7109, 1e-4);
9241a0fa7873 Additional output arguments for fminsearch (bug #44220).
Markus Muetzel <markus.muetzel@gmx.de>
parents: 23085
diff changeset
523
22962
fba8a6c742c6 fminsearch.m: Fix error in "guarded_eval".
Markus Muetzel <markus.muetzel@gmx.de>
parents: 22323
diff changeset
524 %!test
25930
a00379f6f8c4 * fminsearch.m: Accept problem structure for Matlab compatibility.
John W. Eaton <jwe@octave.org>
parents: 25828
diff changeset
525 %! problem.objective = @sin;
a00379f6f8c4 * fminsearch.m: Accept problem structure for Matlab compatibility.
John W. Eaton <jwe@octave.org>
parents: 25828
diff changeset
526 %! problem.x0 = 3;
a00379f6f8c4 * fminsearch.m: Accept problem structure for Matlab compatibility.
John W. Eaton <jwe@octave.org>
parents: 25828
diff changeset
527 %! problem.solver = "fminsearch";
a00379f6f8c4 * fminsearch.m: Accept problem structure for Matlab compatibility.
John W. Eaton <jwe@octave.org>
parents: 25828
diff changeset
528 %! problem.options = optimset ("MaxIter", 3, "Display", "none")
a00379f6f8c4 * fminsearch.m: Accept problem structure for Matlab compatibility.
John W. Eaton <jwe@octave.org>
parents: 25828
diff changeset
529 %! x = fminsearch (problem);
a00379f6f8c4 * fminsearch.m: Accept problem structure for Matlab compatibility.
John W. Eaton <jwe@octave.org>
parents: 25828
diff changeset
530 %! assert (x, 4.8750, 1e-4);
a00379f6f8c4 * fminsearch.m: Accept problem structure for Matlab compatibility.
John W. Eaton <jwe@octave.org>
parents: 25828
diff changeset
531 %! problem.options = optimset ("MaxFunEvals", 18, "Display", "none")
a00379f6f8c4 * fminsearch.m: Accept problem structure for Matlab compatibility.
John W. Eaton <jwe@octave.org>
parents: 25828
diff changeset
532 %! x = fminsearch (problem);
a00379f6f8c4 * fminsearch.m: Accept problem structure for Matlab compatibility.
John W. Eaton <jwe@octave.org>
parents: 25828
diff changeset
533 %! assert (x, 4.7109, 1e-4);
a00379f6f8c4 * fminsearch.m: Accept problem structure for Matlab compatibility.
John W. Eaton <jwe@octave.org>
parents: 25828
diff changeset
534
a00379f6f8c4 * fminsearch.m: Accept problem structure for Matlab compatibility.
John W. Eaton <jwe@octave.org>
parents: 25828
diff changeset
535 %!test
14895
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
536 %! c = 1.5;
23113
9241a0fa7873 Additional output arguments for fminsearch (bug #44220).
Markus Muetzel <markus.muetzel@gmx.de>
parents: 23085
diff changeset
537 %! assert (fminsearch (@(x) x(1).^2 + c*x(2).^2, [1;1]), [0;0], 1e-4);
22962
fba8a6c742c6 fminsearch.m: Fix error in "guarded_eval".
Markus Muetzel <markus.muetzel@gmx.de>
parents: 22323
diff changeset
538
23113
9241a0fa7873 Additional output arguments for fminsearch (bug #44220).
Markus Muetzel <markus.muetzel@gmx.de>
parents: 23085
diff changeset
539 ## additional input argument
22967
3c896180df16 Pass additional arguments for fminsearch to called function (bug #41888).
Markus Muetzel <markus.muetzel@gmx.de>
parents: 22963
diff changeset
540 %!test
3c896180df16 Pass additional arguments for fminsearch to called function (bug #41888).
Markus Muetzel <markus.muetzel@gmx.de>
parents: 22963
diff changeset
541 %! x1 = fminsearch (@(x, c) x(1).^2 + c*x(2).^2, [1;1], [], 1.5);
3c896180df16 Pass additional arguments for fminsearch to called function (bug #41888).
Markus Muetzel <markus.muetzel@gmx.de>
parents: 22963
diff changeset
542 %! assert (x1, [0;0], 1e-4);
23113
9241a0fa7873 Additional output arguments for fminsearch (bug #44220).
Markus Muetzel <markus.muetzel@gmx.de>
parents: 23085
diff changeset
543 %! x1 = fminsearch (@(x, c) c(1)*x(1).^2 + c(2)*x(2).^2, [1;1], ...
9241a0fa7873 Additional output arguments for fminsearch (bug #44220).
Markus Muetzel <markus.muetzel@gmx.de>
parents: 23085
diff changeset
544 %! optimset ("Display", "none"), [1 1.5]);
22967
3c896180df16 Pass additional arguments for fminsearch to called function (bug #41888).
Markus Muetzel <markus.muetzel@gmx.de>
parents: 22963
diff changeset
545 %! assert (x1, [0;0], 1e-4);
22962
fba8a6c742c6 fminsearch.m: Fix error in "guarded_eval".
Markus Muetzel <markus.muetzel@gmx.de>
parents: 22323
diff changeset
546
23113
9241a0fa7873 Additional output arguments for fminsearch (bug #44220).
Markus Muetzel <markus.muetzel@gmx.de>
parents: 23085
diff changeset
547 ## all output arguments
9241a0fa7873 Additional output arguments for fminsearch (bug #44220).
Markus Muetzel <markus.muetzel@gmx.de>
parents: 23085
diff changeset
548 %!test
9241a0fa7873 Additional output arguments for fminsearch (bug #44220).
Markus Muetzel <markus.muetzel@gmx.de>
parents: 23085
diff changeset
549 %! options = optimset ("Display", "none", "TolX", 1e-4, "TolFun", 1e-7);
9241a0fa7873 Additional output arguments for fminsearch (bug #44220).
Markus Muetzel <markus.muetzel@gmx.de>
parents: 23085
diff changeset
550 %! [x, fval, exitflag, output] = fminsearch (@sin, 3, options);
9241a0fa7873 Additional output arguments for fminsearch (bug #44220).
Markus Muetzel <markus.muetzel@gmx.de>
parents: 23085
diff changeset
551 %! assert (x, 3*pi/2, options.TolX);
9241a0fa7873 Additional output arguments for fminsearch (bug #44220).
Markus Muetzel <markus.muetzel@gmx.de>
parents: 23085
diff changeset
552 %! assert (fval, -1, options.TolFun);
9241a0fa7873 Additional output arguments for fminsearch (bug #44220).
Markus Muetzel <markus.muetzel@gmx.de>
parents: 23085
diff changeset
553 %! assert (exitflag, 1);
9241a0fa7873 Additional output arguments for fminsearch (bug #44220).
Markus Muetzel <markus.muetzel@gmx.de>
parents: 23085
diff changeset
554 %! assert (isstruct (output));
9241a0fa7873 Additional output arguments for fminsearch (bug #44220).
Markus Muetzel <markus.muetzel@gmx.de>
parents: 23085
diff changeset
555 %! assert (isfield (output, "iterations") && isnumeric (output.iterations)
9241a0fa7873 Additional output arguments for fminsearch (bug #44220).
Markus Muetzel <markus.muetzel@gmx.de>
parents: 23085
diff changeset
556 %! && isscalar (output.iterations) && output.iterations > 0);
9241a0fa7873 Additional output arguments for fminsearch (bug #44220).
Markus Muetzel <markus.muetzel@gmx.de>
parents: 23085
diff changeset
557 %! assert (isfield (output, "funcCount") && isnumeric (output.funcCount)
9241a0fa7873 Additional output arguments for fminsearch (bug #44220).
Markus Muetzel <markus.muetzel@gmx.de>
parents: 23085
diff changeset
558 %! && isscalar (output.funcCount) && output.funcCount > 0);
9241a0fa7873 Additional output arguments for fminsearch (bug #44220).
Markus Muetzel <markus.muetzel@gmx.de>
parents: 23085
diff changeset
559 %! assert (isfield (output, "algorithm") && ischar (output.algorithm));
9241a0fa7873 Additional output arguments for fminsearch (bug #44220).
Markus Muetzel <markus.muetzel@gmx.de>
parents: 23085
diff changeset
560 %! assert (isfield (output, "message") && ischar (output.message));
14895
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
561
22962
fba8a6c742c6 fminsearch.m: Fix error in "guarded_eval".
Markus Muetzel <markus.muetzel@gmx.de>
parents: 22323
diff changeset
562 ## Tests for guarded_eval
fba8a6c742c6 fminsearch.m: Fix error in "guarded_eval".
Markus Muetzel <markus.muetzel@gmx.de>
parents: 22323
diff changeset
563 %!error <non-real value encountered>
fba8a6c742c6 fminsearch.m: Fix error in "guarded_eval".
Markus Muetzel <markus.muetzel@gmx.de>
parents: 22323
diff changeset
564 %! fminsearch (@(x) ([0 2i]), 0, optimset ("FunValCheck", "on"));
fba8a6c742c6 fminsearch.m: Fix error in "guarded_eval".
Markus Muetzel <markus.muetzel@gmx.de>
parents: 22323
diff changeset
565 %!error <NaN value encountered>
fba8a6c742c6 fminsearch.m: Fix error in "guarded_eval".
Markus Muetzel <markus.muetzel@gmx.de>
parents: 22323
diff changeset
566 %! fminsearch (@(x) (NaN), 0, optimset ("FunValCheck", "on"));
fba8a6c742c6 fminsearch.m: Fix error in "guarded_eval".
Markus Muetzel <markus.muetzel@gmx.de>
parents: 22323
diff changeset
567 %!error <Inf value encountered>
fba8a6c742c6 fminsearch.m: Fix error in "guarded_eval".
Markus Muetzel <markus.muetzel@gmx.de>
parents: 22323
diff changeset
568 %! fminsearch (@(x) (Inf), 0, optimset ("FunValCheck", "on"));
23113
9241a0fa7873 Additional output arguments for fminsearch (bug #44220).
Markus Muetzel <markus.muetzel@gmx.de>
parents: 23085
diff changeset
569
9241a0fa7873 Additional output arguments for fminsearch (bug #44220).
Markus Muetzel <markus.muetzel@gmx.de>
parents: 23085
diff changeset
570 ## Test input validation
9241a0fa7873 Additional output arguments for fminsearch (bug #44220).
Markus Muetzel <markus.muetzel@gmx.de>
parents: 23085
diff changeset
571 %!error fminsearch ()
9241a0fa7873 Additional output arguments for fminsearch (bug #44220).
Markus Muetzel <markus.muetzel@gmx.de>
parents: 23085
diff changeset
572 %!error fminsearch (1)