Mercurial > octave
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 |
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 | 7 ## |
8 ## This file is part of Octave. | |
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 | 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 | 14 ## |
15 ## Octave is distributed in the hope that it will be useful, but | |
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 | 19 ## |
20 ## You should have received a copy of the GNU General Public License | |
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 | 25 |
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 | 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 | 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 | 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 | 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 | 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 | 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 | 113 ## |
114 ## @example | |
115 ## fminsearch (@@(x) (x(1)-5).^2+(x(2)-8).^4, [0;0]) | |
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 | 120 ## @seealso{fminbnd, fminunc, optimset} |
121 ## @end deftypefn | |
122 | |
123 ## PKG_ADD: ## Discard result to avoid polluting workspace with ans at startup. | |
124 ## PKG_ADD: [~] = __all_opts__ ("fminsearch"); | |
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 | 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 | 133 |
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 | 140 return; |
141 endif | |
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 | 169 endif |
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 | 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 | 180 |
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 | 183 endif |
184 | |
185 endfunction | |
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 | 190 ## The Nelder-Mead direct search method is used. |
191 ## Output arguments: | |
192 ## x = vector yielding largest function value found, | |
193 ## fmax = function value at x, | |
194 ## nf = number of function evaluations. | |
195 ## The iteration is terminated when either | |
196 ## - the relative size of the simplex is <= STOPIT(1) | |
197 ## (default 1e-3), | |
198 ## - STOPIT(2) function evaluations have been performed | |
199 ## (default inf, i.e., no limit), or | |
200 ## - a function value equals or exceeds STOPIT(3) | |
201 ## (default inf, i.e., no test on function values). | |
202 ## The form of the initial simplex is determined by STOPIT(4): | |
203 ## STOPIT(4) = 0: regular simplex (sides of equal length, the default) | |
204 ## STOPIT(4) = 1: right-angled simplex. | |
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 | 207 ## maximization.) Default is 1, maximization. |
208 ## set STOPIT(6)=-1 for minimization | |
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 | 211 ## NB: x0 can be a matrix. In the output argument, in SAVIT saves, |
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 | 215 ## References: |
216 ## N. J. Higham, Optimization by direct search in matrix computations, | |
217 ## SIAM J. Matrix Anal. Appl, 14(2): 317-333, 1993. | |
218 ## C. T. Kelley, Iterative Methods for Optimization, Society for Industrial | |
219 ## and Applied Mathematics, Philadelphia, PA, 1999. | |
220 | |
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 | 223 ## www.maths.man.ac.uk/~higham/mctoolbox |
224 ## | |
225 ## Modifications for Octave by A.Adler 2003 | |
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 | 229 |
230 ## Tolerance for cgce test based on relative size of simplex. | |
231 stopit(1) = tol = optimget (options, "TolX", 1e-4); | |
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 | 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 | 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 | 243 stopit(3) = Inf; # FIXME: expose this parameter to the outside |
244 | |
245 ## Default initial simplex. | |
246 stopit(4) = 0; # FIXME: expose this parameter to the outside | |
247 | |
248 ## Default: show progress. | |
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 | 260 trace = stopit(5); |
261 | |
262 ## Use function to minimize, not maximize | |
263 stopit(6) = dirn = -1; | |
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 | 266 savit = []; # FIXME: expose this parameter to the outside |
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 | 271 endfunction |
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 | 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 | 277 |
278 if (strcmpi (optimget (options, "FunValCheck", "off"), "on")) | |
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 | 283 endif |
284 | |
285 x0 = x(:); # Work with column vector internally. | |
286 n = length (x0); | |
287 | |
288 V = [zeros(n,1) eye(n)]; | |
289 f = zeros (n+1,1); | |
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 | 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 | 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 | 297 endif |
298 | |
299 k = 0; m = 0; | |
300 | |
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 | 303 if (stopit(4) == 0) |
304 ## Regular simplex - all edges have same length. | |
305 ## Generated from construction given in reference [18, pp. 80-81] of [1]. | |
306 alpha = scale / (n*sqrt (2)) * [sqrt(n+1)-1+n, sqrt(n+1)-1]; | |
307 V(:,2:n+1) = (x0 + alpha(2)*ones (n,1)) * ones (1,n); | |
308 for j = 2:n+1 | |
309 V(j-1,j) = x0(j-1) + alpha(1); | |
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 | 312 endfor |
313 else | |
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 | 317 V(:,j) = x0 + alpha(j)*V(:,j); |
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 | 320 endfor |
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 | 323 how = "initial "; |
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 | 326 j = j(n+1:-1:1); |
327 f = f(j); | |
328 V = V(:,j); | |
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 | 345 alpha = 1; beta = 1/2; gamma = 2; |
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 | 349 |
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 | 352 break; |
353 endif | |
354 | |
355 fmax = f(1); | |
356 if (fmax > fmax_old) | |
357 if (! isempty (savit)) | |
358 x(:) = V(:,1); | |
359 eval (["save " savit " x fmax nf"]); | |
360 endif | |
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 | 367 endif |
368 fmax_old = fmax; | |
369 | |
370 ## Three stopping tests from MDSMAX.M | |
371 | |
372 ## Stopping Test 1 - f reached target value? | |
373 if (fmax >= stopit(3)) | |
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 | 377 break; |
378 endif | |
379 | |
380 ## Stopping Test 2 - too many f-evals? | |
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 | 384 break; |
385 endif | |
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 | 388 v1 = V(:,1); |
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 | 396 break; |
397 endif | |
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 | 414 ## One step of the Nelder-Mead simplex algorithm |
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 | 417 ## and re-ordered function values after sort. |
418 | |
419 vbar = (sum (V(:,1:n)')/n)'; # Mean value | |
420 vr = (1 + alpha)*vbar - alpha*V(:,n+1); | |
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 | 425 if (fr > f(n)) |
426 if (fr > f(1)) | |
427 ve = gamma*vr + (1-gamma)*vbar; | |
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 | 431 if (fe > f(1)) |
432 vk = ve; | |
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 | 435 endif |
436 endif | |
437 else | |
438 vt = V(:,n+1); | |
439 ft = f(n+1); | |
440 if (fr > ft) | |
441 vt = vr; | |
442 ft = fr; | |
443 endif | |
444 vc = beta*vt + (1-beta)*vbar; | |
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 | 448 if (fc > f(n)) |
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 | 451 else |
452 for j = 2:n | |
453 V(:,j) = (V(:,1) + V(:,j))/2; | |
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 | 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 | 458 vk = (V(:,1) + V(:,n+1))/2; |
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 | 463 endif |
464 endif | |
465 V(:,n+1) = vk; | |
466 f(n+1) = fk; | |
467 [~,j] = sort(f); | |
468 j = j(n+1:-1:1); | |
469 f = f(j); | |
470 V = V(:,j); | |
471 | |
472 endwhile # End of outer (and only) loop. | |
473 | |
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 | 477 endif |
478 x(:) = V(:,1); | |
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 | 497 endfunction |
498 | |
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 | 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 | 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 | 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 | 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 | 509 error ("fminsearch:isinf", "fminsearch: Inf value encountered"); |
510 endif | |
511 | |
512 endfunction | |
513 | |
514 | |
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 | 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 | 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 | 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 | 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) |