annotate scripts/optimization/fminsearch.m @ 30893:e1788b1a315f

maint: Use "fcn" as preferred abbreviation for "function" in m-files. * accumarray.m, accumdim.m, quadl.m, quadv.m, randi.m, structfun.m, __is_function__.m, uigetfile.m, uimenu.m, uiputfile.m, doc_cache_create.m, colorspace_conversion_input_check.m, imageIO.m, argnames.m, vectorize.m, vectorize.m, normest1.m, inputname.m, nthargout.m, display_info_file.m, decic.m, ode15i.m, ode15s.m, ode23.m, ode23s.m, ode45.m, odeset.m, check_default_input.m, integrate_adaptive.m, ode_event_handler.m, runge_kutta_23.m, runge_kutta_23s.m, runge_kutta_45_dorpri.m, runge_kutta_interpolate.m, starting_stepsize.m, __all_opts__.m, fminbnd.m, fminsearch.m, fminunc.m, fsolve.m, fzero.m, sqp.m, fplot.m, plotyy.m, __bar__.m, __ezplot__.m, flat_entry.html, profexport.m, movfun.m, bicg.m, bicgstab.m, cgs.m, eigs.m, gmres.m, pcg.m, __alltohandles__.m, __sprand__.m, qmr.m, tfqmr.m, dump_demos.m: Replace "func", "fun", "fn" in documentation and variable names with "fcn".
author Rik <rik@octave.org>
date Mon, 04 Apr 2022 18:14:56 -0700
parents 796f54d4ddbf
children 597f3ee61a48
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
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 ##
30564
796f54d4ddbf update Octave Project Developers copyright for the new year
John W. Eaton <jwe@octave.org>
parents: 29359
diff changeset
3 ## Copyright (C) 2003-2022 The Octave Project Developers
27918
b442ec6dda5c use centralized file for copyright info for individual contributors
John W. Eaton <jwe@octave.org>
parents: 27584
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/>.
14895
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
7 ##
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
8 ## This file is part of Octave.
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
9 ##
24534
194eb4bd202b maint: Update punctuation for GPL v3 license text.
Rik <rik@octave.org>
parents: 23567
diff changeset
10 ## 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
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: 23567
diff changeset
12 ## 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
13 ## (at your option) any later version.
14895
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
14 ##
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
15 ## 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
16 ## WITHOUT ANY WARRANTY; without even the implied warranty of
22755
3a2b891d0b33 maint: Standardize Copyright formatting.
Rik <rik@octave.org>
parents: 22323
diff changeset
17 ## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
3a2b891d0b33 maint: Standardize Copyright formatting.
Rik <rik@octave.org>
parents: 22323
diff changeset
18 ## GNU General Public License for more details.
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 ## 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
21 ## 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
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 ########################################################################
14895
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
25
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
26 ## -*- texinfo -*-
30893
e1788b1a315f maint: Use "fcn" as preferred abbreviation for "function" in m-files.
Rik <rik@octave.org>
parents: 30564
diff changeset
27 ## @deftypefn {} {@var{x} =} fminsearch (@var{fcn}, @var{x0})
e1788b1a315f maint: Use "fcn" as preferred abbreviation for "function" in m-files.
Rik <rik@octave.org>
parents: 30564
diff changeset
28 ## @deftypefnx {} {@var{x} =} fminsearch (@var{fcn}, @var{x0}, @var{options})
25930
a00379f6f8c4 * fminsearch.m: Accept problem structure for Matlab compatibility.
John W. Eaton <jwe@octave.org>
parents: 25828
diff changeset
29 ## @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
30 ## @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
31 ##
25739
8eec0403a370 fminsearch.m: Update default TolFun to 1e-4 for Matlab compatibility.
Rik <rik@octave.org>
parents: 25231
diff changeset
32 ## Find a value of @var{x} which minimizes the multi-variable function
30893
e1788b1a315f maint: Use "fcn" as preferred abbreviation for "function" in m-files.
Rik <rik@octave.org>
parents: 30564
diff changeset
33 ## @var{fcn}.
20165
f1d0f506ee78 doc: Update more docstrings to have one sentence summary as first line.
Rik <rik@octave.org>
parents: 19596
diff changeset
34 ##
30893
e1788b1a315f maint: Use "fcn" as preferred abbreviation for "function" in m-files.
Rik <rik@octave.org>
parents: 30564
diff changeset
35 ## @var{fcn} is a function handle, inline function, or string containing the
27389
d4655f32dde7 fminsearch.m: Accept string for FCN argument (bug #56885)
Rik <rik@octave.org>
parents: 26753
diff changeset
36 ## name of the function to evaluate.
d4655f32dde7 fminsearch.m: Accept string for FCN argument (bug #56885)
Rik <rik@octave.org>
parents: 26753
diff changeset
37 ##
14895
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
38 ## 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
39 ## @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
40 ## 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
41 ## 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
42 ##
20165
f1d0f506ee78 doc: Update more docstrings to have one sentence summary as first line.
Rik <rik@octave.org>
parents: 19596
diff changeset
43 ## 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
44 ## 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
45 ## @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
46 ## @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
47 ##
8eec0403a370 fminsearch.m: Update default TolFun to 1e-4 for Matlab compatibility.
Rik <rik@octave.org>
parents: 25231
diff changeset
48 ## @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
49 ## 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
50 ## @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
51 ## 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
52 ##
8eec0403a370 fminsearch.m: Update default TolFun to 1e-4 for Matlab compatibility.
Rik <rik@octave.org>
parents: 25231
diff changeset
53 ## @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
54 ## 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
55 ## @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
56 ## 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
57 ##
28958
6fd6ad758b10 doc: Use @xref, @pxref rather than "see @code{}" in TexInfo.
Rik <rik@octave.org>
parents: 28912
diff changeset
58 ## For a description of the other options,
6fd6ad758b10 doc: Use @xref, @pxref rather than "see @code{}" in TexInfo.
Rik <rik@octave.org>
parents: 28912
diff changeset
59 ## @pxref{XREFoptimset,,@code{optimset}}. To initialize an options structure
6fd6ad758b10 doc: Use @xref, @pxref rather than "see @code{}" in TexInfo.
Rik <rik@octave.org>
parents: 28912
diff changeset
60 ## with default values for @code{fminsearch} use
25739
8eec0403a370 fminsearch.m: Update default TolFun to 1e-4 for Matlab compatibility.
Rik <rik@octave.org>
parents: 25231
diff changeset
61 ## @code{options = optimset ("fminsearch")}.
14895
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
62 ##
25930
a00379f6f8c4 * fminsearch.m: Accept problem structure for Matlab compatibility.
John W. Eaton <jwe@octave.org>
parents: 25828
diff changeset
63 ## @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
64 ## with the following fields:
a00379f6f8c4 * fminsearch.m: Accept problem structure for Matlab compatibility.
John W. Eaton <jwe@octave.org>
parents: 25828
diff changeset
65 ##
a00379f6f8c4 * fminsearch.m: Accept problem structure for Matlab compatibility.
John W. Eaton <jwe@octave.org>
parents: 25828
diff changeset
66 ## @table @code
a00379f6f8c4 * fminsearch.m: Accept problem structure for Matlab compatibility.
John W. Eaton <jwe@octave.org>
parents: 25828
diff changeset
67 ## @item objective
a00379f6f8c4 * fminsearch.m: Accept problem structure for Matlab compatibility.
John W. Eaton <jwe@octave.org>
parents: 25828
diff changeset
68 ## The objective function.
a00379f6f8c4 * fminsearch.m: Accept problem structure for Matlab compatibility.
John W. Eaton <jwe@octave.org>
parents: 25828
diff changeset
69 ##
a00379f6f8c4 * fminsearch.m: Accept problem structure for Matlab compatibility.
John W. Eaton <jwe@octave.org>
parents: 25828
diff changeset
70 ## @item x0
a00379f6f8c4 * fminsearch.m: Accept problem structure for Matlab compatibility.
John W. Eaton <jwe@octave.org>
parents: 25828
diff changeset
71 ## The initial point.
a00379f6f8c4 * fminsearch.m: Accept problem structure for Matlab compatibility.
John W. Eaton <jwe@octave.org>
parents: 25828
diff changeset
72 ##
a00379f6f8c4 * fminsearch.m: Accept problem structure for Matlab compatibility.
John W. Eaton <jwe@octave.org>
parents: 25828
diff changeset
73 ## @item solver
a00379f6f8c4 * fminsearch.m: Accept problem structure for Matlab compatibility.
John W. Eaton <jwe@octave.org>
parents: 25828
diff changeset
74 ## 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
75 ##
a00379f6f8c4 * fminsearch.m: Accept problem structure for Matlab compatibility.
John W. Eaton <jwe@octave.org>
parents: 25828
diff changeset
76 ## @item options
a00379f6f8c4 * fminsearch.m: Accept problem structure for Matlab compatibility.
John W. Eaton <jwe@octave.org>
parents: 25828
diff changeset
77 ## 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
78 ## 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
79 ## @end table
a00379f6f8c4 * fminsearch.m: Accept problem structure for Matlab compatibility.
John W. Eaton <jwe@octave.org>
parents: 25828
diff changeset
80 ##
a00379f6f8c4 * fminsearch.m: Accept problem structure for Matlab compatibility.
John W. Eaton <jwe@octave.org>
parents: 25828
diff changeset
81 ## @noindent
a00379f6f8c4 * fminsearch.m: Accept problem structure for Matlab compatibility.
John W. Eaton <jwe@octave.org>
parents: 25828
diff changeset
82 ## 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
83 ##
20165
f1d0f506ee78 doc: Update more docstrings to have one sentence summary as first line.
Rik <rik@octave.org>
parents: 19596
diff changeset
84 ## 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
85 ## the function value at the minimum.
14895
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
86 ##
25739
8eec0403a370 fminsearch.m: Update default TolFun to 1e-4 for Matlab compatibility.
Rik <rik@octave.org>
parents: 25231
diff changeset
87 ## 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
88 ## 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
89 ##
23114
19e958974410 fminsearch.m: fix texinfo header (bug #50178)
Philip Nienhuis <prnienhuis@users.sf.net>
parents: 23113
diff changeset
90 ## @table @asis
23113
9241a0fa7873 Additional output arguments for fminsearch (bug #44220).
Markus Muetzel <markus.muetzel@gmx.de>
parents: 23085
diff changeset
91 ## @item 1
9241a0fa7873 Additional output arguments for fminsearch (bug #44220).
Markus Muetzel <markus.muetzel@gmx.de>
parents: 23085
diff changeset
92 ## 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
93 ## (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
94 ## function value between iterations is smaller than @code{TolFun}).
14895
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
95 ##
23113
9241a0fa7873 Additional output arguments for fminsearch (bug #44220).
Markus Muetzel <markus.muetzel@gmx.de>
parents: 23085
diff changeset
96 ## @item 0
9241a0fa7873 Additional output arguments for fminsearch (bug #44220).
Markus Muetzel <markus.muetzel@gmx.de>
parents: 23085
diff changeset
97 ## 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
98 ## evaluations are exceeded.
9241a0fa7873 Additional output arguments for fminsearch (bug #44220).
Markus Muetzel <markus.muetzel@gmx.de>
parents: 23085
diff changeset
99 ##
9241a0fa7873 Additional output arguments for fminsearch (bug #44220).
Markus Muetzel <markus.muetzel@gmx.de>
parents: 23085
diff changeset
100 ## @item -1
9241a0fa7873 Additional output arguments for fminsearch (bug #44220).
Markus Muetzel <markus.muetzel@gmx.de>
parents: 23085
diff changeset
101 ## 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
102 ## @end table
9241a0fa7873 Additional output arguments for fminsearch (bug #44220).
Markus Muetzel <markus.muetzel@gmx.de>
parents: 23085
diff changeset
103 ##
25739
8eec0403a370 fminsearch.m: Update default TolFun to 1e-4 for Matlab compatibility.
Rik <rik@octave.org>
parents: 25231
diff changeset
104 ## 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
105 ## about the algorithm. Fields in the structure are @code{funcCount}
30893
e1788b1a315f maint: Use "fcn" as preferred abbreviation for "function" in m-files.
Rik <rik@octave.org>
parents: 30564
diff changeset
106 ## containing the number of function calls to @var{fcn}, @code{iterations}
25739
8eec0403a370 fminsearch.m: Update default TolFun to 1e-4 for Matlab compatibility.
Rik <rik@octave.org>
parents: 25231
diff changeset
107 ## 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
108 ## the search algorithm (always:
23567
71bfd507663c doc: Periodic spellcheck of documentation.
Rik <rik@octave.org>
parents: 23220
diff changeset
109 ## @nospell{@qcode{"Nelder-Mead simplex direct search"}}), and @code{message}
71bfd507663c doc: Periodic spellcheck of documentation.
Rik <rik@octave.org>
parents: 23220
diff changeset
110 ## with the exit message.
23113
9241a0fa7873 Additional output arguments for fminsearch (bug #44220).
Markus Muetzel <markus.muetzel@gmx.de>
parents: 23085
diff changeset
111 ##
9241a0fa7873 Additional output arguments for fminsearch (bug #44220).
Markus Muetzel <markus.muetzel@gmx.de>
parents: 23085
diff changeset
112 ## Example:
14895
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
113 ##
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
114 ## @example
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
115 ## 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
116 ## @end example
25739
8eec0403a370 fminsearch.m: Update default TolFun to 1e-4 for Matlab compatibility.
Rik <rik@octave.org>
parents: 25231
diff changeset
117 ##
8eec0403a370 fminsearch.m: Update default TolFun to 1e-4 for Matlab compatibility.
Rik <rik@octave.org>
parents: 25231
diff changeset
118 ## 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
119 ## probably better to use @code{fminbnd}.
14895
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
120 ## @seealso{fminbnd, fminunc, optimset}
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
121 ## @end deftypefn
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
122
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
123 ## 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
124 ## PKG_ADD: [~] = __all_opts__ ("fminsearch");
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
125
23113
9241a0fa7873 Additional output arguments for fminsearch (bug #44220).
Markus Muetzel <markus.muetzel@gmx.de>
parents: 23085
diff changeset
126 ## 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
127
25930
a00379f6f8c4 * fminsearch.m: Accept problem structure for Matlab compatibility.
John W. Eaton <jwe@octave.org>
parents: 25828
diff changeset
128 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
129
a00379f6f8c4 * fminsearch.m: Accept problem structure for Matlab compatibility.
John W. Eaton <jwe@octave.org>
parents: 25828
diff changeset
130 if (nargin < 1)
a00379f6f8c4 * fminsearch.m: Accept problem structure for Matlab compatibility.
John W. Eaton <jwe@octave.org>
parents: 25828
diff changeset
131 print_usage ();
a00379f6f8c4 * fminsearch.m: Accept problem structure for Matlab compatibility.
John W. Eaton <jwe@octave.org>
parents: 25828
diff changeset
132 endif
14895
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
133
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
134 ## 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
135 if (nargin == 1 && ischar (varargin{1}) && strcmp (varargin{1}, "defaults"))
26138
804e18e3e320 Reenable query of optimization options (bugs #54952 and #55089).
Kai T. Ohlhus <k.ohlhus@gmail.com>
parents: 25936
diff changeset
136 x = struct ("Display", "notify", "FunValCheck", "off",
804e18e3e320 Reenable query of optimization options (bugs #54952 and #55089).
Kai T. Ohlhus <k.ohlhus@gmail.com>
parents: 25936
diff changeset
137 "MaxFunEvals", [], "MaxIter", [],
804e18e3e320 Reenable query of optimization options (bugs #54952 and #55089).
Kai T. Ohlhus <k.ohlhus@gmail.com>
parents: 25936
diff changeset
138 "OutputFcn", [],
804e18e3e320 Reenable query of optimization options (bugs #54952 and #55089).
Kai T. Ohlhus <k.ohlhus@gmail.com>
parents: 25936
diff changeset
139 "TolFun", 1e-4, "TolX", 1e-4);
14895
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
140 return;
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
141 endif
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
142
25930
a00379f6f8c4 * fminsearch.m: Accept problem structure for Matlab compatibility.
John W. Eaton <jwe@octave.org>
parents: 25828
diff changeset
143 if (nargin == 1)
a00379f6f8c4 * fminsearch.m: Accept problem structure for Matlab compatibility.
John W. Eaton <jwe@octave.org>
parents: 25828
diff changeset
144 problem = varargin{1};
a00379f6f8c4 * fminsearch.m: Accept problem structure for Matlab compatibility.
John W. Eaton <jwe@octave.org>
parents: 25828
diff changeset
145 varargin = {};
a00379f6f8c4 * fminsearch.m: Accept problem structure for Matlab compatibility.
John W. Eaton <jwe@octave.org>
parents: 25828
diff changeset
146 if (! isstruct (problem))
a00379f6f8c4 * fminsearch.m: Accept problem structure for Matlab compatibility.
John W. Eaton <jwe@octave.org>
parents: 25828
diff changeset
147 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
148 endif
30893
e1788b1a315f maint: Use "fcn" as preferred abbreviation for "function" in m-files.
Rik <rik@octave.org>
parents: 30564
diff changeset
149 fcn = problem.objective;
25930
a00379f6f8c4 * fminsearch.m: Accept problem structure for Matlab compatibility.
John W. Eaton <jwe@octave.org>
parents: 25828
diff changeset
150 x0 = problem.x0;
a00379f6f8c4 * fminsearch.m: Accept problem structure for Matlab compatibility.
John W. Eaton <jwe@octave.org>
parents: 25828
diff changeset
151 if (! strcmp (problem.solver, "fminsearch"))
a00379f6f8c4 * fminsearch.m: Accept problem structure for Matlab compatibility.
John W. Eaton <jwe@octave.org>
parents: 25828
diff changeset
152 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
153 endif
a00379f6f8c4 * fminsearch.m: Accept problem structure for Matlab compatibility.
John W. Eaton <jwe@octave.org>
parents: 25828
diff changeset
154 if (isfield (problem, "options"))
a00379f6f8c4 * fminsearch.m: Accept problem structure for Matlab compatibility.
John W. Eaton <jwe@octave.org>
parents: 25828
diff changeset
155 options = problem.options;
a00379f6f8c4 * fminsearch.m: Accept problem structure for Matlab compatibility.
John W. Eaton <jwe@octave.org>
parents: 25828
diff changeset
156 else
a00379f6f8c4 * fminsearch.m: Accept problem structure for Matlab compatibility.
John W. Eaton <jwe@octave.org>
parents: 25828
diff changeset
157 options = [];
a00379f6f8c4 * fminsearch.m: Accept problem structure for Matlab compatibility.
John W. Eaton <jwe@octave.org>
parents: 25828
diff changeset
158 endif
a00379f6f8c4 * fminsearch.m: Accept problem structure for Matlab compatibility.
John W. Eaton <jwe@octave.org>
parents: 25828
diff changeset
159 elseif (nargin > 1)
30893
e1788b1a315f maint: Use "fcn" as preferred abbreviation for "function" in m-files.
Rik <rik@octave.org>
parents: 30564
diff changeset
160 fcn = varargin{1};
25930
a00379f6f8c4 * fminsearch.m: Accept problem structure for Matlab compatibility.
John W. Eaton <jwe@octave.org>
parents: 25828
diff changeset
161 x0 = varargin{2};
a00379f6f8c4 * fminsearch.m: Accept problem structure for Matlab compatibility.
John W. Eaton <jwe@octave.org>
parents: 25828
diff changeset
162 if (nargin > 2)
a00379f6f8c4 * fminsearch.m: Accept problem structure for Matlab compatibility.
John W. Eaton <jwe@octave.org>
parents: 25828
diff changeset
163 options = varargin{3};
a00379f6f8c4 * fminsearch.m: Accept problem structure for Matlab compatibility.
John W. Eaton <jwe@octave.org>
parents: 25828
diff changeset
164 varargin(1:3) = [];
a00379f6f8c4 * fminsearch.m: Accept problem structure for Matlab compatibility.
John W. Eaton <jwe@octave.org>
parents: 25828
diff changeset
165 else
a00379f6f8c4 * fminsearch.m: Accept problem structure for Matlab compatibility.
John W. Eaton <jwe@octave.org>
parents: 25828
diff changeset
166 options = [];
a00379f6f8c4 * fminsearch.m: Accept problem structure for Matlab compatibility.
John W. Eaton <jwe@octave.org>
parents: 25828
diff changeset
167 varargin = {};
a00379f6f8c4 * fminsearch.m: Accept problem structure for Matlab compatibility.
John W. Eaton <jwe@octave.org>
parents: 25828
diff changeset
168 endif
14895
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
169 endif
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
170
30893
e1788b1a315f maint: Use "fcn" as preferred abbreviation for "function" in m-files.
Rik <rik@octave.org>
parents: 30564
diff changeset
171 if (ischar (fcn))
e1788b1a315f maint: Use "fcn" as preferred abbreviation for "function" in m-files.
Rik <rik@octave.org>
parents: 30564
diff changeset
172 fcn = str2func (fcn);
27389
d4655f32dde7 fminsearch.m: Accept string for FCN argument (bug #56885)
Rik <rik@octave.org>
parents: 26753
diff changeset
173 endif
d4655f32dde7 fminsearch.m: Accept string for FCN argument (bug #56885)
Rik <rik@octave.org>
parents: 26753
diff changeset
174
25930
a00379f6f8c4 * fminsearch.m: Accept problem structure for Matlab compatibility.
John W. Eaton <jwe@octave.org>
parents: 25828
diff changeset
175 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
176 options = struct ();
3c896180df16 Pass additional arguments for fminsearch to called function (bug #41888).
Markus Muetzel <markus.muetzel@gmx.de>
parents: 22963
diff changeset
177 endif
14895
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
178
30893
e1788b1a315f maint: Use "fcn" as preferred abbreviation for "function" in m-files.
Rik <rik@octave.org>
parents: 30564
diff changeset
179 [x, exitflag, output] = nmsmax (fcn, x0, options, varargin{:});
14895
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
180
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
181 if (isargout (2))
30893
e1788b1a315f maint: Use "fcn" as preferred abbreviation for "function" in m-files.
Rik <rik@octave.org>
parents: 30564
diff changeset
182 fval = feval (fcn, x);
14895
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
183 endif
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
184
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
185 endfunction
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
186
23113
9241a0fa7873 Additional output arguments for fminsearch (bug #44220).
Markus Muetzel <markus.muetzel@gmx.de>
parents: 23085
diff changeset
187 ## NMSMAX Nelder-Mead simplex method for direct search optimization.
30893
e1788b1a315f maint: Use "fcn" as preferred abbreviation for "function" in m-files.
Rik <rik@octave.org>
parents: 30564
diff changeset
188 ## [x, fmax, nf] = NMSMAX(FCN, x0, STOPIT, SAVIT) attempts to
e1788b1a315f maint: Use "fcn" as preferred abbreviation for "function" in m-files.
Rik <rik@octave.org>
parents: 30564
diff changeset
189 ## maximize the function FCN, using the starting vector x0.
14895
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
190 ## The Nelder-Mead direct search method is used.
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
191 ## Output arguments:
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
192 ## x = vector yielding largest function value found,
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
193 ## fmax = function value at x,
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
194 ## nf = number of function evaluations.
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
195 ## The iteration is terminated when either
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
196 ## - the relative size of the simplex is <= STOPIT(1)
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
197 ## (default 1e-3),
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
198 ## - STOPIT(2) function evaluations have been performed
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
199 ## (default inf, i.e., no limit), or
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
200 ## - a function value equals or exceeds STOPIT(3)
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
201 ## (default inf, i.e., no test on function values).
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
202 ## 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
203 ## 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
204 ## STOPIT(4) = 1: right-angled simplex.
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
205 ## 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
206 ## STOPIT(6) indicates the direction (i.e., minimization or
14895
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
207 ## maximization.) Default is 1, maximization.
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
208 ## set STOPIT(6)=-1 for minimization
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
209 ## 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
210 ## '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
211 ## 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
212 ## and in function calls, x has the same shape as x0.
30893
e1788b1a315f maint: Use "fcn" as preferred abbreviation for "function" in m-files.
Rik <rik@octave.org>
parents: 30564
diff changeset
213 ## NMSMAX(FCN, x0, STOPIT, SAVIT, P1, P2,...) allows additional
e1788b1a315f maint: Use "fcn" as preferred abbreviation for "function" in m-files.
Rik <rik@octave.org>
parents: 30564
diff changeset
214 ## arguments to be passed to FCN, via feval(FCN,x,P1,P2,...).
14895
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
215 ## References:
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
216 ## N. J. Higham, Optimization by direct search in matrix computations,
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
217 ## SIAM J. Matrix Anal. Appl, 14(2): 317-333, 1993.
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
218 ## C. T. Kelley, Iterative Methods for Optimization, Society for Industrial
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
219 ## and Applied Mathematics, Philadelphia, PA, 1999.
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 ## From Matrix Toolbox
17744
d63878346099 maint: Update copyright notices for release.
John W. Eaton <jwe@octave.org>
parents: 17281
diff changeset
222 ## Copyright (C) 2002, 2013 N.J.Higham
14895
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
223 ## www.maths.man.ac.uk/~higham/mctoolbox
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
224 ##
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
225 ## Modifications for Octave by A.Adler 2003
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
226
23113
9241a0fa7873 Additional output arguments for fminsearch (bug #44220).
Markus Muetzel <markus.muetzel@gmx.de>
parents: 23085
diff changeset
227 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
228 parse_options (options, x)
14895
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
229
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
230 ## Tolerance for cgce test based on relative size of simplex.
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
231 stopit(1) = tol = optimget (options, "TolX", 1e-4);
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 ## 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
234 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
235
9241a0fa7873 Additional output arguments for fminsearch (bug #44220).
Markus Muetzel <markus.muetzel@gmx.de>
parents: 23085
diff changeset
236 ## 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
237 stopit(2) = optimget (options, "MaxFunEvals", 200 * length (x));
14895
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
238
23113
9241a0fa7873 Additional output arguments for fminsearch (bug #44220).
Markus Muetzel <markus.muetzel@gmx.de>
parents: 23085
diff changeset
239 ## 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
240 maxiter = optimget (options, "MaxIter", 200 * length (x));
14895
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
241
23113
9241a0fa7873 Additional output arguments for fminsearch (bug #44220).
Markus Muetzel <markus.muetzel@gmx.de>
parents: 23085
diff changeset
242 ## Default target for function values.
14895
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
243 stopit(3) = Inf; # FIXME: expose this parameter to the outside
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
244
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
245 ## Default initial simplex.
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
246 stopit(4) = 0; # FIXME: expose this parameter to the outside
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
247
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
248 ## Default: show progress.
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
249 display = optimget (options, "Display", "notify");
23113
9241a0fa7873 Additional output arguments for fminsearch (bug #44220).
Markus Muetzel <markus.muetzel@gmx.de>
parents: 23085
diff changeset
250 switch (display)
9241a0fa7873 Additional output arguments for fminsearch (bug #44220).
Markus Muetzel <markus.muetzel@gmx.de>
parents: 23085
diff changeset
251 case "iter"
9241a0fa7873 Additional output arguments for fminsearch (bug #44220).
Markus Muetzel <markus.muetzel@gmx.de>
parents: 23085
diff changeset
252 stopit(5) = 1;
9241a0fa7873 Additional output arguments for fminsearch (bug #44220).
Markus Muetzel <markus.muetzel@gmx.de>
parents: 23085
diff changeset
253 case "final"
9241a0fa7873 Additional output arguments for fminsearch (bug #44220).
Markus Muetzel <markus.muetzel@gmx.de>
parents: 23085
diff changeset
254 stopit(5) = 2;
9241a0fa7873 Additional output arguments for fminsearch (bug #44220).
Markus Muetzel <markus.muetzel@gmx.de>
parents: 23085
diff changeset
255 case "notify"
9241a0fa7873 Additional output arguments for fminsearch (bug #44220).
Markus Muetzel <markus.muetzel@gmx.de>
parents: 23085
diff changeset
256 stopit(5) = 3;
9241a0fa7873 Additional output arguments for fminsearch (bug #44220).
Markus Muetzel <markus.muetzel@gmx.de>
parents: 23085
diff changeset
257 otherwise # "none"
9241a0fa7873 Additional output arguments for fminsearch (bug #44220).
Markus Muetzel <markus.muetzel@gmx.de>
parents: 23085
diff changeset
258 stopit(5) = 0;
9241a0fa7873 Additional output arguments for fminsearch (bug #44220).
Markus Muetzel <markus.muetzel@gmx.de>
parents: 23085
diff changeset
259 endswitch
14895
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
260 trace = stopit(5);
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
261
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
262 ## Use function to minimize, not maximize
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
263 stopit(6) = dirn = -1;
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
264
20713
2469d78a1d8b Consistently use 'filename' rather than 'file name' throughout code base.
Rik <rik@octave.org>
parents: 20231
diff changeset
265 ## Filename for snapshots.
14895
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
266 savit = []; # FIXME: expose this parameter to the outside
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
267
23113
9241a0fa7873 Additional output arguments for fminsearch (bug #44220).
Markus Muetzel <markus.muetzel@gmx.de>
parents: 23085
diff changeset
268 ## OutputFcn
9241a0fa7873 Additional output arguments for fminsearch (bug #44220).
Markus Muetzel <markus.muetzel@gmx.de>
parents: 23085
diff changeset
269 outfcn = optimget (options, "OutputFcn");
9241a0fa7873 Additional output arguments for fminsearch (bug #44220).
Markus Muetzel <markus.muetzel@gmx.de>
parents: 23085
diff changeset
270
14895
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
271 endfunction
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
272
30893
e1788b1a315f maint: Use "fcn" as preferred abbreviation for "function" in m-files.
Rik <rik@octave.org>
parents: 30564
diff changeset
273 function [x, exitflag, output] = nmsmax (fcn, x, options, varargin)
14895
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
274
23113
9241a0fa7873 Additional output arguments for fminsearch (bug #44220).
Markus Muetzel <markus.muetzel@gmx.de>
parents: 23085
diff changeset
275 [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
276 parse_options (options, x);
14895
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
277
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
278 if (strcmpi (optimget (options, "FunValCheck", "off"), "on"))
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
279 ## Replace fcn with a guarded version.
30893
e1788b1a315f maint: Use "fcn" as preferred abbreviation for "function" in m-files.
Rik <rik@octave.org>
parents: 30564
diff changeset
280 fcn = @(x) guarded_eval (fcn, x, varargin{:});
27584
2ab2e289cf84 fminsearch.m: Use only real part of objective function for Matlab compatibility (bug #57136).
Rik <rik@octave.org>
parents: 27389
diff changeset
281 else
30893
e1788b1a315f maint: Use "fcn" as preferred abbreviation for "function" in m-files.
Rik <rik@octave.org>
parents: 30564
diff changeset
282 fcn = @(x) real (fcn (x, varargin{:}));
14895
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
283 endif
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
284
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
285 x0 = x(:); # Work with column vector internally.
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
286 n = length (x0);
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 V = [zeros(n,1) eye(n)];
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
289 f = zeros (n+1,1);
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
290 V(:,1) = x0;
30893
e1788b1a315f maint: Use "fcn" as preferred abbreviation for "function" in m-files.
Rik <rik@octave.org>
parents: 30564
diff changeset
291 f(1) = dirn * fcn (x);
14895
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
292 fmax_old = f(1);
23113
9241a0fa7873 Additional output arguments for fminsearch (bug #44220).
Markus Muetzel <markus.muetzel@gmx.de>
parents: 23085
diff changeset
293 nf = 1;
14895
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
294
23113
9241a0fa7873 Additional output arguments for fminsearch (bug #44220).
Markus Muetzel <markus.muetzel@gmx.de>
parents: 23085
diff changeset
295 if (trace == 1)
26280
da54f14258e1 fminsearch.m: Fix sign of results for intermediate reporting (bug #55261).
Rik <rik@octave.org>
parents: 26138
diff changeset
296 printf ("f(x0) = %9.4e\n", dirn * f(1));
14895
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
297 endif
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
298
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
299 k = 0; m = 0;
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
300
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
301 ## Set up initial simplex.
23113
9241a0fa7873 Additional output arguments for fminsearch (bug #44220).
Markus Muetzel <markus.muetzel@gmx.de>
parents: 23085
diff changeset
302 scale = max (norm (x0, Inf), 1);
14895
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
303 if (stopit(4) == 0)
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
304 ## Regular simplex - all edges have same length.
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
305 ## 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
306 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
307 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
308 for j = 2:n+1
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
309 V(j-1,j) = x0(j-1) + alpha(1);
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
310 x(:) = V(:,j);
30893
e1788b1a315f maint: Use "fcn" as preferred abbreviation for "function" in m-files.
Rik <rik@octave.org>
parents: 30564
diff changeset
311 f(j) = dirn * fcn (x);
14895
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
312 endfor
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
313 else
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
314 ## Right-angled simplex based on co-ordinate axes.
28912
0de38a6ef693 maint: Use Octave convention of space after function name in scripts dir.
Rik <rik@octave.org>
parents: 28896
diff changeset
315 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
316 for j = 2:n+1
14895
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
317 V(:,j) = x0 + alpha(j)*V(:,j);
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
318 x(:) = V(:,j);
30893
e1788b1a315f maint: Use "fcn" as preferred abbreviation for "function" in m-files.
Rik <rik@octave.org>
parents: 30564
diff changeset
319 f(j) = dirn * fcn (x);
14895
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
320 endfor
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
321 endif
23113
9241a0fa7873 Additional output arguments for fminsearch (bug #44220).
Markus Muetzel <markus.muetzel@gmx.de>
parents: 23085
diff changeset
322 nf += n;
14895
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
323 how = "initial ";
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
324
23113
9241a0fa7873 Additional output arguments for fminsearch (bug #44220).
Markus Muetzel <markus.muetzel@gmx.de>
parents: 23085
diff changeset
325 [~, j] = sort (f);
14895
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
326 j = j(n+1:-1:1);
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
327 f = f(j);
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
328 V = V(:,j);
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
329
23113
9241a0fa7873 Additional output arguments for fminsearch (bug #44220).
Markus Muetzel <markus.muetzel@gmx.de>
parents: 23085
diff changeset
330 exitflag = 0;
9241a0fa7873 Additional output arguments for fminsearch (bug #44220).
Markus Muetzel <markus.muetzel@gmx.de>
parents: 23085
diff changeset
331
9241a0fa7873 Additional output arguments for fminsearch (bug #44220).
Markus Muetzel <markus.muetzel@gmx.de>
parents: 23085
diff changeset
332 if (! isempty (outfcn))
9241a0fa7873 Additional output arguments for fminsearch (bug #44220).
Markus Muetzel <markus.muetzel@gmx.de>
parents: 23085
diff changeset
333 optimvalues.iteration = 0;
9241a0fa7873 Additional output arguments for fminsearch (bug #44220).
Markus Muetzel <markus.muetzel@gmx.de>
parents: 23085
diff changeset
334 optimvalues.funccount = nf;
26280
da54f14258e1 fminsearch.m: Fix sign of results for intermediate reporting (bug #55261).
Rik <rik@octave.org>
parents: 26138
diff changeset
335 optimvalues.fval = dirn * f(1);
23113
9241a0fa7873 Additional output arguments for fminsearch (bug #44220).
Markus Muetzel <markus.muetzel@gmx.de>
parents: 23085
diff changeset
336 optimvalues.procedure = how;
9241a0fa7873 Additional output arguments for fminsearch (bug #44220).
Markus Muetzel <markus.muetzel@gmx.de>
parents: 23085
diff changeset
337 state = "init";
9241a0fa7873 Additional output arguments for fminsearch (bug #44220).
Markus Muetzel <markus.muetzel@gmx.de>
parents: 23085
diff changeset
338 stop = outfcn (x, optimvalues, state);
9241a0fa7873 Additional output arguments for fminsearch (bug #44220).
Markus Muetzel <markus.muetzel@gmx.de>
parents: 23085
diff changeset
339 if (stop)
9241a0fa7873 Additional output arguments for fminsearch (bug #44220).
Markus Muetzel <markus.muetzel@gmx.de>
parents: 23085
diff changeset
340 msg = "Stopped by OutputFcn\n";
9241a0fa7873 Additional output arguments for fminsearch (bug #44220).
Markus Muetzel <markus.muetzel@gmx.de>
parents: 23085
diff changeset
341 exitflag = -1;
9241a0fa7873 Additional output arguments for fminsearch (bug #44220).
Markus Muetzel <markus.muetzel@gmx.de>
parents: 23085
diff changeset
342 endif
9241a0fa7873 Additional output arguments for fminsearch (bug #44220).
Markus Muetzel <markus.muetzel@gmx.de>
parents: 23085
diff changeset
343 endif
9241a0fa7873 Additional output arguments for fminsearch (bug #44220).
Markus Muetzel <markus.muetzel@gmx.de>
parents: 23085
diff changeset
344
14895
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
345 alpha = 1; beta = 1/2; gamma = 2;
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
346
23113
9241a0fa7873 Additional output arguments for fminsearch (bug #44220).
Markus Muetzel <markus.muetzel@gmx.de>
parents: 23085
diff changeset
347 while (exitflag != -1) # Outer (and only) loop.
20735
418ae0cb752f Replace ++,-- with in-place operators for performance.
Rik <rik@octave.org>
parents: 20713
diff changeset
348 k += 1;
14895
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
349
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
350 if (k > maxiter)
25739
8eec0403a370 fminsearch.m: Update default TolFun to 1e-4 for Matlab compatibility.
Rik <rik@octave.org>
parents: 25231
diff changeset
351 msg = "Exceeded maximum iterations\n";
14895
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
352 break;
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
353 endif
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
354
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
355 fmax = f(1);
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
356 if (fmax > fmax_old)
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
357 if (! isempty (savit))
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
358 x(:) = V(:,1);
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
359 eval (["save " savit " x fmax nf"]);
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
360 endif
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
361 endif
23113
9241a0fa7873 Additional output arguments for fminsearch (bug #44220).
Markus Muetzel <markus.muetzel@gmx.de>
parents: 23085
diff changeset
362 if (trace == 1)
9241a0fa7873 Additional output arguments for fminsearch (bug #44220).
Markus Muetzel <markus.muetzel@gmx.de>
parents: 23085
diff changeset
363 printf ("Iter. %2.0f,", k);
9241a0fa7873 Additional output arguments for fminsearch (bug #44220).
Markus Muetzel <markus.muetzel@gmx.de>
parents: 23085
diff changeset
364 printf (" how = %-11s", [how ","]);
26280
da54f14258e1 fminsearch.m: Fix sign of results for intermediate reporting (bug #55261).
Rik <rik@octave.org>
parents: 26138
diff changeset
365 printf ("nf = %3.0f, f = %9.4e (%2.1f%%)\n", nf, dirn * fmax, ...
28912
0de38a6ef693 maint: Use Octave convention of space after function name in scripts dir.
Rik <rik@octave.org>
parents: 28896
diff changeset
366 100*(fmax-fmax_old)/(abs (fmax_old)+eps));
14895
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 fmax_old = fmax;
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
369
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
370 ## Three stopping tests from MDSMAX.M
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
371
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
372 ## Stopping Test 1 - f reached target value?
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
373 if (fmax >= stopit(3))
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
374 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
375 ## 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
376 exitflag = -1;
14895
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
377 break;
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
378 endif
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
379
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
380 ## Stopping Test 2 - too many f-evals?
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
381 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
382 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
383 exitflag = 0;
14895
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
384 break;
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
385 endif
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
386
23113
9241a0fa7873 Additional output arguments for fminsearch (bug #44220).
Markus Muetzel <markus.muetzel@gmx.de>
parents: 23085
diff changeset
387 ## 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
388 v1 = V(:,1);
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
389 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
390 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
391 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
392 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
393 "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
394 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
395 exitflag = 1;
14895
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
396 break;
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
397 endif
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
398
23113
9241a0fa7873 Additional output arguments for fminsearch (bug #44220).
Markus Muetzel <markus.muetzel@gmx.de>
parents: 23085
diff changeset
399 ## Call OutputFcn
9241a0fa7873 Additional output arguments for fminsearch (bug #44220).
Markus Muetzel <markus.muetzel@gmx.de>
parents: 23085
diff changeset
400 if (! isempty (outfcn))
9241a0fa7873 Additional output arguments for fminsearch (bug #44220).
Markus Muetzel <markus.muetzel@gmx.de>
parents: 23085
diff changeset
401 optimvalues.funccount = nf;
26280
da54f14258e1 fminsearch.m: Fix sign of results for intermediate reporting (bug #55261).
Rik <rik@octave.org>
parents: 26138
diff changeset
402 optimvalues.fval = dirn * f(1);
23113
9241a0fa7873 Additional output arguments for fminsearch (bug #44220).
Markus Muetzel <markus.muetzel@gmx.de>
parents: 23085
diff changeset
403 optimvalues.iteration = k;
9241a0fa7873 Additional output arguments for fminsearch (bug #44220).
Markus Muetzel <markus.muetzel@gmx.de>
parents: 23085
diff changeset
404 optimvalues.procedure = how;
9241a0fa7873 Additional output arguments for fminsearch (bug #44220).
Markus Muetzel <markus.muetzel@gmx.de>
parents: 23085
diff changeset
405 state = "iter";
9241a0fa7873 Additional output arguments for fminsearch (bug #44220).
Markus Muetzel <markus.muetzel@gmx.de>
parents: 23085
diff changeset
406 stop = outfcn (x, optimvalues, state);
9241a0fa7873 Additional output arguments for fminsearch (bug #44220).
Markus Muetzel <markus.muetzel@gmx.de>
parents: 23085
diff changeset
407 if (stop)
9241a0fa7873 Additional output arguments for fminsearch (bug #44220).
Markus Muetzel <markus.muetzel@gmx.de>
parents: 23085
diff changeset
408 msg = "Stopped by OutputFcn\n";
9241a0fa7873 Additional output arguments for fminsearch (bug #44220).
Markus Muetzel <markus.muetzel@gmx.de>
parents: 23085
diff changeset
409 exitflag = -1;
9241a0fa7873 Additional output arguments for fminsearch (bug #44220).
Markus Muetzel <markus.muetzel@gmx.de>
parents: 23085
diff changeset
410 break;
9241a0fa7873 Additional output arguments for fminsearch (bug #44220).
Markus Muetzel <markus.muetzel@gmx.de>
parents: 23085
diff changeset
411 endif
9241a0fa7873 Additional output arguments for fminsearch (bug #44220).
Markus Muetzel <markus.muetzel@gmx.de>
parents: 23085
diff changeset
412 endif
9241a0fa7873 Additional output arguments for fminsearch (bug #44220).
Markus Muetzel <markus.muetzel@gmx.de>
parents: 23085
diff changeset
413
14895
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
414 ## One step of the Nelder-Mead simplex algorithm
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
415 ## 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
416 ## 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
417 ## and re-ordered function values after sort.
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
418
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
419 vbar = (sum (V(:,1:n)')/n)'; # Mean value
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
420 vr = (1 + alpha)*vbar - alpha*V(:,n+1);
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
421 x(:) = vr;
30893
e1788b1a315f maint: Use "fcn" as preferred abbreviation for "function" in m-files.
Rik <rik@octave.org>
parents: 30564
diff changeset
422 fr = dirn * fcn (x);
20231
83792dd9bcc1 Use in-place operators in m-files where possible.
Rik <rik@octave.org>
parents: 20165
diff changeset
423 nf += 1;
23113
9241a0fa7873 Additional output arguments for fminsearch (bug #44220).
Markus Muetzel <markus.muetzel@gmx.de>
parents: 23085
diff changeset
424 vk = vr; fk = fr; how = "reflect";
14895
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
425 if (fr > f(n))
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
426 if (fr > f(1))
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
427 ve = gamma*vr + (1-gamma)*vbar;
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
428 x(:) = ve;
30893
e1788b1a315f maint: Use "fcn" as preferred abbreviation for "function" in m-files.
Rik <rik@octave.org>
parents: 30564
diff changeset
429 fe = dirn * fcn (x);
20231
83792dd9bcc1 Use in-place operators in m-files where possible.
Rik <rik@octave.org>
parents: 20165
diff changeset
430 nf += 1;
14895
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
431 if (fe > f(1))
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
432 vk = ve;
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
433 fk = fe;
23113
9241a0fa7873 Additional output arguments for fminsearch (bug #44220).
Markus Muetzel <markus.muetzel@gmx.de>
parents: 23085
diff changeset
434 how = "expand";
14895
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
435 endif
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
436 endif
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
437 else
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
438 vt = V(:,n+1);
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
439 ft = f(n+1);
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
440 if (fr > ft)
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
441 vt = vr;
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
442 ft = fr;
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
443 endif
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
444 vc = beta*vt + (1-beta)*vbar;
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
445 x(:) = vc;
30893
e1788b1a315f maint: Use "fcn" as preferred abbreviation for "function" in m-files.
Rik <rik@octave.org>
parents: 30564
diff changeset
446 fc = dirn * fcn (x);
20231
83792dd9bcc1 Use in-place operators in m-files where possible.
Rik <rik@octave.org>
parents: 20165
diff changeset
447 nf += 1;
14895
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
448 if (fc > f(n))
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
449 vk = vc; fk = fc;
23113
9241a0fa7873 Additional output arguments for fminsearch (bug #44220).
Markus Muetzel <markus.muetzel@gmx.de>
parents: 23085
diff changeset
450 how = "contract";
14895
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
451 else
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
452 for j = 2:n
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
453 V(:,j) = (V(:,1) + V(:,j))/2;
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
454 x(:) = V(:,j);
30893
e1788b1a315f maint: Use "fcn" as preferred abbreviation for "function" in m-files.
Rik <rik@octave.org>
parents: 30564
diff changeset
455 f(j) = dirn * fcn (x);
14895
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
456 endfor
20231
83792dd9bcc1 Use in-place operators in m-files where possible.
Rik <rik@octave.org>
parents: 20165
diff changeset
457 nf += n-1;
14895
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
458 vk = (V(:,1) + V(:,n+1))/2;
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
459 x(:) = vk;
30893
e1788b1a315f maint: Use "fcn" as preferred abbreviation for "function" in m-files.
Rik <rik@octave.org>
parents: 30564
diff changeset
460 fk = dirn * fcn (x);
20231
83792dd9bcc1 Use in-place operators in m-files where possible.
Rik <rik@octave.org>
parents: 20165
diff changeset
461 nf += 1;
23113
9241a0fa7873 Additional output arguments for fminsearch (bug #44220).
Markus Muetzel <markus.muetzel@gmx.de>
parents: 23085
diff changeset
462 how = "shrink";
14895
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
463 endif
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
464 endif
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
465 V(:,n+1) = vk;
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
466 f(n+1) = fk;
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
467 [~,j] = sort(f);
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
468 j = j(n+1:-1:1);
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
469 f = f(j);
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
470 V = V(:,j);
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
471
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
472 endwhile # End of outer (and only) loop.
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
473
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
474 ## Finished.
23113
9241a0fa7873 Additional output arguments for fminsearch (bug #44220).
Markus Muetzel <markus.muetzel@gmx.de>
parents: 23085
diff changeset
475 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
476 printf (msg);
14895
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
477 endif
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
478 x(:) = V(:,1);
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
479
23113
9241a0fa7873 Additional output arguments for fminsearch (bug #44220).
Markus Muetzel <markus.muetzel@gmx.de>
parents: 23085
diff changeset
480 ## 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
481 ## 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
482 if (! isempty (outfcn))
9241a0fa7873 Additional output arguments for fminsearch (bug #44220).
Markus Muetzel <markus.muetzel@gmx.de>
parents: 23085
diff changeset
483 optimvalues.funccount = nf;
26280
da54f14258e1 fminsearch.m: Fix sign of results for intermediate reporting (bug #55261).
Rik <rik@octave.org>
parents: 26138
diff changeset
484 optimvalues.fval = dirn * f(1);
23113
9241a0fa7873 Additional output arguments for fminsearch (bug #44220).
Markus Muetzel <markus.muetzel@gmx.de>
parents: 23085
diff changeset
485 optimvalues.iteration = k;
9241a0fa7873 Additional output arguments for fminsearch (bug #44220).
Markus Muetzel <markus.muetzel@gmx.de>
parents: 23085
diff changeset
486 optimvalues.procedure = how;
9241a0fa7873 Additional output arguments for fminsearch (bug #44220).
Markus Muetzel <markus.muetzel@gmx.de>
parents: 23085
diff changeset
487 state = "done";
9241a0fa7873 Additional output arguments for fminsearch (bug #44220).
Markus Muetzel <markus.muetzel@gmx.de>
parents: 23085
diff changeset
488 outfcn (x, optimvalues, state);
9241a0fa7873 Additional output arguments for fminsearch (bug #44220).
Markus Muetzel <markus.muetzel@gmx.de>
parents: 23085
diff changeset
489 endif
9241a0fa7873 Additional output arguments for fminsearch (bug #44220).
Markus Muetzel <markus.muetzel@gmx.de>
parents: 23085
diff changeset
490
9241a0fa7873 Additional output arguments for fminsearch (bug #44220).
Markus Muetzel <markus.muetzel@gmx.de>
parents: 23085
diff changeset
491 ## output
9241a0fa7873 Additional output arguments for fminsearch (bug #44220).
Markus Muetzel <markus.muetzel@gmx.de>
parents: 23085
diff changeset
492 output.iterations = k;
9241a0fa7873 Additional output arguments for fminsearch (bug #44220).
Markus Muetzel <markus.muetzel@gmx.de>
parents: 23085
diff changeset
493 output.funcCount = nf;
9241a0fa7873 Additional output arguments for fminsearch (bug #44220).
Markus Muetzel <markus.muetzel@gmx.de>
parents: 23085
diff changeset
494 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
495 output.message = msg;
9241a0fa7873 Additional output arguments for fminsearch (bug #44220).
Markus Muetzel <markus.muetzel@gmx.de>
parents: 23085
diff changeset
496
14895
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
497 endfunction
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
498
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
499 ## A helper function that evaluates a function and checks for bad results.
30893
e1788b1a315f maint: Use "fcn" as preferred abbreviation for "function" in m-files.
Rik <rik@octave.org>
parents: 30564
diff changeset
500 function y = guarded_eval (fcn, x, varargin)
14895
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
501
30893
e1788b1a315f maint: Use "fcn" as preferred abbreviation for "function" in m-files.
Rik <rik@octave.org>
parents: 30564
diff changeset
502 y = fcn (x, varargin{:});
14895
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
503
22962
fba8a6c742c6 fminsearch.m: Fix error in "guarded_eval".
Markus Muetzel <markus.muetzel@gmx.de>
parents: 22323
diff changeset
504 if (! (isreal (y)))
14895
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
505 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
506 elseif (any (isnan (y(:))))
14895
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
507 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
508 elseif (any (isinf (y(:))))
14895
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
509 error ("fminsearch:isinf", "fminsearch: Inf value encountered");
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
510 endif
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
511
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
512 endfunction
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
513
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
514
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
515 %!demo
23113
9241a0fa7873 Additional output arguments for fminsearch (bug #44220).
Markus Muetzel <markus.muetzel@gmx.de>
parents: 23085
diff changeset
516 %! clf;
9241a0fa7873 Additional output arguments for fminsearch (bug #44220).
Markus Muetzel <markus.muetzel@gmx.de>
parents: 23085
diff changeset
517 %! hold on;
9241a0fa7873 Additional output arguments for fminsearch (bug #44220).
Markus Muetzel <markus.muetzel@gmx.de>
parents: 23085
diff changeset
518 %! 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
519 %! 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
520 %! x0 = [0;0];
23113
9241a0fa7873 Additional output arguments for fminsearch (bug #44220).
Markus Muetzel <markus.muetzel@gmx.de>
parents: 23085
diff changeset
521 %! [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
522 %! hold off;
14895
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
523
22962
fba8a6c742c6 fminsearch.m: Fix error in "guarded_eval".
Markus Muetzel <markus.muetzel@gmx.de>
parents: 22323
diff changeset
524 %!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
525
25231
e1024058833c test: change remaining %!xtests into %!tests
Mike Miller <mtmiller@octave.org>
parents: 25054
diff changeset
526 ## 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
527 ## 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
528 ## 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
529 %!test
23113
9241a0fa7873 Additional output arguments for fminsearch (bug #44220).
Markus Muetzel <markus.muetzel@gmx.de>
parents: 23085
diff changeset
530 %! 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
531 %! assert (x, 4.8750, 1e-4);
9241a0fa7873 Additional output arguments for fminsearch (bug #44220).
Markus Muetzel <markus.muetzel@gmx.de>
parents: 23085
diff changeset
532 %! 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
533 %! assert (x, 4.7109, 1e-4);
9241a0fa7873 Additional output arguments for fminsearch (bug #44220).
Markus Muetzel <markus.muetzel@gmx.de>
parents: 23085
diff changeset
534
22962
fba8a6c742c6 fminsearch.m: Fix error in "guarded_eval".
Markus Muetzel <markus.muetzel@gmx.de>
parents: 22323
diff changeset
535 %!test
25930
a00379f6f8c4 * fminsearch.m: Accept problem structure for Matlab compatibility.
John W. Eaton <jwe@octave.org>
parents: 25828
diff changeset
536 %! problem.objective = @sin;
a00379f6f8c4 * fminsearch.m: Accept problem structure for Matlab compatibility.
John W. Eaton <jwe@octave.org>
parents: 25828
diff changeset
537 %! problem.x0 = 3;
a00379f6f8c4 * fminsearch.m: Accept problem structure for Matlab compatibility.
John W. Eaton <jwe@octave.org>
parents: 25828
diff changeset
538 %! problem.solver = "fminsearch";
25936
7fa5ee67094a * fminsearch.m: Suppress output in test.
John W. Eaton <jwe@octave.org>
parents: 25930
diff changeset
539 %! problem.options = optimset ("MaxIter", 3, "Display", "none");
25930
a00379f6f8c4 * fminsearch.m: Accept problem structure for Matlab compatibility.
John W. Eaton <jwe@octave.org>
parents: 25828
diff changeset
540 %! x = fminsearch (problem);
a00379f6f8c4 * fminsearch.m: Accept problem structure for Matlab compatibility.
John W. Eaton <jwe@octave.org>
parents: 25828
diff changeset
541 %! assert (x, 4.8750, 1e-4);
25936
7fa5ee67094a * fminsearch.m: Suppress output in test.
John W. Eaton <jwe@octave.org>
parents: 25930
diff changeset
542 %! problem.options = optimset ("MaxFunEvals", 18, "Display", "none");
25930
a00379f6f8c4 * fminsearch.m: Accept problem structure for Matlab compatibility.
John W. Eaton <jwe@octave.org>
parents: 25828
diff changeset
543 %! x = fminsearch (problem);
a00379f6f8c4 * fminsearch.m: Accept problem structure for Matlab compatibility.
John W. Eaton <jwe@octave.org>
parents: 25828
diff changeset
544 %! 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
545
a00379f6f8c4 * fminsearch.m: Accept problem structure for Matlab compatibility.
John W. Eaton <jwe@octave.org>
parents: 25828
diff changeset
546 %!test
14895
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
547 %! c = 1.5;
23113
9241a0fa7873 Additional output arguments for fminsearch (bug #44220).
Markus Muetzel <markus.muetzel@gmx.de>
parents: 23085
diff changeset
548 %! 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
549
23113
9241a0fa7873 Additional output arguments for fminsearch (bug #44220).
Markus Muetzel <markus.muetzel@gmx.de>
parents: 23085
diff changeset
550 ## 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
551 %!test
3c896180df16 Pass additional arguments for fminsearch to called function (bug #41888).
Markus Muetzel <markus.muetzel@gmx.de>
parents: 22963
diff changeset
552 %! 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
553 %! 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
554 %! 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
555 %! 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
556 %! 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
557
23113
9241a0fa7873 Additional output arguments for fminsearch (bug #44220).
Markus Muetzel <markus.muetzel@gmx.de>
parents: 23085
diff changeset
558 ## all output arguments
9241a0fa7873 Additional output arguments for fminsearch (bug #44220).
Markus Muetzel <markus.muetzel@gmx.de>
parents: 23085
diff changeset
559 %!test
9241a0fa7873 Additional output arguments for fminsearch (bug #44220).
Markus Muetzel <markus.muetzel@gmx.de>
parents: 23085
diff changeset
560 %! 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
561 %! [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
562 %! 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
563 %! assert (fval, -1, options.TolFun);
9241a0fa7873 Additional output arguments for fminsearch (bug #44220).
Markus Muetzel <markus.muetzel@gmx.de>
parents: 23085
diff changeset
564 %! assert (exitflag, 1);
9241a0fa7873 Additional output arguments for fminsearch (bug #44220).
Markus Muetzel <markus.muetzel@gmx.de>
parents: 23085
diff changeset
565 %! assert (isstruct (output));
9241a0fa7873 Additional output arguments for fminsearch (bug #44220).
Markus Muetzel <markus.muetzel@gmx.de>
parents: 23085
diff changeset
566 %! 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
567 %! && isscalar (output.iterations) && output.iterations > 0);
9241a0fa7873 Additional output arguments for fminsearch (bug #44220).
Markus Muetzel <markus.muetzel@gmx.de>
parents: 23085
diff changeset
568 %! 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
569 %! && isscalar (output.funcCount) && output.funcCount > 0);
9241a0fa7873 Additional output arguments for fminsearch (bug #44220).
Markus Muetzel <markus.muetzel@gmx.de>
parents: 23085
diff changeset
570 %! 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
571 %! assert (isfield (output, "message") && ischar (output.message));
14895
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
572
22962
fba8a6c742c6 fminsearch.m: Fix error in "guarded_eval".
Markus Muetzel <markus.muetzel@gmx.de>
parents: 22323
diff changeset
573 ## Tests for guarded_eval
fba8a6c742c6 fminsearch.m: Fix error in "guarded_eval".
Markus Muetzel <markus.muetzel@gmx.de>
parents: 22323
diff changeset
574 %!error <non-real value encountered>
fba8a6c742c6 fminsearch.m: Fix error in "guarded_eval".
Markus Muetzel <markus.muetzel@gmx.de>
parents: 22323
diff changeset
575 %! 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
576 %!error <NaN value encountered>
fba8a6c742c6 fminsearch.m: Fix error in "guarded_eval".
Markus Muetzel <markus.muetzel@gmx.de>
parents: 22323
diff changeset
577 %! 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
578 %!error <Inf value encountered>
fba8a6c742c6 fminsearch.m: Fix error in "guarded_eval".
Markus Muetzel <markus.muetzel@gmx.de>
parents: 22323
diff changeset
579 %! 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
580
9241a0fa7873 Additional output arguments for fminsearch (bug #44220).
Markus Muetzel <markus.muetzel@gmx.de>
parents: 23085
diff changeset
581 ## Test input validation
28896
90fea9cc9caa test: Add expected error message <Invalid call> to BIST tests for nargin.
Rik <rik@octave.org>
parents: 27923
diff changeset
582 %!error <Invalid call> fminsearch ()
23113
9241a0fa7873 Additional output arguments for fminsearch (bug #44220).
Markus Muetzel <markus.muetzel@gmx.de>
parents: 23085
diff changeset
583 %!error fminsearch (1)