Mercurial > hg > camir-aes2014
comparison toolboxes/FullBNT-1.0.7/netlab3.3/linemin.m @ 0:e9a9cd732c1e tip
first hg version after svn
author | wolffd |
---|---|
date | Tue, 10 Feb 2015 15:05:51 +0000 |
parents | |
children |
comparison
equal
deleted
inserted
replaced
-1:000000000000 | 0:e9a9cd732c1e |
---|---|
1 function [x, options] = linemin(f, pt, dir, fpt, options, ... | |
2 varargin) | |
3 %LINEMIN One dimensional minimization. | |
4 % | |
5 % Description | |
6 % [X, OPTIONS] = LINEMIN(F, PT, DIR, FPT, OPTIONS) uses Brent's | |
7 % algorithm to find the minimum of the function F(X) along the line DIR | |
8 % through the point PT. The function value at the starting point is | |
9 % FPT. The point at which F has a local minimum is returned as X. The | |
10 % function value at that point is returned in OPTIONS(8). | |
11 % | |
12 % LINEMIN(F, PT, DIR, FPT, OPTIONS, P1, P2, ...) allows additional | |
13 % arguments to be passed to F(). | |
14 % | |
15 % The optional parameters have the following interpretations. | |
16 % | |
17 % OPTIONS(1) is set to 1 to display error values. | |
18 % | |
19 % OPTIONS(2) is a measure of the absolute precision required for the | |
20 % value of X at the solution. | |
21 % | |
22 % OPTIONS(3) is a measure of the precision required of the objective | |
23 % function at the solution. Both this and the previous condition must | |
24 % be satisfied for termination. | |
25 % | |
26 % OPTIONS(14) is the maximum number of iterations; default 100. | |
27 % | |
28 % See also | |
29 % CONJGRAD, MINBRACK, QUASINEW | |
30 % | |
31 | |
32 % Copyright (c) Ian T Nabney (1996-2001) | |
33 | |
34 % Set up the options. | |
35 if(options(14)) | |
36 niters = options(14); | |
37 else | |
38 niters = 100; | |
39 end | |
40 options(10) = 0; % Initialise count of function evaluations | |
41 | |
42 display = options(1); | |
43 | |
44 % Check function string | |
45 f = fcnchk(f, length(varargin)); | |
46 | |
47 % Value of golden section (1 + sqrt(5))/2.0 | |
48 phi = 1.6180339887499; | |
49 cphi = 1 - 1/phi; | |
50 TOL = sqrt(eps); % Maximal fractional precision | |
51 TINY = 1.0e-10; % Can't use fractional precision when minimum is at 0 | |
52 | |
53 % Bracket the minimum | |
54 [br_min, br_mid, br_max, num_evals] = feval('minbrack', 'linef', ... | |
55 0.0, 1.0, fpt, f, pt, dir, varargin{:}); | |
56 options(10) = options(10) + num_evals; % Increment number of fn. evals | |
57 % No gradient evals in minbrack | |
58 | |
59 % Use Brent's algorithm to find minimum | |
60 % Initialise the points and function values | |
61 w = br_mid; % Where second from minimum is | |
62 v = br_mid; % Previous value of w | |
63 x = v; % Where current minimum is | |
64 e = 0.0; % Distance moved on step before last | |
65 fx = feval('linef', x, f, pt, dir, varargin{:}); | |
66 options(10) = options(10) + 1; | |
67 fv = fx; fw = fx; | |
68 | |
69 for n = 1:niters | |
70 xm = 0.5.*(br_min+br_max); % Middle of bracket | |
71 % Make sure that tolerance is big enough | |
72 tol1 = TOL * (max(abs(x))) + TINY; | |
73 % Decide termination on absolute precision required by options(2) | |
74 if (max(abs(x - xm)) <= options(2) & br_max-br_min < 4*options(2)) | |
75 options(8) = fx; | |
76 return; | |
77 end | |
78 % Check if step before last was big enough to try a parabolic step. | |
79 % Note that this will fail on first iteration, which must be a golden | |
80 % section step. | |
81 if (max(abs(e)) > tol1) | |
82 % Construct a trial parabolic fit through x, v and w | |
83 r = (fx - fv) .* (x - w); | |
84 q = (fx - fw) .* (x - v); | |
85 p = (x - v).*q - (x - w).*r; | |
86 q = 2.0 .* (q - r); | |
87 if (q > 0.0) p = -p; end | |
88 q = abs(q); | |
89 % Test if the parabolic fit is OK | |
90 if (abs(p) >= abs(0.5*q*e) | p <= q*(br_min-x) | p >= q*(br_max-x)) | |
91 % No it isn't, so take a golden section step | |
92 if (x >= xm) | |
93 e = br_min-x; | |
94 else | |
95 e = br_max-x; | |
96 end | |
97 d = cphi*e; | |
98 else | |
99 % Yes it is, so take the parabolic step | |
100 e = d; | |
101 d = p/q; | |
102 u = x+d; | |
103 if (u-br_min < 2*tol1 | br_max-u < 2*tol1) | |
104 d = sign(xm-x)*tol1; | |
105 end | |
106 end | |
107 else | |
108 % Step before last not big enough, so take a golden section step | |
109 if (x >= xm) | |
110 e = br_min - x; | |
111 else | |
112 e = br_max - x; | |
113 end | |
114 d = cphi*e; | |
115 end | |
116 % Make sure that step is big enough | |
117 if (abs(d) >= tol1) | |
118 u = x+d; | |
119 else | |
120 u = x + sign(d)*tol1; | |
121 end | |
122 % Evaluate function at u | |
123 fu = feval('linef', u, f, pt, dir, varargin{:}); | |
124 options(10) = options(10) + 1; | |
125 % Reorganise bracket | |
126 if (fu <= fx) | |
127 if (u >= x) | |
128 br_min = x; | |
129 else | |
130 br_max = x; | |
131 end | |
132 v = w; w = x; x = u; | |
133 fv = fw; fw = fx; fx = fu; | |
134 else | |
135 if (u < x) | |
136 br_min = u; | |
137 else | |
138 br_max = u; | |
139 end | |
140 if (fu <= fw | w == x) | |
141 v = w; w = u; | |
142 fv = fw; fw = fu; | |
143 elseif (fu <= fv | v == x | v == w) | |
144 v = u; | |
145 fv = fu; | |
146 end | |
147 end | |
148 if (display == 1) | |
149 fprintf(1, 'Cycle %4d Error %11.6f\n', n, fx); | |
150 end | |
151 end | |
152 options(8) = fx; |