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
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
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
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
3 ##
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
4 ## This file is part of Octave.
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
5 ##
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
6 ## Octave is free software; you can redistribute it and/or modify it
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
7 ## under the terms of the GNU General Public License as published by
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
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
10 ##
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
11 ## Octave is distributed in the hope that it will be useful, but
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
12 ## WITHOUT ANY WARRANTY; without even the implied warranty of
22755
3a2b891d0b33 maint: Standardize Copyright formatting.
Rik <rik@octave.org>
parents: 22323
diff changeset
13 ## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
3a2b891d0b33 maint: Standardize Copyright formatting.
Rik <rik@octave.org>
parents: 22323
diff changeset
14 ## GNU General Public License for more details.
14895
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
15 ##
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
16 ## You should have received a copy of the GNU General Public License
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
17 ## along with Octave; see the file COPYING. If not, see
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
18 ## <http://www.gnu.org/licenses/>.
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
19
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
20 ## -*- texinfo -*-
20852
516bb87ea72e 2015 Code Sprint: remove class of function from docstring for all m-files.
Rik <rik@octave.org>
parents: 20735
diff changeset
21 ## @deftypefn {} {@var{x} =} fminsearch (@var{fun}, @var{x0})
516bb87ea72e 2015 Code Sprint: remove class of function from docstring for all m-files.
Rik <rik@octave.org>
parents: 20735
diff changeset
22 ## @deftypefnx {} {@var{x} =} fminsearch (@var{fun}, @var{x0}, @var{options})
22967
3c896180df16 Pass additional arguments for fminsearch to called function (bug #41888).
Markus Muetzel <markus.muetzel@gmx.de>
parents: 22963
diff changeset
23 ## @deftypefnx {} {@var{x} =} fminsearch (@var{fun}, @var{x0}, @var{options}, @var{fun_arg1}, @var{fun_arg2}, @dots{})
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
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
25 ##
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
26 ## 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
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
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
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
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
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
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
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
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
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
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
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
71 ##
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
72 ## @example
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
73 ## fminsearch (@@(x) (x(1)-5).^2+(x(2)-8).^4, [0;0])
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
74 ## @end example
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
75 ## @seealso{fminbnd, fminunc, optimset}
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
76 ## @end deftypefn
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
77
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
78 ## PKG_ADD: ## Discard result to avoid polluting workspace with ans at startup.
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
79 ## PKG_ADD: [~] = __all_opts__ ("fminsearch");
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
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
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
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
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
84
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
85 ## Get default options if requested.
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
86 if (nargin == 1 && ischar (fun) && strcmp (fun, "defaults"))
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
87 x = optimset ("Display", "notify", "FunValCheck", "off",
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
88 "MaxFunEvals", 400, "MaxIter", 400,
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
89 "OutputFcn", [],
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
90 "TolFun", 1e-7, "TolX", 1e-4);
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
91 return;
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
92 endif
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
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
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
95 print_usage ();
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
96 endif
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
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
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
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
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
103
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
104 if (isargout (2))
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
105 fval = feval (fun, x);
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
106 endif
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
107
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
108 endfunction
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
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
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
111 ## [x, fmax, nf] = NMSMAX(FUN, x0, STOPIT, SAVIT) attempts to
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
112 ## maximize the function FUN, using the starting vector x0.
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
113 ## The Nelder-Mead direct search method is used.
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
114 ## Output arguments:
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
115 ## x = vector yielding largest function value found,
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
116 ## fmax = function value at x,
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
117 ## nf = number of function evaluations.
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
118 ## The iteration is terminated when either
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
119 ## - the relative size of the simplex is <= STOPIT(1)
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
120 ## (default 1e-3),
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
121 ## - STOPIT(2) function evaluations have been performed
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
122 ## (default inf, i.e., no limit), or
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
123 ## - a function value equals or exceeds STOPIT(3)
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
124 ## (default inf, i.e., no test on function values).
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
125 ## The form of the initial simplex is determined by STOPIT(4):
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
126 ## STOPIT(4) = 0: regular simplex (sides of equal length, the default)
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
127 ## STOPIT(4) = 1: right-angled simplex.
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
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
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
130 ## maximization.) Default is 1, maximization.
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
131 ## set STOPIT(6)=-1 for minimization
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
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
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
134 ## NB: x0 can be a matrix. In the output argument, in SAVIT saves,
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
135 ## and in function calls, x has the same shape as x0.
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
136 ## NMSMAX(fun, x0, STOPIT, SAVIT, P1, P2,...) allows additional
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
137 ## arguments to be passed to fun, via feval(fun,x,P1,P2,...).
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
138 ## References:
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
139 ## N. J. Higham, Optimization by direct search in matrix computations,
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
140 ## SIAM J. Matrix Anal. Appl, 14(2): 317-333, 1993.
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
141 ## C. T. Kelley, Iterative Methods for Optimization, Society for Industrial
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
142 ## and Applied Mathematics, Philadelphia, PA, 1999.
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
143
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
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
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
146 ## www.maths.man.ac.uk/~higham/mctoolbox
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
147 ##
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
148 ## Modifications for Octave by A.Adler 2003
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
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
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
152
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
153 ## Tolerance for cgce test based on relative size of simplex.
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
154 stopit(1) = tol = optimget (options, "TolX", 1e-4);
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
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
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
160 stopit(2) = optimget (options, "MaxFunEvals", length (x) * 200);
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
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
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
163 maxiter = optimget (options, "MaxIter", length (x) * 200);
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
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
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
166 stopit(3) = Inf; # FIXME: expose this parameter to the outside
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
167
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
168 ## Default initial simplex.
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
169 stopit(4) = 0; # FIXME: expose this parameter to the outside
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
170
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
171 ## Default: show progress.
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
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
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
183 trace = stopit(5);
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
184
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
185 ## Use function to minimize, not maximize
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
186 stopit(6) = dirn = -1;
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
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
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
189 savit = []; # FIXME: expose this parameter to the outside
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
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
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
194 endfunction
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
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
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
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
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
200
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
201 if (strcmpi (optimget (options, "FunValCheck", "off"), "on"))
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
202 ## Replace fcn with a guarded version.
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
203 fun = @(x) guarded_eval (fun, x);
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
204 endif
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
205
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
206 x0 = x(:); # Work with column vector internally.
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
207 n = length (x0);
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
208
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
209 V = [zeros(n,1) eye(n)];
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
210 f = zeros (n+1,1);
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
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
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
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
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
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
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
218 endif
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
219
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
220 k = 0; m = 0;
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
221
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
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
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
224 if (stopit(4) == 0)
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
225 ## Regular simplex - all edges have same length.
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
226 ## Generated from construction given in reference [18, pp. 80-81] of [1].
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
227 alpha = scale / (n*sqrt (2)) * [sqrt(n+1)-1+n, sqrt(n+1)-1];
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
228 V(:,2:n+1) = (x0 + alpha(2)*ones (n,1)) * ones (1,n);
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
229 for j = 2:n+1
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
230 V(j-1,j) = x0(j-1) + alpha(1);
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
231 x(:) = V(:,j);
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
232 f(j) = dirn * feval (fun,x,varargin{:});
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
233 endfor
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
234 else
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
235 ## Right-angled simplex based on co-ordinate axes.
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
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
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
238 V(:,j) = x0 + alpha(j)*V(:,j);
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
239 x(:) = V(:,j);
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
240 f(j) = dirn * feval (fun,x,varargin{:});
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
241 endfor
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
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
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
244 how = "initial ";
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
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
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
247 j = j(n+1:-1:1);
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
248 f = f(j);
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
249 V = V(:,j);
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
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
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
266 alpha = 1; beta = 1/2; gamma = 2;
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
267
23113
9241a0fa7873 Additional output arguments for fminsearch (bug #44220).
Markus Muetzel <markus.muetzel@gmx.de>
parents: 23085
diff changeset
268 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
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
270
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
271 if (k > maxiter)
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
272 msg = "Exceeded maximum iterations...quitting\n";
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
273 break;
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
274 endif
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
275
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
276 fmax = f(1);
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
277 if (fmax > fmax_old)
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
278 if (! isempty (savit))
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
279 x(:) = V(:,1);
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
280 eval (["save " savit " x fmax nf"]);
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
281 endif
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
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
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
288 endif
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
289 fmax_old = fmax;
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
290
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
291 ## Three stopping tests from MDSMAX.M
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
292
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
293 ## Stopping Test 1 - f reached target value?
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
294 if (fmax >= stopit(3))
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
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
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
298 break;
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
299 endif
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
300
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
301 ## Stopping Test 2 - too many f-evals?
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
302 if (nf >= stopit(2))
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
303 msg = "Max no. of function evaluations exceeded...quitting\n";
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
304 break;
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
305 endif
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
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
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
308 v1 = V(:,1);
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
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
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
316 break;
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
317 endif
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
318
23113
9241a0fa7873 Additional output arguments for fminsearch (bug #44220).
Markus Muetzel <markus.muetzel@gmx.de>
parents: 23085
diff changeset
319 ## 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
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
334 ## One step of the Nelder-Mead simplex algorithm
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
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
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
337 ## and re-ordered function values after sort.
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
338
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
339 vbar = (sum (V(:,1:n)')/n)'; # Mean value
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
340 vr = (1 + alpha)*vbar - alpha*V(:,n+1);
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
341 x(:) = vr;
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
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
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
345 if (fr > f(n))
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
346 if (fr > f(1))
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
347 ve = gamma*vr + (1-gamma)*vbar;
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
348 x(:) = ve;
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
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
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
351 if (fe > f(1))
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
352 vk = ve;
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
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
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
355 endif
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
356 endif
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
357 else
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
358 vt = V(:,n+1);
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
359 ft = f(n+1);
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
360 if (fr > ft)
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
361 vt = vr;
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
362 ft = fr;
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
363 endif
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
364 vc = beta*vt + (1-beta)*vbar;
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
365 x(:) = vc;
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
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
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
368 if (fc > f(n))
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
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
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
371 else
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
372 for j = 2:n
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
373 V(:,j) = (V(:,1) + V(:,j))/2;
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
374 x(:) = V(:,j);
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
375 f(j) = dirn * feval (fun,x,varargin{:});
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
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
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
378 vk = (V(:,1) + V(:,n+1))/2;
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
379 x(:) = vk;
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
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
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
383 endif
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
384 endif
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
385 V(:,n+1) = vk;
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
386 f(n+1) = fk;
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
387 [~,j] = sort(f);
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
388 j = j(n+1:-1:1);
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
389 f = f(j);
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
390 V = V(:,j);
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
391
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
392 endwhile # End of outer (and only) loop.
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
393
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
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
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
397 endif
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
398 x(:) = V(:,1);
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
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
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
417 endfunction
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
418
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
419 ## A helper function that evaluates a function and checks for bad results.
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
420 function y = guarded_eval (fun, x)
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
421
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
422 y = fun (x);
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
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
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
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
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
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
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
429 error ("fminsearch:isinf", "fminsearch: Inf value encountered");
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
430 endif
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
431
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
432 endfunction
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
433
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
434
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
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
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
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
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
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
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
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
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
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