annotate scripts/optimization/fminsearch.m @ 28896:90fea9cc9caa

test: Add expected error message <Invalid call> to BIST tests for nargin. * acosd.m, acot.m, acotd.m, acoth.m, acsc.m, acscd.m, acsch.m, asec.m, asecd.m, asech.m, asind.m, atand.m, cosd.m, cot.m, cotd.m, coth.m, csc.m, cscd.m, csch.m, sec.m, secd.m, sech.m, sind.m, tand.m, cart2pol.m, cart2sph.m, celldisp.m, common_size.m, deal.m, del2.m, fliplr.m, integral2.m, interp1.m, isequal.m, isequaln.m, nextpow2.m, pol2cart.m, quad2d.m, quadl.m, quadv.m, randi.m, rat.m, repelem.m, rescale.m, shiftdim.m, sortrows.m, sph2cart.m, xor.m, convhull.m, delaunay.m, delaunayn.m, griddata.m, griddatan.m, inpolygon.m, voronoi.m, voronoin.m, listdlg.m, msgbox.m, questdlg.m, rmappdata.m, setappdata.m, __gripe_missing_component__.m, get_first_help_sentence.m, type.m, which.m, cmpermute.m, cmunique.m, gray2ind.m, imfinfo.m, imshow.m, imwrite.m, ind2rgb.m, movie.m, rgb2ind.m, importdata.m, bandwidth.m, condeig.m, gls.m, housh.m, linsolve.m, logm.m, lscov.m, normest.m, normest1.m, ols.m, ordeig.m, planerot.m, qzhess.m, rref.m, copyfile.m, delete.m, dos.m, fileparts.m, getfield.m, menu.m, mkdir.m, movefile.m, orderfields.m, publish.m, setfield.m, substruct.m, unix.m, unpack.m, decic.m, ode23.m, ode23s.m, ode45.m, fminsearch.m, lsqnonneg.m, pqpnonneg.m, sqp.m, annotation.m, lighting.m, shading.m, area.m, compass.m, contourc.m, feather.m, fplot.m, hist.m, isocaps.m, isocolors.m, isonormals.m, isosurface.m, ostreamtube.m, pie.m, pie3.m, reducepatch.m, reducevolume.m, rose.m, smooth3.m, stairs.m, stem.m, stem3.m, stream2.m, stream3.m, streamline.m, streamribbon.m, streamtube.m, surfnorm.m, trimesh.m, trisurf.m, colstyle.m, hgload.m, linkprop.m, meshgrid.m, ndgrid.m, padecoef.m, polyfit.m, polyval.m, unmkpp.m, profexport.m, ismember.m, unique.m, movfun.m, movslice.m, periodogram.m, sinc.m, spdiags.m, sprandsym.m, betaincinv.m, ellipke.m, factor.m, gammainc.m, gammaincinv.m, isprime.m, lcm.m, gallery.m, hadamard.m, bounds.m, corrcoef.m, discrete_rnd.m, empirical_rnd.m, histc.m, mode.m, movmad.m, movmax.m, movmean.m, movmedian.m, movmin.m, movprod.m, movstd.m, movsum.m, movvar.m, ranks.m, runlength.m, zscore.m, str2num.m, strchr.m, strsplit.m, strtok.m, untabify.m, assert.m, demo.m, example.m, speed.m, test.m, datenum.m, datevec.m, webread.m, webwrite.m: Add expected error message <Invalid call> to BIST tests for nargin. Remove redundant tests for nargin greater than the number of declared inputs which are now handled by interpreter.
author Rik <rik@octave.org>
date Sun, 11 Oct 2020 21:59:35 -0700
parents bd51beb6205e
children 0de38a6ef693
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
27923
bd51beb6205e update formatting of copyright notices
John W. Eaton <jwe@octave.org>
parents: 27919
diff changeset
1 ########################################################################
bd51beb6205e update formatting of copyright notices
John W. Eaton <jwe@octave.org>
parents: 27919
diff changeset
2 ##
27919
1891570abac8 update Octave Project Developers copyright for the new year
John W. Eaton <jwe@octave.org>
parents: 27918
diff changeset
3 ## Copyright (C) 2003-2020 The Octave Project Developers
27918
b442ec6dda5c use centralized file for copyright info for individual contributors
John W. Eaton <jwe@octave.org>
parents: 27584
diff changeset
4 ##
27923
bd51beb6205e update formatting of copyright notices
John W. Eaton <jwe@octave.org>
parents: 27919
diff changeset
5 ## See the file COPYRIGHT.md in the top-level directory of this
bd51beb6205e update formatting of copyright notices
John W. Eaton <jwe@octave.org>
parents: 27919
diff changeset
6 ## distribution or <https://octave.org/copyright/>.
14895
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
7 ##
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
8 ## This file is part of Octave.
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
9 ##
24534
194eb4bd202b maint: Update punctuation for GPL v3 license text.
Rik <rik@octave.org>
parents: 23567
diff changeset
10 ## Octave is free software: you can redistribute it and/or modify it
14895
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
11 ## under the terms of the GNU General Public License as published by
24534
194eb4bd202b maint: Update punctuation for GPL v3 license text.
Rik <rik@octave.org>
parents: 23567
diff changeset
12 ## the Free Software Foundation, either version 3 of the License, or
22755
3a2b891d0b33 maint: Standardize Copyright formatting.
Rik <rik@octave.org>
parents: 22323
diff changeset
13 ## (at your option) any later version.
14895
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
14 ##
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
15 ## Octave is distributed in the hope that it will be useful, but
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
16 ## WITHOUT ANY WARRANTY; without even the implied warranty of
22755
3a2b891d0b33 maint: Standardize Copyright formatting.
Rik <rik@octave.org>
parents: 22323
diff changeset
17 ## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
3a2b891d0b33 maint: Standardize Copyright formatting.
Rik <rik@octave.org>
parents: 22323
diff changeset
18 ## GNU General Public License for more details.
14895
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
19 ##
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
20 ## You should have received a copy of the GNU General Public License
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
21 ## along with Octave; see the file COPYING. If not, see
24534
194eb4bd202b maint: Update punctuation for GPL v3 license text.
Rik <rik@octave.org>
parents: 23567
diff changeset
22 ## <https://www.gnu.org/licenses/>.
27923
bd51beb6205e update formatting of copyright notices
John W. Eaton <jwe@octave.org>
parents: 27919
diff changeset
23 ##
bd51beb6205e update formatting of copyright notices
John W. Eaton <jwe@octave.org>
parents: 27919
diff changeset
24 ########################################################################
14895
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
25
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
26 ## -*- texinfo -*-
20852
516bb87ea72e 2015 Code Sprint: remove class of function from docstring for all m-files.
Rik <rik@octave.org>
parents: 20735
diff changeset
27 ## @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
28 ## @deftypefnx {} {@var{x} =} fminsearch (@var{fun}, @var{x0}, @var{options})
25930
a00379f6f8c4 * fminsearch.m: Accept problem structure for Matlab compatibility.
John W. Eaton <jwe@octave.org>
parents: 25828
diff changeset
29 ## @deftypefnx {} {@var{x} =} fminsearch (@var{problem})
23113
9241a0fa7873 Additional output arguments for fminsearch (bug #44220).
Markus Muetzel <markus.muetzel@gmx.de>
parents: 23085
diff changeset
30 ## @deftypefnx {} {[@var{x}, @var{fval}, @var{exitflag}, @var{output}] =} fminsearch (@dots{})
14895
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
31 ##
25739
8eec0403a370 fminsearch.m: Update default TolFun to 1e-4 for Matlab compatibility.
Rik <rik@octave.org>
parents: 25231
diff changeset
32 ## Find a value of @var{x} which minimizes the multi-variable function
8eec0403a370 fminsearch.m: Update default TolFun to 1e-4 for Matlab compatibility.
Rik <rik@octave.org>
parents: 25231
diff changeset
33 ## @var{fun}.
20165
f1d0f506ee78 doc: Update more docstrings to have one sentence summary as first line.
Rik <rik@octave.org>
parents: 19596
diff changeset
34 ##
27389
d4655f32dde7 fminsearch.m: Accept string for FCN argument (bug #56885)
Rik <rik@octave.org>
parents: 26753
diff changeset
35 ## @var{fun} is a function handle, inline function, or string containing the
d4655f32dde7 fminsearch.m: Accept string for FCN argument (bug #56885)
Rik <rik@octave.org>
parents: 26753
diff changeset
36 ## name of the function to evaluate.
d4655f32dde7 fminsearch.m: Accept string for FCN argument (bug #56885)
Rik <rik@octave.org>
parents: 26753
diff changeset
37 ##
14895
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
38 ## The search begins at the point @var{x0} and iterates using the
19040
0850b5212619 doc: Add @nospell macro around proper names in documentation.
Rik <rik@octave.org>
parents: 17744
diff changeset
39 ## @nospell{Nelder & Mead} Simplex algorithm (a derivative-free method). This
0850b5212619 doc: Add @nospell macro around proper names in documentation.
Rik <rik@octave.org>
parents: 17744
diff changeset
40 ## algorithm is better-suited to functions which have discontinuities or for
0850b5212619 doc: Add @nospell macro around proper names in documentation.
Rik <rik@octave.org>
parents: 17744
diff changeset
41 ## which a gradient-based search such as @code{fminunc} fails.
14895
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
42 ##
20165
f1d0f506ee78 doc: Update more docstrings to have one sentence summary as first line.
Rik <rik@octave.org>
parents: 19596
diff changeset
43 ## Options for the search are provided in the parameter @var{options} using the
f1d0f506ee78 doc: Update more docstrings to have one sentence summary as first line.
Rik <rik@octave.org>
parents: 19596
diff changeset
44 ## function @code{optimset}. Currently, @code{fminsearch} accepts the options:
25739
8eec0403a370 fminsearch.m: Update default TolFun to 1e-4 for Matlab compatibility.
Rik <rik@octave.org>
parents: 25231
diff changeset
45 ## @qcode{"Display"}, @qcode{"FunValCheck"},@qcode{"MaxFunEvals"},
25828
8b548f2f8086 maint: Strip trailing whitespace from source files.
John W. Eaton <jwe@octave.org>
parents: 25739
diff changeset
46 ## @qcode{"MaxIter"}, @qcode{"OutputFcn"}, @qcode{"TolFun"}, @qcode{"TolX"}.
25739
8eec0403a370 fminsearch.m: Update default TolFun to 1e-4 for Matlab compatibility.
Rik <rik@octave.org>
parents: 25231
diff changeset
47 ##
8eec0403a370 fminsearch.m: Update default TolFun to 1e-4 for Matlab compatibility.
Rik <rik@octave.org>
parents: 25231
diff changeset
48 ## @qcode{"MaxFunEvals"} proscribes the maximum number of function evaluations
8eec0403a370 fminsearch.m: Update default TolFun to 1e-4 for Matlab compatibility.
Rik <rik@octave.org>
parents: 25231
diff changeset
49 ## before optimization is halted. The default value is
8eec0403a370 fminsearch.m: Update default TolFun to 1e-4 for Matlab compatibility.
Rik <rik@octave.org>
parents: 25231
diff changeset
50 ## @code{200 * number_of_variables}, i.e., @code{200 * length (@var{x0})}.
8eec0403a370 fminsearch.m: Update default TolFun to 1e-4 for Matlab compatibility.
Rik <rik@octave.org>
parents: 25231
diff changeset
51 ## The value must be a positive integer.
8eec0403a370 fminsearch.m: Update default TolFun to 1e-4 for Matlab compatibility.
Rik <rik@octave.org>
parents: 25231
diff changeset
52 ##
8eec0403a370 fminsearch.m: Update default TolFun to 1e-4 for Matlab compatibility.
Rik <rik@octave.org>
parents: 25231
diff changeset
53 ## @qcode{"MaxIter"} proscribes the maximum number of algorithm iterations
8eec0403a370 fminsearch.m: Update default TolFun to 1e-4 for Matlab compatibility.
Rik <rik@octave.org>
parents: 25231
diff changeset
54 ## before optimization is halted. The default value is
8eec0403a370 fminsearch.m: Update default TolFun to 1e-4 for Matlab compatibility.
Rik <rik@octave.org>
parents: 25231
diff changeset
55 ## @code{200 * number_of_variables}, i.e., @code{200 * length (@var{x0})}.
8eec0403a370 fminsearch.m: Update default TolFun to 1e-4 for Matlab compatibility.
Rik <rik@octave.org>
parents: 25231
diff changeset
56 ## The value must be a positive integer.
25828
8b548f2f8086 maint: Strip trailing whitespace from source files.
John W. Eaton <jwe@octave.org>
parents: 25739
diff changeset
57 ##
25739
8eec0403a370 fminsearch.m: Update default TolFun to 1e-4 for Matlab compatibility.
Rik <rik@octave.org>
parents: 25231
diff changeset
58 ## For a description of the other options, see @code{optimset}. To initialize
8eec0403a370 fminsearch.m: Update default TolFun to 1e-4 for Matlab compatibility.
Rik <rik@octave.org>
parents: 25231
diff changeset
59 ## an options structure with default values for @code{fminsearch} use
8eec0403a370 fminsearch.m: Update default TolFun to 1e-4 for Matlab compatibility.
Rik <rik@octave.org>
parents: 25231
diff changeset
60 ## @code{options = optimset ("fminsearch")}.
14895
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
61 ##
25930
a00379f6f8c4 * fminsearch.m: Accept problem structure for Matlab compatibility.
John W. Eaton <jwe@octave.org>
parents: 25828
diff changeset
62 ## @code{fminsearch} may also be called with a single structure argument
a00379f6f8c4 * fminsearch.m: Accept problem structure for Matlab compatibility.
John W. Eaton <jwe@octave.org>
parents: 25828
diff changeset
63 ## with the following fields:
a00379f6f8c4 * fminsearch.m: Accept problem structure for Matlab compatibility.
John W. Eaton <jwe@octave.org>
parents: 25828
diff changeset
64 ##
a00379f6f8c4 * fminsearch.m: Accept problem structure for Matlab compatibility.
John W. Eaton <jwe@octave.org>
parents: 25828
diff changeset
65 ## @table @code
a00379f6f8c4 * fminsearch.m: Accept problem structure for Matlab compatibility.
John W. Eaton <jwe@octave.org>
parents: 25828
diff changeset
66 ## @item objective
a00379f6f8c4 * fminsearch.m: Accept problem structure for Matlab compatibility.
John W. Eaton <jwe@octave.org>
parents: 25828
diff changeset
67 ## The objective function.
a00379f6f8c4 * fminsearch.m: Accept problem structure for Matlab compatibility.
John W. Eaton <jwe@octave.org>
parents: 25828
diff changeset
68 ##
a00379f6f8c4 * fminsearch.m: Accept problem structure for Matlab compatibility.
John W. Eaton <jwe@octave.org>
parents: 25828
diff changeset
69 ## @item x0
a00379f6f8c4 * fminsearch.m: Accept problem structure for Matlab compatibility.
John W. Eaton <jwe@octave.org>
parents: 25828
diff changeset
70 ## The initial point.
a00379f6f8c4 * fminsearch.m: Accept problem structure for Matlab compatibility.
John W. Eaton <jwe@octave.org>
parents: 25828
diff changeset
71 ##
a00379f6f8c4 * fminsearch.m: Accept problem structure for Matlab compatibility.
John W. Eaton <jwe@octave.org>
parents: 25828
diff changeset
72 ## @item solver
a00379f6f8c4 * fminsearch.m: Accept problem structure for Matlab compatibility.
John W. Eaton <jwe@octave.org>
parents: 25828
diff changeset
73 ## Must be set to @qcode{"fminsearch"}.
a00379f6f8c4 * fminsearch.m: Accept problem structure for Matlab compatibility.
John W. Eaton <jwe@octave.org>
parents: 25828
diff changeset
74 ##
a00379f6f8c4 * fminsearch.m: Accept problem structure for Matlab compatibility.
John W. Eaton <jwe@octave.org>
parents: 25828
diff changeset
75 ## @item options
a00379f6f8c4 * fminsearch.m: Accept problem structure for Matlab compatibility.
John W. Eaton <jwe@octave.org>
parents: 25828
diff changeset
76 ## A structure returned from @code{optimset} or an empty matrix to
a00379f6f8c4 * fminsearch.m: Accept problem structure for Matlab compatibility.
John W. Eaton <jwe@octave.org>
parents: 25828
diff changeset
77 ## indicate that defaults should be used.
a00379f6f8c4 * fminsearch.m: Accept problem structure for Matlab compatibility.
John W. Eaton <jwe@octave.org>
parents: 25828
diff changeset
78 ## @end table
a00379f6f8c4 * fminsearch.m: Accept problem structure for Matlab compatibility.
John W. Eaton <jwe@octave.org>
parents: 25828
diff changeset
79 ##
a00379f6f8c4 * fminsearch.m: Accept problem structure for Matlab compatibility.
John W. Eaton <jwe@octave.org>
parents: 25828
diff changeset
80 ## @noindent
a00379f6f8c4 * fminsearch.m: Accept problem structure for Matlab compatibility.
John W. Eaton <jwe@octave.org>
parents: 25828
diff changeset
81 ## The field @code{options} is optional. All others are required.
a00379f6f8c4 * fminsearch.m: Accept problem structure for Matlab compatibility.
John W. Eaton <jwe@octave.org>
parents: 25828
diff changeset
82 ##
20165
f1d0f506ee78 doc: Update more docstrings to have one sentence summary as first line.
Rik <rik@octave.org>
parents: 19596
diff changeset
83 ## 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
84 ## the function value at the minimum.
14895
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
85 ##
25739
8eec0403a370 fminsearch.m: Update default TolFun to 1e-4 for Matlab compatibility.
Rik <rik@octave.org>
parents: 25231
diff changeset
86 ## The third output @var{exitflag} reports whether the algorithm succeeded and
8eec0403a370 fminsearch.m: Update default TolFun to 1e-4 for Matlab compatibility.
Rik <rik@octave.org>
parents: 25231
diff changeset
87 ## may take one of the following values:
23113
9241a0fa7873 Additional output arguments for fminsearch (bug #44220).
Markus Muetzel <markus.muetzel@gmx.de>
parents: 23085
diff changeset
88 ##
23114
19e958974410 fminsearch.m: fix texinfo header (bug #50178)
Philip Nienhuis <prnienhuis@users.sf.net>
parents: 23113
diff changeset
89 ## @table @asis
23113
9241a0fa7873 Additional output arguments for fminsearch (bug #44220).
Markus Muetzel <markus.muetzel@gmx.de>
parents: 23085
diff changeset
90 ## @item 1
9241a0fa7873 Additional output arguments for fminsearch (bug #44220).
Markus Muetzel <markus.muetzel@gmx.de>
parents: 23085
diff changeset
91 ## if the algorithm converged
25739
8eec0403a370 fminsearch.m: Update default TolFun to 1e-4 for Matlab compatibility.
Rik <rik@octave.org>
parents: 25231
diff changeset
92 ## (size of the simplex is smaller than @code{TolX} @strong{AND} the step in
8eec0403a370 fminsearch.m: Update default TolFun to 1e-4 for Matlab compatibility.
Rik <rik@octave.org>
parents: 25231
diff changeset
93 ## function value between iterations is smaller than @code{TolFun}).
14895
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
94 ##
23113
9241a0fa7873 Additional output arguments for fminsearch (bug #44220).
Markus Muetzel <markus.muetzel@gmx.de>
parents: 23085
diff changeset
95 ## @item 0
9241a0fa7873 Additional output arguments for fminsearch (bug #44220).
Markus Muetzel <markus.muetzel@gmx.de>
parents: 23085
diff changeset
96 ## 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
97 ## evaluations are exceeded.
9241a0fa7873 Additional output arguments for fminsearch (bug #44220).
Markus Muetzel <markus.muetzel@gmx.de>
parents: 23085
diff changeset
98 ##
9241a0fa7873 Additional output arguments for fminsearch (bug #44220).
Markus Muetzel <markus.muetzel@gmx.de>
parents: 23085
diff changeset
99 ## @item -1
9241a0fa7873 Additional output arguments for fminsearch (bug #44220).
Markus Muetzel <markus.muetzel@gmx.de>
parents: 23085
diff changeset
100 ## 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
101 ## @end table
9241a0fa7873 Additional output arguments for fminsearch (bug #44220).
Markus Muetzel <markus.muetzel@gmx.de>
parents: 23085
diff changeset
102 ##
25739
8eec0403a370 fminsearch.m: Update default TolFun to 1e-4 for Matlab compatibility.
Rik <rik@octave.org>
parents: 25231
diff changeset
103 ## The fourth output is a structure @var{output} containing runtime
8eec0403a370 fminsearch.m: Update default TolFun to 1e-4 for Matlab compatibility.
Rik <rik@octave.org>
parents: 25231
diff changeset
104 ## about the algorithm. Fields in the structure are @code{funcCount}
8eec0403a370 fminsearch.m: Update default TolFun to 1e-4 for Matlab compatibility.
Rik <rik@octave.org>
parents: 25231
diff changeset
105 ## containing the number of function calls to @var{fun}, @code{iterations}
8eec0403a370 fminsearch.m: Update default TolFun to 1e-4 for Matlab compatibility.
Rik <rik@octave.org>
parents: 25231
diff changeset
106 ## containing the number of iteration steps, @code{algorithm} with the name of
25828
8b548f2f8086 maint: Strip trailing whitespace from source files.
John W. Eaton <jwe@octave.org>
parents: 25739
diff changeset
107 ## the search algorithm (always:
23567
71bfd507663c doc: Periodic spellcheck of documentation.
Rik <rik@octave.org>
parents: 23220
diff changeset
108 ## @nospell{@qcode{"Nelder-Mead simplex direct search"}}), and @code{message}
71bfd507663c doc: Periodic spellcheck of documentation.
Rik <rik@octave.org>
parents: 23220
diff changeset
109 ## with the exit message.
23113
9241a0fa7873 Additional output arguments for fminsearch (bug #44220).
Markus Muetzel <markus.muetzel@gmx.de>
parents: 23085
diff changeset
110 ##
9241a0fa7873 Additional output arguments for fminsearch (bug #44220).
Markus Muetzel <markus.muetzel@gmx.de>
parents: 23085
diff changeset
111 ## Example:
14895
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
112 ##
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
113 ## @example
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
114 ## 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
115 ## @end example
25739
8eec0403a370 fminsearch.m: Update default TolFun to 1e-4 for Matlab compatibility.
Rik <rik@octave.org>
parents: 25231
diff changeset
116 ##
8eec0403a370 fminsearch.m: Update default TolFun to 1e-4 for Matlab compatibility.
Rik <rik@octave.org>
parents: 25231
diff changeset
117 ## Note: If you need to find the minimum of a single variable function it is
8eec0403a370 fminsearch.m: Update default TolFun to 1e-4 for Matlab compatibility.
Rik <rik@octave.org>
parents: 25231
diff changeset
118 ## probably better to use @code{fminbnd}.
14895
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
119 ## @seealso{fminbnd, fminunc, optimset}
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
120 ## @end deftypefn
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
121
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
122 ## 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
123 ## PKG_ADD: [~] = __all_opts__ ("fminsearch");
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
124
23113
9241a0fa7873 Additional output arguments for fminsearch (bug #44220).
Markus Muetzel <markus.muetzel@gmx.de>
parents: 23085
diff changeset
125 ## 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
126
25930
a00379f6f8c4 * fminsearch.m: Accept problem structure for Matlab compatibility.
John W. Eaton <jwe@octave.org>
parents: 25828
diff changeset
127 function [x, fval, exitflag, output] = fminsearch (varargin)
a00379f6f8c4 * fminsearch.m: Accept problem structure for Matlab compatibility.
John W. Eaton <jwe@octave.org>
parents: 25828
diff changeset
128
a00379f6f8c4 * fminsearch.m: Accept problem structure for Matlab compatibility.
John W. Eaton <jwe@octave.org>
parents: 25828
diff changeset
129 if (nargin < 1)
a00379f6f8c4 * fminsearch.m: Accept problem structure for Matlab compatibility.
John W. Eaton <jwe@octave.org>
parents: 25828
diff changeset
130 print_usage ();
a00379f6f8c4 * fminsearch.m: Accept problem structure for Matlab compatibility.
John W. Eaton <jwe@octave.org>
parents: 25828
diff changeset
131 endif
14895
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
132
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
133 ## Get default options if requested.
25930
a00379f6f8c4 * fminsearch.m: Accept problem structure for Matlab compatibility.
John W. Eaton <jwe@octave.org>
parents: 25828
diff changeset
134 if (nargin == 1 && ischar (varargin{1}) && strcmp (varargin{1}, "defaults"))
26138
804e18e3e320 Reenable query of optimization options (bugs #54952 and #55089).
Kai T. Ohlhus <k.ohlhus@gmail.com>
parents: 25936
diff changeset
135 x = struct ("Display", "notify", "FunValCheck", "off",
804e18e3e320 Reenable query of optimization options (bugs #54952 and #55089).
Kai T. Ohlhus <k.ohlhus@gmail.com>
parents: 25936
diff changeset
136 "MaxFunEvals", [], "MaxIter", [],
804e18e3e320 Reenable query of optimization options (bugs #54952 and #55089).
Kai T. Ohlhus <k.ohlhus@gmail.com>
parents: 25936
diff changeset
137 "OutputFcn", [],
804e18e3e320 Reenable query of optimization options (bugs #54952 and #55089).
Kai T. Ohlhus <k.ohlhus@gmail.com>
parents: 25936
diff changeset
138 "TolFun", 1e-4, "TolX", 1e-4);
14895
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
139 return;
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
140 endif
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
141
25930
a00379f6f8c4 * fminsearch.m: Accept problem structure for Matlab compatibility.
John W. Eaton <jwe@octave.org>
parents: 25828
diff changeset
142 if (nargin == 1)
a00379f6f8c4 * fminsearch.m: Accept problem structure for Matlab compatibility.
John W. Eaton <jwe@octave.org>
parents: 25828
diff changeset
143 problem = varargin{1};
a00379f6f8c4 * fminsearch.m: Accept problem structure for Matlab compatibility.
John W. Eaton <jwe@octave.org>
parents: 25828
diff changeset
144 varargin = {};
a00379f6f8c4 * fminsearch.m: Accept problem structure for Matlab compatibility.
John W. Eaton <jwe@octave.org>
parents: 25828
diff changeset
145 if (! isstruct (problem))
a00379f6f8c4 * fminsearch.m: Accept problem structure for Matlab compatibility.
John W. Eaton <jwe@octave.org>
parents: 25828
diff changeset
146 error ("fminsearch: PROBLEM must be a structure");
a00379f6f8c4 * fminsearch.m: Accept problem structure for Matlab compatibility.
John W. Eaton <jwe@octave.org>
parents: 25828
diff changeset
147 endif
a00379f6f8c4 * fminsearch.m: Accept problem structure for Matlab compatibility.
John W. Eaton <jwe@octave.org>
parents: 25828
diff changeset
148 fun = problem.objective;
a00379f6f8c4 * fminsearch.m: Accept problem structure for Matlab compatibility.
John W. Eaton <jwe@octave.org>
parents: 25828
diff changeset
149 x0 = problem.x0;
a00379f6f8c4 * fminsearch.m: Accept problem structure for Matlab compatibility.
John W. Eaton <jwe@octave.org>
parents: 25828
diff changeset
150 if (! strcmp (problem.solver, "fminsearch"))
a00379f6f8c4 * fminsearch.m: Accept problem structure for Matlab compatibility.
John W. Eaton <jwe@octave.org>
parents: 25828
diff changeset
151 error ('fminsearch: problem.solver must be set to "fminsearch"');
a00379f6f8c4 * fminsearch.m: Accept problem structure for Matlab compatibility.
John W. Eaton <jwe@octave.org>
parents: 25828
diff changeset
152 endif
a00379f6f8c4 * fminsearch.m: Accept problem structure for Matlab compatibility.
John W. Eaton <jwe@octave.org>
parents: 25828
diff changeset
153 if (isfield (problem, "options"))
a00379f6f8c4 * fminsearch.m: Accept problem structure for Matlab compatibility.
John W. Eaton <jwe@octave.org>
parents: 25828
diff changeset
154 options = problem.options;
a00379f6f8c4 * fminsearch.m: Accept problem structure for Matlab compatibility.
John W. Eaton <jwe@octave.org>
parents: 25828
diff changeset
155 else
a00379f6f8c4 * fminsearch.m: Accept problem structure for Matlab compatibility.
John W. Eaton <jwe@octave.org>
parents: 25828
diff changeset
156 options = [];
a00379f6f8c4 * fminsearch.m: Accept problem structure for Matlab compatibility.
John W. Eaton <jwe@octave.org>
parents: 25828
diff changeset
157 endif
a00379f6f8c4 * fminsearch.m: Accept problem structure for Matlab compatibility.
John W. Eaton <jwe@octave.org>
parents: 25828
diff changeset
158 elseif (nargin > 1)
a00379f6f8c4 * fminsearch.m: Accept problem structure for Matlab compatibility.
John W. Eaton <jwe@octave.org>
parents: 25828
diff changeset
159 fun = varargin{1};
a00379f6f8c4 * fminsearch.m: Accept problem structure for Matlab compatibility.
John W. Eaton <jwe@octave.org>
parents: 25828
diff changeset
160 x0 = varargin{2};
a00379f6f8c4 * fminsearch.m: Accept problem structure for Matlab compatibility.
John W. Eaton <jwe@octave.org>
parents: 25828
diff changeset
161 if (nargin > 2)
a00379f6f8c4 * fminsearch.m: Accept problem structure for Matlab compatibility.
John W. Eaton <jwe@octave.org>
parents: 25828
diff changeset
162 options = varargin{3};
a00379f6f8c4 * fminsearch.m: Accept problem structure for Matlab compatibility.
John W. Eaton <jwe@octave.org>
parents: 25828
diff changeset
163 varargin(1:3) = [];
a00379f6f8c4 * fminsearch.m: Accept problem structure for Matlab compatibility.
John W. Eaton <jwe@octave.org>
parents: 25828
diff changeset
164 else
a00379f6f8c4 * fminsearch.m: Accept problem structure for Matlab compatibility.
John W. Eaton <jwe@octave.org>
parents: 25828
diff changeset
165 options = [];
a00379f6f8c4 * fminsearch.m: Accept problem structure for Matlab compatibility.
John W. Eaton <jwe@octave.org>
parents: 25828
diff changeset
166 varargin = {};
a00379f6f8c4 * fminsearch.m: Accept problem structure for Matlab compatibility.
John W. Eaton <jwe@octave.org>
parents: 25828
diff changeset
167 endif
14895
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
168 endif
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
169
27389
d4655f32dde7 fminsearch.m: Accept string for FCN argument (bug #56885)
Rik <rik@octave.org>
parents: 26753
diff changeset
170 if (ischar (fun))
d4655f32dde7 fminsearch.m: Accept string for FCN argument (bug #56885)
Rik <rik@octave.org>
parents: 26753
diff changeset
171 fun = str2func (fun);
d4655f32dde7 fminsearch.m: Accept string for FCN argument (bug #56885)
Rik <rik@octave.org>
parents: 26753
diff changeset
172 endif
d4655f32dde7 fminsearch.m: Accept string for FCN argument (bug #56885)
Rik <rik@octave.org>
parents: 26753
diff changeset
173
25930
a00379f6f8c4 * fminsearch.m: Accept problem structure for Matlab compatibility.
John W. Eaton <jwe@octave.org>
parents: 25828
diff changeset
174 if (isempty (options))
22967
3c896180df16 Pass additional arguments for fminsearch to called function (bug #41888).
Markus Muetzel <markus.muetzel@gmx.de>
parents: 22963
diff changeset
175 options = struct ();
3c896180df16 Pass additional arguments for fminsearch to called function (bug #41888).
Markus Muetzel <markus.muetzel@gmx.de>
parents: 22963
diff changeset
176 endif
14895
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
177
23113
9241a0fa7873 Additional output arguments for fminsearch (bug #44220).
Markus Muetzel <markus.muetzel@gmx.de>
parents: 23085
diff changeset
178 [x, exitflag, output] = nmsmax (fun, x0, options, varargin{:});
14895
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
179
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
180 if (isargout (2))
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
181 fval = feval (fun, x);
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
182 endif
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
183
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
184 endfunction
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
185
23113
9241a0fa7873 Additional output arguments for fminsearch (bug #44220).
Markus Muetzel <markus.muetzel@gmx.de>
parents: 23085
diff changeset
186 ## NMSMAX Nelder-Mead simplex method for direct search optimization.
14895
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
187 ## [x, fmax, nf] = NMSMAX(FUN, x0, STOPIT, SAVIT) attempts to
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
188 ## maximize the function FUN, using the starting vector x0.
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
189 ## The Nelder-Mead direct search method is used.
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
190 ## Output arguments:
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
191 ## x = vector yielding largest function value found,
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
192 ## fmax = function value at x,
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
193 ## nf = number of function evaluations.
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
194 ## The iteration is terminated when either
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
195 ## - the relative size of the simplex is <= STOPIT(1)
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
196 ## (default 1e-3),
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
197 ## - STOPIT(2) function evaluations have been performed
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
198 ## (default inf, i.e., no limit), or
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
199 ## - a function value equals or exceeds STOPIT(3)
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
200 ## (default inf, i.e., no test on function values).
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
201 ## 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
202 ## 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
203 ## STOPIT(4) = 1: right-angled simplex.
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
204 ## 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
205 ## STOPIT(6) indicates the direction (i.e., minimization or
14895
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
206 ## maximization.) Default is 1, maximization.
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
207 ## set STOPIT(6)=-1 for minimization
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
208 ## 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
209 ## '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
210 ## 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
211 ## 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
212 ## NMSMAX(fun, x0, STOPIT, SAVIT, P1, P2,...) allows additional
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
213 ## 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
214 ## References:
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
215 ## N. J. Higham, Optimization by direct search in matrix computations,
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
216 ## SIAM J. Matrix Anal. Appl, 14(2): 317-333, 1993.
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
217 ## C. T. Kelley, Iterative Methods for Optimization, Society for Industrial
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
218 ## and Applied Mathematics, Philadelphia, PA, 1999.
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 ## From Matrix Toolbox
17744
d63878346099 maint: Update copyright notices for release.
John W. Eaton <jwe@octave.org>
parents: 17281
diff changeset
221 ## Copyright (C) 2002, 2013 N.J.Higham
14895
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
222 ## www.maths.man.ac.uk/~higham/mctoolbox
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
223 ##
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
224 ## Modifications for Octave by A.Adler 2003
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
225
23113
9241a0fa7873 Additional output arguments for fminsearch (bug #44220).
Markus Muetzel <markus.muetzel@gmx.de>
parents: 23085
diff changeset
226 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
227 parse_options (options, x)
14895
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
228
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
229 ## Tolerance for cgce test based on relative size of simplex.
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
230 stopit(1) = tol = optimget (options, "TolX", 1e-4);
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
231
23113
9241a0fa7873 Additional output arguments for fminsearch (bug #44220).
Markus Muetzel <markus.muetzel@gmx.de>
parents: 23085
diff changeset
232 ## Tolerance for cgce test based on step in function value.
25739
8eec0403a370 fminsearch.m: Update default TolFun to 1e-4 for Matlab compatibility.
Rik <rik@octave.org>
parents: 25231
diff changeset
233 tol_f = optimget (options, "TolFun", 1e-4);
23113
9241a0fa7873 Additional output arguments for fminsearch (bug #44220).
Markus Muetzel <markus.muetzel@gmx.de>
parents: 23085
diff changeset
234
9241a0fa7873 Additional output arguments for fminsearch (bug #44220).
Markus Muetzel <markus.muetzel@gmx.de>
parents: 23085
diff changeset
235 ## Max number of function evaluations.
25739
8eec0403a370 fminsearch.m: Update default TolFun to 1e-4 for Matlab compatibility.
Rik <rik@octave.org>
parents: 25231
diff changeset
236 stopit(2) = optimget (options, "MaxFunEvals", 200 * length (x));
14895
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
237
23113
9241a0fa7873 Additional output arguments for fminsearch (bug #44220).
Markus Muetzel <markus.muetzel@gmx.de>
parents: 23085
diff changeset
238 ## Max number of iterations
25739
8eec0403a370 fminsearch.m: Update default TolFun to 1e-4 for Matlab compatibility.
Rik <rik@octave.org>
parents: 25231
diff changeset
239 maxiter = optimget (options, "MaxIter", 200 * length (x));
14895
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
240
23113
9241a0fa7873 Additional output arguments for fminsearch (bug #44220).
Markus Muetzel <markus.muetzel@gmx.de>
parents: 23085
diff changeset
241 ## Default target for function values.
14895
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
242 stopit(3) = Inf; # FIXME: expose this parameter to the outside
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
243
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
244 ## Default initial simplex.
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
245 stopit(4) = 0; # FIXME: expose this parameter to the outside
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
246
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
247 ## Default: show progress.
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
248 display = optimget (options, "Display", "notify");
23113
9241a0fa7873 Additional output arguments for fminsearch (bug #44220).
Markus Muetzel <markus.muetzel@gmx.de>
parents: 23085
diff changeset
249 switch (display)
9241a0fa7873 Additional output arguments for fminsearch (bug #44220).
Markus Muetzel <markus.muetzel@gmx.de>
parents: 23085
diff changeset
250 case "iter"
9241a0fa7873 Additional output arguments for fminsearch (bug #44220).
Markus Muetzel <markus.muetzel@gmx.de>
parents: 23085
diff changeset
251 stopit(5) = 1;
9241a0fa7873 Additional output arguments for fminsearch (bug #44220).
Markus Muetzel <markus.muetzel@gmx.de>
parents: 23085
diff changeset
252 case "final"
9241a0fa7873 Additional output arguments for fminsearch (bug #44220).
Markus Muetzel <markus.muetzel@gmx.de>
parents: 23085
diff changeset
253 stopit(5) = 2;
9241a0fa7873 Additional output arguments for fminsearch (bug #44220).
Markus Muetzel <markus.muetzel@gmx.de>
parents: 23085
diff changeset
254 case "notify"
9241a0fa7873 Additional output arguments for fminsearch (bug #44220).
Markus Muetzel <markus.muetzel@gmx.de>
parents: 23085
diff changeset
255 stopit(5) = 3;
9241a0fa7873 Additional output arguments for fminsearch (bug #44220).
Markus Muetzel <markus.muetzel@gmx.de>
parents: 23085
diff changeset
256 otherwise # "none"
9241a0fa7873 Additional output arguments for fminsearch (bug #44220).
Markus Muetzel <markus.muetzel@gmx.de>
parents: 23085
diff changeset
257 stopit(5) = 0;
9241a0fa7873 Additional output arguments for fminsearch (bug #44220).
Markus Muetzel <markus.muetzel@gmx.de>
parents: 23085
diff changeset
258 endswitch
14895
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
259 trace = stopit(5);
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
260
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
261 ## Use function to minimize, not maximize
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
262 stopit(6) = dirn = -1;
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
263
20713
2469d78a1d8b Consistently use 'filename' rather than 'file name' throughout code base.
Rik <rik@octave.org>
parents: 20231
diff changeset
264 ## Filename for snapshots.
14895
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
265 savit = []; # FIXME: expose this parameter to the outside
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
266
23113
9241a0fa7873 Additional output arguments for fminsearch (bug #44220).
Markus Muetzel <markus.muetzel@gmx.de>
parents: 23085
diff changeset
267 ## OutputFcn
9241a0fa7873 Additional output arguments for fminsearch (bug #44220).
Markus Muetzel <markus.muetzel@gmx.de>
parents: 23085
diff changeset
268 outfcn = optimget (options, "OutputFcn");
9241a0fa7873 Additional output arguments for fminsearch (bug #44220).
Markus Muetzel <markus.muetzel@gmx.de>
parents: 23085
diff changeset
269
14895
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
270 endfunction
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
271
23113
9241a0fa7873 Additional output arguments for fminsearch (bug #44220).
Markus Muetzel <markus.muetzel@gmx.de>
parents: 23085
diff changeset
272 function [x, exitflag, output] = nmsmax (fun, x, options, varargin)
14895
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
273
23113
9241a0fa7873 Additional output arguments for fminsearch (bug #44220).
Markus Muetzel <markus.muetzel@gmx.de>
parents: 23085
diff changeset
274 [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
275 parse_options (options, x);
14895
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
276
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
277 if (strcmpi (optimget (options, "FunValCheck", "off"), "on"))
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
278 ## Replace fcn with a guarded version.
27584
2ab2e289cf84 fminsearch.m: Use only real part of objective function for Matlab compatibility (bug #57136).
Rik <rik@octave.org>
parents: 27389
diff changeset
279 fun = @(x) guarded_eval (fun, x, varargin{:});
2ab2e289cf84 fminsearch.m: Use only real part of objective function for Matlab compatibility (bug #57136).
Rik <rik@octave.org>
parents: 27389
diff changeset
280 else
2ab2e289cf84 fminsearch.m: Use only real part of objective function for Matlab compatibility (bug #57136).
Rik <rik@octave.org>
parents: 27389
diff changeset
281 fun = @(x) real (fun (x, varargin{:}));
14895
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
282 endif
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
283
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
284 x0 = x(:); # Work with column vector internally.
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
285 n = length (x0);
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
286
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
287 V = [zeros(n,1) eye(n)];
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
288 f = zeros (n+1,1);
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
289 V(:,1) = x0;
27584
2ab2e289cf84 fminsearch.m: Use only real part of objective function for Matlab compatibility (bug #57136).
Rik <rik@octave.org>
parents: 27389
diff changeset
290 f(1) = dirn * fun (x);
14895
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
291 fmax_old = f(1);
23113
9241a0fa7873 Additional output arguments for fminsearch (bug #44220).
Markus Muetzel <markus.muetzel@gmx.de>
parents: 23085
diff changeset
292 nf = 1;
14895
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
293
23113
9241a0fa7873 Additional output arguments for fminsearch (bug #44220).
Markus Muetzel <markus.muetzel@gmx.de>
parents: 23085
diff changeset
294 if (trace == 1)
26280
da54f14258e1 fminsearch.m: Fix sign of results for intermediate reporting (bug #55261).
Rik <rik@octave.org>
parents: 26138
diff changeset
295 printf ("f(x0) = %9.4e\n", dirn * f(1));
14895
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
296 endif
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
297
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
298 k = 0; m = 0;
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
299
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
300 ## Set up initial simplex.
23113
9241a0fa7873 Additional output arguments for fminsearch (bug #44220).
Markus Muetzel <markus.muetzel@gmx.de>
parents: 23085
diff changeset
301 scale = max (norm (x0, Inf), 1);
14895
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
302 if (stopit(4) == 0)
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
303 ## Regular simplex - all edges have same length.
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
304 ## 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
305 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
306 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
307 for j = 2:n+1
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
308 V(j-1,j) = x0(j-1) + alpha(1);
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
309 x(:) = V(:,j);
27584
2ab2e289cf84 fminsearch.m: Use only real part of objective function for Matlab compatibility (bug #57136).
Rik <rik@octave.org>
parents: 27389
diff changeset
310 f(j) = dirn * fun (x);
14895
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
311 endfor
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
312 else
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
313 ## Right-angled simplex based on co-ordinate axes.
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
314 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
315 for j = 2:n+1
14895
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
316 V(:,j) = x0 + alpha(j)*V(:,j);
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
317 x(:) = V(:,j);
27584
2ab2e289cf84 fminsearch.m: Use only real part of objective function for Matlab compatibility (bug #57136).
Rik <rik@octave.org>
parents: 27389
diff changeset
318 f(j) = dirn * fun (x);
14895
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
319 endfor
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
320 endif
23113
9241a0fa7873 Additional output arguments for fminsearch (bug #44220).
Markus Muetzel <markus.muetzel@gmx.de>
parents: 23085
diff changeset
321 nf += n;
14895
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
322 how = "initial ";
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
323
23113
9241a0fa7873 Additional output arguments for fminsearch (bug #44220).
Markus Muetzel <markus.muetzel@gmx.de>
parents: 23085
diff changeset
324 [~, j] = sort (f);
14895
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
325 j = j(n+1:-1:1);
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
326 f = f(j);
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
327 V = V(:,j);
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
328
23113
9241a0fa7873 Additional output arguments for fminsearch (bug #44220).
Markus Muetzel <markus.muetzel@gmx.de>
parents: 23085
diff changeset
329 exitflag = 0;
9241a0fa7873 Additional output arguments for fminsearch (bug #44220).
Markus Muetzel <markus.muetzel@gmx.de>
parents: 23085
diff changeset
330
9241a0fa7873 Additional output arguments for fminsearch (bug #44220).
Markus Muetzel <markus.muetzel@gmx.de>
parents: 23085
diff changeset
331 if (! isempty (outfcn))
9241a0fa7873 Additional output arguments for fminsearch (bug #44220).
Markus Muetzel <markus.muetzel@gmx.de>
parents: 23085
diff changeset
332 optimvalues.iteration = 0;
9241a0fa7873 Additional output arguments for fminsearch (bug #44220).
Markus Muetzel <markus.muetzel@gmx.de>
parents: 23085
diff changeset
333 optimvalues.funccount = nf;
26280
da54f14258e1 fminsearch.m: Fix sign of results for intermediate reporting (bug #55261).
Rik <rik@octave.org>
parents: 26138
diff changeset
334 optimvalues.fval = dirn * f(1);
23113
9241a0fa7873 Additional output arguments for fminsearch (bug #44220).
Markus Muetzel <markus.muetzel@gmx.de>
parents: 23085
diff changeset
335 optimvalues.procedure = how;
9241a0fa7873 Additional output arguments for fminsearch (bug #44220).
Markus Muetzel <markus.muetzel@gmx.de>
parents: 23085
diff changeset
336 state = "init";
9241a0fa7873 Additional output arguments for fminsearch (bug #44220).
Markus Muetzel <markus.muetzel@gmx.de>
parents: 23085
diff changeset
337 stop = outfcn (x, optimvalues, state);
9241a0fa7873 Additional output arguments for fminsearch (bug #44220).
Markus Muetzel <markus.muetzel@gmx.de>
parents: 23085
diff changeset
338 if (stop)
9241a0fa7873 Additional output arguments for fminsearch (bug #44220).
Markus Muetzel <markus.muetzel@gmx.de>
parents: 23085
diff changeset
339 msg = "Stopped by OutputFcn\n";
9241a0fa7873 Additional output arguments for fminsearch (bug #44220).
Markus Muetzel <markus.muetzel@gmx.de>
parents: 23085
diff changeset
340 exitflag = -1;
9241a0fa7873 Additional output arguments for fminsearch (bug #44220).
Markus Muetzel <markus.muetzel@gmx.de>
parents: 23085
diff changeset
341 endif
9241a0fa7873 Additional output arguments for fminsearch (bug #44220).
Markus Muetzel <markus.muetzel@gmx.de>
parents: 23085
diff changeset
342 endif
9241a0fa7873 Additional output arguments for fminsearch (bug #44220).
Markus Muetzel <markus.muetzel@gmx.de>
parents: 23085
diff changeset
343
14895
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
344 alpha = 1; beta = 1/2; gamma = 2;
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
345
23113
9241a0fa7873 Additional output arguments for fminsearch (bug #44220).
Markus Muetzel <markus.muetzel@gmx.de>
parents: 23085
diff changeset
346 while (exitflag != -1) # Outer (and only) loop.
20735
418ae0cb752f Replace ++,-- with in-place operators for performance.
Rik <rik@octave.org>
parents: 20713
diff changeset
347 k += 1;
14895
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
348
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
349 if (k > maxiter)
25739
8eec0403a370 fminsearch.m: Update default TolFun to 1e-4 for Matlab compatibility.
Rik <rik@octave.org>
parents: 25231
diff changeset
350 msg = "Exceeded maximum iterations\n";
14895
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
351 break;
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
352 endif
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
353
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
354 fmax = f(1);
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
355 if (fmax > fmax_old)
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
356 if (! isempty (savit))
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
357 x(:) = V(:,1);
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
358 eval (["save " savit " x fmax nf"]);
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
359 endif
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
360 endif
23113
9241a0fa7873 Additional output arguments for fminsearch (bug #44220).
Markus Muetzel <markus.muetzel@gmx.de>
parents: 23085
diff changeset
361 if (trace == 1)
9241a0fa7873 Additional output arguments for fminsearch (bug #44220).
Markus Muetzel <markus.muetzel@gmx.de>
parents: 23085
diff changeset
362 printf ("Iter. %2.0f,", k);
9241a0fa7873 Additional output arguments for fminsearch (bug #44220).
Markus Muetzel <markus.muetzel@gmx.de>
parents: 23085
diff changeset
363 printf (" how = %-11s", [how ","]);
26280
da54f14258e1 fminsearch.m: Fix sign of results for intermediate reporting (bug #55261).
Rik <rik@octave.org>
parents: 26138
diff changeset
364 printf ("nf = %3.0f, f = %9.4e (%2.1f%%)\n", nf, dirn * fmax, ...
23113
9241a0fa7873 Additional output arguments for fminsearch (bug #44220).
Markus Muetzel <markus.muetzel@gmx.de>
parents: 23085
diff changeset
365 100*(fmax-fmax_old)/(abs(fmax_old)+eps));
14895
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
366 endif
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
367 fmax_old = fmax;
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
368
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
369 ## Three stopping tests from MDSMAX.M
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
370
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
371 ## Stopping Test 1 - f reached target value?
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
372 if (fmax >= stopit(3))
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
373 msg = "Exceeded target...quitting\n";
25739
8eec0403a370 fminsearch.m: Update default TolFun to 1e-4 for Matlab compatibility.
Rik <rik@octave.org>
parents: 25231
diff changeset
374 ## FIXME: Add documentation when stopit(3) gets exposed to the outside
23113
9241a0fa7873 Additional output arguments for fminsearch (bug #44220).
Markus Muetzel <markus.muetzel@gmx.de>
parents: 23085
diff changeset
375 exitflag = -1;
14895
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
376 break;
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
377 endif
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
378
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
379 ## Stopping Test 2 - too many f-evals?
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
380 if (nf >= stopit(2))
25739
8eec0403a370 fminsearch.m: Update default TolFun to 1e-4 for Matlab compatibility.
Rik <rik@octave.org>
parents: 25231
diff changeset
381 msg = "Exceeded maximum number of function evaluations\n";
8eec0403a370 fminsearch.m: Update default TolFun to 1e-4 for Matlab compatibility.
Rik <rik@octave.org>
parents: 25231
diff changeset
382 exitflag = 0;
14895
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
383 break;
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
23113
9241a0fa7873 Additional output arguments for fminsearch (bug #44220).
Markus Muetzel <markus.muetzel@gmx.de>
parents: 23085
diff changeset
386 ## 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
387 v1 = V(:,1);
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
388 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
389 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
390 if (size_simplex <= tol && step_f <= tol_f )
25739
8eec0403a370 fminsearch.m: Update default TolFun to 1e-4 for Matlab compatibility.
Rik <rik@octave.org>
parents: 25231
diff changeset
391 msg = sprintf (["Algorithm converged. Simplex size %9.4e <= %9.4e ", ...
8eec0403a370 fminsearch.m: Update default TolFun to 1e-4 for Matlab compatibility.
Rik <rik@octave.org>
parents: 25231
diff changeset
392 "and step in function value %9.4e <= %9.4e\n"], ...
23113
9241a0fa7873 Additional output arguments for fminsearch (bug #44220).
Markus Muetzel <markus.muetzel@gmx.de>
parents: 23085
diff changeset
393 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
394 exitflag = 1;
14895
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
395 break;
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
396 endif
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
397
23113
9241a0fa7873 Additional output arguments for fminsearch (bug #44220).
Markus Muetzel <markus.muetzel@gmx.de>
parents: 23085
diff changeset
398 ## Call OutputFcn
9241a0fa7873 Additional output arguments for fminsearch (bug #44220).
Markus Muetzel <markus.muetzel@gmx.de>
parents: 23085
diff changeset
399 if (! isempty (outfcn))
9241a0fa7873 Additional output arguments for fminsearch (bug #44220).
Markus Muetzel <markus.muetzel@gmx.de>
parents: 23085
diff changeset
400 optimvalues.funccount = nf;
26280
da54f14258e1 fminsearch.m: Fix sign of results for intermediate reporting (bug #55261).
Rik <rik@octave.org>
parents: 26138
diff changeset
401 optimvalues.fval = dirn * f(1);
23113
9241a0fa7873 Additional output arguments for fminsearch (bug #44220).
Markus Muetzel <markus.muetzel@gmx.de>
parents: 23085
diff changeset
402 optimvalues.iteration = k;
9241a0fa7873 Additional output arguments for fminsearch (bug #44220).
Markus Muetzel <markus.muetzel@gmx.de>
parents: 23085
diff changeset
403 optimvalues.procedure = how;
9241a0fa7873 Additional output arguments for fminsearch (bug #44220).
Markus Muetzel <markus.muetzel@gmx.de>
parents: 23085
diff changeset
404 state = "iter";
9241a0fa7873 Additional output arguments for fminsearch (bug #44220).
Markus Muetzel <markus.muetzel@gmx.de>
parents: 23085
diff changeset
405 stop = outfcn (x, optimvalues, state);
9241a0fa7873 Additional output arguments for fminsearch (bug #44220).
Markus Muetzel <markus.muetzel@gmx.de>
parents: 23085
diff changeset
406 if (stop)
9241a0fa7873 Additional output arguments for fminsearch (bug #44220).
Markus Muetzel <markus.muetzel@gmx.de>
parents: 23085
diff changeset
407 msg = "Stopped by OutputFcn\n";
9241a0fa7873 Additional output arguments for fminsearch (bug #44220).
Markus Muetzel <markus.muetzel@gmx.de>
parents: 23085
diff changeset
408 exitflag = -1;
9241a0fa7873 Additional output arguments for fminsearch (bug #44220).
Markus Muetzel <markus.muetzel@gmx.de>
parents: 23085
diff changeset
409 break;
9241a0fa7873 Additional output arguments for fminsearch (bug #44220).
Markus Muetzel <markus.muetzel@gmx.de>
parents: 23085
diff changeset
410 endif
9241a0fa7873 Additional output arguments for fminsearch (bug #44220).
Markus Muetzel <markus.muetzel@gmx.de>
parents: 23085
diff changeset
411 endif
9241a0fa7873 Additional output arguments for fminsearch (bug #44220).
Markus Muetzel <markus.muetzel@gmx.de>
parents: 23085
diff changeset
412
14895
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
413 ## One step of the Nelder-Mead simplex algorithm
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
414 ## 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
415 ## 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
416 ## and re-ordered function values after sort.
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
417
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
418 vbar = (sum (V(:,1:n)')/n)'; # Mean value
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
419 vr = (1 + alpha)*vbar - alpha*V(:,n+1);
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
420 x(:) = vr;
27584
2ab2e289cf84 fminsearch.m: Use only real part of objective function for Matlab compatibility (bug #57136).
Rik <rik@octave.org>
parents: 27389
diff changeset
421 fr = dirn * fun (x);
20231
83792dd9bcc1 Use in-place operators in m-files where possible.
Rik <rik@octave.org>
parents: 20165
diff changeset
422 nf += 1;
23113
9241a0fa7873 Additional output arguments for fminsearch (bug #44220).
Markus Muetzel <markus.muetzel@gmx.de>
parents: 23085
diff changeset
423 vk = vr; fk = fr; how = "reflect";
14895
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
424 if (fr > f(n))
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
425 if (fr > f(1))
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
426 ve = gamma*vr + (1-gamma)*vbar;
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
427 x(:) = ve;
27584
2ab2e289cf84 fminsearch.m: Use only real part of objective function for Matlab compatibility (bug #57136).
Rik <rik@octave.org>
parents: 27389
diff changeset
428 fe = dirn * fun (x);
20231
83792dd9bcc1 Use in-place operators in m-files where possible.
Rik <rik@octave.org>
parents: 20165
diff changeset
429 nf += 1;
14895
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
430 if (fe > f(1))
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
431 vk = ve;
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
432 fk = fe;
23113
9241a0fa7873 Additional output arguments for fminsearch (bug #44220).
Markus Muetzel <markus.muetzel@gmx.de>
parents: 23085
diff changeset
433 how = "expand";
14895
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
434 endif
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
435 endif
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
436 else
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
437 vt = V(:,n+1);
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
438 ft = f(n+1);
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
439 if (fr > ft)
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
440 vt = vr;
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
441 ft = fr;
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
442 endif
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
443 vc = beta*vt + (1-beta)*vbar;
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
444 x(:) = vc;
27584
2ab2e289cf84 fminsearch.m: Use only real part of objective function for Matlab compatibility (bug #57136).
Rik <rik@octave.org>
parents: 27389
diff changeset
445 fc = dirn * fun (x);
20231
83792dd9bcc1 Use in-place operators in m-files where possible.
Rik <rik@octave.org>
parents: 20165
diff changeset
446 nf += 1;
14895
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
447 if (fc > f(n))
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
448 vk = vc; fk = fc;
23113
9241a0fa7873 Additional output arguments for fminsearch (bug #44220).
Markus Muetzel <markus.muetzel@gmx.de>
parents: 23085
diff changeset
449 how = "contract";
14895
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
450 else
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
451 for j = 2:n
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
452 V(:,j) = (V(:,1) + V(:,j))/2;
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
453 x(:) = V(:,j);
27584
2ab2e289cf84 fminsearch.m: Use only real part of objective function for Matlab compatibility (bug #57136).
Rik <rik@octave.org>
parents: 27389
diff changeset
454 f(j) = dirn * fun (x);
14895
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
455 endfor
20231
83792dd9bcc1 Use in-place operators in m-files where possible.
Rik <rik@octave.org>
parents: 20165
diff changeset
456 nf += n-1;
14895
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
457 vk = (V(:,1) + V(:,n+1))/2;
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
458 x(:) = vk;
27584
2ab2e289cf84 fminsearch.m: Use only real part of objective function for Matlab compatibility (bug #57136).
Rik <rik@octave.org>
parents: 27389
diff changeset
459 fk = dirn * fun (x);
20231
83792dd9bcc1 Use in-place operators in m-files where possible.
Rik <rik@octave.org>
parents: 20165
diff changeset
460 nf += 1;
23113
9241a0fa7873 Additional output arguments for fminsearch (bug #44220).
Markus Muetzel <markus.muetzel@gmx.de>
parents: 23085
diff changeset
461 how = "shrink";
14895
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
462 endif
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
463 endif
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
464 V(:,n+1) = vk;
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
465 f(n+1) = fk;
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
466 [~,j] = sort(f);
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
467 j = j(n+1:-1:1);
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
468 f = f(j);
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
469 V = V(:,j);
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
470
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
471 endwhile # End of outer (and only) loop.
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
472
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
473 ## Finished.
23113
9241a0fa7873 Additional output arguments for fminsearch (bug #44220).
Markus Muetzel <markus.muetzel@gmx.de>
parents: 23085
diff changeset
474 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
475 printf (msg);
14895
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
476 endif
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
477 x(:) = V(:,1);
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
478
23113
9241a0fa7873 Additional output arguments for fminsearch (bug #44220).
Markus Muetzel <markus.muetzel@gmx.de>
parents: 23085
diff changeset
479 ## 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
480 ## 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
481 if (! isempty (outfcn))
9241a0fa7873 Additional output arguments for fminsearch (bug #44220).
Markus Muetzel <markus.muetzel@gmx.de>
parents: 23085
diff changeset
482 optimvalues.funccount = nf;
26280
da54f14258e1 fminsearch.m: Fix sign of results for intermediate reporting (bug #55261).
Rik <rik@octave.org>
parents: 26138
diff changeset
483 optimvalues.fval = dirn * f(1);
23113
9241a0fa7873 Additional output arguments for fminsearch (bug #44220).
Markus Muetzel <markus.muetzel@gmx.de>
parents: 23085
diff changeset
484 optimvalues.iteration = k;
9241a0fa7873 Additional output arguments for fminsearch (bug #44220).
Markus Muetzel <markus.muetzel@gmx.de>
parents: 23085
diff changeset
485 optimvalues.procedure = how;
9241a0fa7873 Additional output arguments for fminsearch (bug #44220).
Markus Muetzel <markus.muetzel@gmx.de>
parents: 23085
diff changeset
486 state = "done";
9241a0fa7873 Additional output arguments for fminsearch (bug #44220).
Markus Muetzel <markus.muetzel@gmx.de>
parents: 23085
diff changeset
487 outfcn (x, optimvalues, state);
9241a0fa7873 Additional output arguments for fminsearch (bug #44220).
Markus Muetzel <markus.muetzel@gmx.de>
parents: 23085
diff changeset
488 endif
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 ## output
9241a0fa7873 Additional output arguments for fminsearch (bug #44220).
Markus Muetzel <markus.muetzel@gmx.de>
parents: 23085
diff changeset
491 output.iterations = k;
9241a0fa7873 Additional output arguments for fminsearch (bug #44220).
Markus Muetzel <markus.muetzel@gmx.de>
parents: 23085
diff changeset
492 output.funcCount = nf;
9241a0fa7873 Additional output arguments for fminsearch (bug #44220).
Markus Muetzel <markus.muetzel@gmx.de>
parents: 23085
diff changeset
493 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
494 output.message = msg;
9241a0fa7873 Additional output arguments for fminsearch (bug #44220).
Markus Muetzel <markus.muetzel@gmx.de>
parents: 23085
diff changeset
495
14895
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
496 endfunction
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
497
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
498 ## A helper function that evaluates a function and checks for bad results.
27584
2ab2e289cf84 fminsearch.m: Use only real part of objective function for Matlab compatibility (bug #57136).
Rik <rik@octave.org>
parents: 27389
diff changeset
499 function y = guarded_eval (fun, x, varargin)
14895
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
500
27584
2ab2e289cf84 fminsearch.m: Use only real part of objective function for Matlab compatibility (bug #57136).
Rik <rik@octave.org>
parents: 27389
diff changeset
501 y = fun (x, varargin{:});
14895
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
502
22962
fba8a6c742c6 fminsearch.m: Fix error in "guarded_eval".
Markus Muetzel <markus.muetzel@gmx.de>
parents: 22323
diff changeset
503 if (! (isreal (y)))
14895
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
504 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
505 elseif (any (isnan (y(:))))
14895
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
506 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
507 elseif (any (isinf (y(:))))
14895
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
508 error ("fminsearch:isinf", "fminsearch: Inf value encountered");
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
509 endif
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
510
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
511 endfunction
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
512
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
513
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
514 %!demo
23113
9241a0fa7873 Additional output arguments for fminsearch (bug #44220).
Markus Muetzel <markus.muetzel@gmx.de>
parents: 23085
diff changeset
515 %! clf;
9241a0fa7873 Additional output arguments for fminsearch (bug #44220).
Markus Muetzel <markus.muetzel@gmx.de>
parents: 23085
diff changeset
516 %! hold on;
9241a0fa7873 Additional output arguments for fminsearch (bug #44220).
Markus Muetzel <markus.muetzel@gmx.de>
parents: 23085
diff changeset
517 %! 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
518 %! 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
519 %! x0 = [0;0];
23113
9241a0fa7873 Additional output arguments for fminsearch (bug #44220).
Markus Muetzel <markus.muetzel@gmx.de>
parents: 23085
diff changeset
520 %! [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
521 %! hold off;
14895
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
522
22962
fba8a6c742c6 fminsearch.m: Fix error in "guarded_eval".
Markus Muetzel <markus.muetzel@gmx.de>
parents: 22323
diff changeset
523 %!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
524
25231
e1024058833c test: change remaining %!xtests into %!tests
Mike Miller <mtmiller@octave.org>
parents: 25054
diff changeset
525 ## FIXME: The following test is for checking that fminsearch stops earlier
e1024058833c test: change remaining %!xtests into %!tests
Mike Miller <mtmiller@octave.org>
parents: 25054
diff changeset
526 ## with these settings. If the optimizer algorithm is changed, it
e1024058833c test: change remaining %!xtests into %!tests
Mike Miller <mtmiller@octave.org>
parents: 25054
diff changeset
527 ## may fail. Just adapt the values to make it pass again.
e1024058833c test: change remaining %!xtests into %!tests
Mike Miller <mtmiller@octave.org>
parents: 25054
diff changeset
528 %!test
23113
9241a0fa7873 Additional output arguments for fminsearch (bug #44220).
Markus Muetzel <markus.muetzel@gmx.de>
parents: 23085
diff changeset
529 %! 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
530 %! assert (x, 4.8750, 1e-4);
9241a0fa7873 Additional output arguments for fminsearch (bug #44220).
Markus Muetzel <markus.muetzel@gmx.de>
parents: 23085
diff changeset
531 %! 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
532 %! assert (x, 4.7109, 1e-4);
9241a0fa7873 Additional output arguments for fminsearch (bug #44220).
Markus Muetzel <markus.muetzel@gmx.de>
parents: 23085
diff changeset
533
22962
fba8a6c742c6 fminsearch.m: Fix error in "guarded_eval".
Markus Muetzel <markus.muetzel@gmx.de>
parents: 22323
diff changeset
534 %!test
25930
a00379f6f8c4 * fminsearch.m: Accept problem structure for Matlab compatibility.
John W. Eaton <jwe@octave.org>
parents: 25828
diff changeset
535 %! problem.objective = @sin;
a00379f6f8c4 * fminsearch.m: Accept problem structure for Matlab compatibility.
John W. Eaton <jwe@octave.org>
parents: 25828
diff changeset
536 %! problem.x0 = 3;
a00379f6f8c4 * fminsearch.m: Accept problem structure for Matlab compatibility.
John W. Eaton <jwe@octave.org>
parents: 25828
diff changeset
537 %! problem.solver = "fminsearch";
25936
7fa5ee67094a * fminsearch.m: Suppress output in test.
John W. Eaton <jwe@octave.org>
parents: 25930
diff changeset
538 %! problem.options = optimset ("MaxIter", 3, "Display", "none");
25930
a00379f6f8c4 * fminsearch.m: Accept problem structure for Matlab compatibility.
John W. Eaton <jwe@octave.org>
parents: 25828
diff changeset
539 %! x = fminsearch (problem);
a00379f6f8c4 * fminsearch.m: Accept problem structure for Matlab compatibility.
John W. Eaton <jwe@octave.org>
parents: 25828
diff changeset
540 %! assert (x, 4.8750, 1e-4);
25936
7fa5ee67094a * fminsearch.m: Suppress output in test.
John W. Eaton <jwe@octave.org>
parents: 25930
diff changeset
541 %! problem.options = optimset ("MaxFunEvals", 18, "Display", "none");
25930
a00379f6f8c4 * fminsearch.m: Accept problem structure for Matlab compatibility.
John W. Eaton <jwe@octave.org>
parents: 25828
diff changeset
542 %! x = fminsearch (problem);
a00379f6f8c4 * fminsearch.m: Accept problem structure for Matlab compatibility.
John W. Eaton <jwe@octave.org>
parents: 25828
diff changeset
543 %! assert (x, 4.7109, 1e-4);
a00379f6f8c4 * fminsearch.m: Accept problem structure for Matlab compatibility.
John W. Eaton <jwe@octave.org>
parents: 25828
diff changeset
544
a00379f6f8c4 * fminsearch.m: Accept problem structure for Matlab compatibility.
John W. Eaton <jwe@octave.org>
parents: 25828
diff changeset
545 %!test
14895
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
546 %! c = 1.5;
23113
9241a0fa7873 Additional output arguments for fminsearch (bug #44220).
Markus Muetzel <markus.muetzel@gmx.de>
parents: 23085
diff changeset
547 %! 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
548
23113
9241a0fa7873 Additional output arguments for fminsearch (bug #44220).
Markus Muetzel <markus.muetzel@gmx.de>
parents: 23085
diff changeset
549 ## 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
550 %!test
3c896180df16 Pass additional arguments for fminsearch to called function (bug #41888).
Markus Muetzel <markus.muetzel@gmx.de>
parents: 22963
diff changeset
551 %! 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
552 %! 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
553 %! 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
554 %! 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
555 %! 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
556
23113
9241a0fa7873 Additional output arguments for fminsearch (bug #44220).
Markus Muetzel <markus.muetzel@gmx.de>
parents: 23085
diff changeset
557 ## all output arguments
9241a0fa7873 Additional output arguments for fminsearch (bug #44220).
Markus Muetzel <markus.muetzel@gmx.de>
parents: 23085
diff changeset
558 %!test
9241a0fa7873 Additional output arguments for fminsearch (bug #44220).
Markus Muetzel <markus.muetzel@gmx.de>
parents: 23085
diff changeset
559 %! 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
560 %! [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
561 %! 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
562 %! assert (fval, -1, options.TolFun);
9241a0fa7873 Additional output arguments for fminsearch (bug #44220).
Markus Muetzel <markus.muetzel@gmx.de>
parents: 23085
diff changeset
563 %! assert (exitflag, 1);
9241a0fa7873 Additional output arguments for fminsearch (bug #44220).
Markus Muetzel <markus.muetzel@gmx.de>
parents: 23085
diff changeset
564 %! assert (isstruct (output));
9241a0fa7873 Additional output arguments for fminsearch (bug #44220).
Markus Muetzel <markus.muetzel@gmx.de>
parents: 23085
diff changeset
565 %! 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
566 %! && isscalar (output.iterations) && output.iterations > 0);
9241a0fa7873 Additional output arguments for fminsearch (bug #44220).
Markus Muetzel <markus.muetzel@gmx.de>
parents: 23085
diff changeset
567 %! 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
568 %! && isscalar (output.funcCount) && output.funcCount > 0);
9241a0fa7873 Additional output arguments for fminsearch (bug #44220).
Markus Muetzel <markus.muetzel@gmx.de>
parents: 23085
diff changeset
569 %! 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
570 %! assert (isfield (output, "message") && ischar (output.message));
14895
e0525ecf156e Add new function fminsearch.m
Andy Adler <andy@analyti.ca>
parents:
diff changeset
571
22962
fba8a6c742c6 fminsearch.m: Fix error in "guarded_eval".
Markus Muetzel <markus.muetzel@gmx.de>
parents: 22323
diff changeset
572 ## Tests for guarded_eval
fba8a6c742c6 fminsearch.m: Fix error in "guarded_eval".
Markus Muetzel <markus.muetzel@gmx.de>
parents: 22323
diff changeset
573 %!error <non-real value encountered>
fba8a6c742c6 fminsearch.m: Fix error in "guarded_eval".
Markus Muetzel <markus.muetzel@gmx.de>
parents: 22323
diff changeset
574 %! 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
575 %!error <NaN value encountered>
fba8a6c742c6 fminsearch.m: Fix error in "guarded_eval".
Markus Muetzel <markus.muetzel@gmx.de>
parents: 22323
diff changeset
576 %! 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
577 %!error <Inf value encountered>
fba8a6c742c6 fminsearch.m: Fix error in "guarded_eval".
Markus Muetzel <markus.muetzel@gmx.de>
parents: 22323
diff changeset
578 %! 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
579
9241a0fa7873 Additional output arguments for fminsearch (bug #44220).
Markus Muetzel <markus.muetzel@gmx.de>
parents: 23085
diff changeset
580 ## Test input validation
28896
90fea9cc9caa test: Add expected error message <Invalid call> to BIST tests for nargin.
Rik <rik@octave.org>
parents: 27923
diff changeset
581 %!error <Invalid call> fminsearch ()
23113
9241a0fa7873 Additional output arguments for fminsearch (bug #44220).
Markus Muetzel <markus.muetzel@gmx.de>
parents: 23085
diff changeset
582 %!error fminsearch (1)