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