257 lines
14 KiB
HTML
257 lines
14 KiB
HTML
|
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
|
||
|
"http://www.w3.org/TR/REC-html40/loose.dtd">
|
||
|
<html>
|
||
|
<head>
|
||
|
<title>Description of csminit</title>
|
||
|
<meta name="keywords" content="csminit">
|
||
|
<meta name="description" content="[fhat,xhat,fcount,retcode] = csminit(fcn,x0,f0,g0,badg,H0,...">
|
||
|
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
|
||
|
<meta name="generator" content="m2html © 2003 Guillaume Flandin">
|
||
|
<meta name="robots" content="index, follow">
|
||
|
<link type="text/css" rel="stylesheet" href="../m2html.css">
|
||
|
</head>
|
||
|
<body>
|
||
|
<a name="_top"></a>
|
||
|
<div><a href="../index.html">Home</a> > <a href="index.html">.</a> > csminit.m</div>
|
||
|
|
||
|
<!--<table width="100%"><tr><td align="left"><a href="../index.html"><img alt="<" border="0" src="../left.png"> Master index</a></td>
|
||
|
<td align="right"><a href="index.html">Index for . <img alt=">" border="0" src="../right.png"></a></td></tr></table>-->
|
||
|
|
||
|
<h1>csminit
|
||
|
</h1>
|
||
|
|
||
|
<h2><a name="_name"></a>PURPOSE <a href="#_top"><img alt="^" border="0" src="../up.png"></a></h2>
|
||
|
<div class="box"><strong>[fhat,xhat,fcount,retcode] = csminit(fcn,x0,f0,g0,badg,H0,...</strong></div>
|
||
|
|
||
|
<h2><a name="_synopsis"></a>SYNOPSIS <a href="#_top"><img alt="^" border="0" src="../up.png"></a></h2>
|
||
|
<div class="box"><strong>function [fhat,xhat,fcount,retcode] = csminit(fcn,x0,f0,g0,badg,H0,varargin) </strong></div>
|
||
|
|
||
|
<h2><a name="_description"></a>DESCRIPTION <a href="#_top"><img alt="^" border="0" src="../up.png"></a></h2>
|
||
|
<div class="fragment"><pre class="comment"> [fhat,xhat,fcount,retcode] = csminit(fcn,x0,f0,g0,badg,H0,...
|
||
|
P1,P2,P3,P4,P5,P6,P7,P8)
|
||
|
retcodes: 0, normal step. 5, largest step still improves too fast.
|
||
|
4,2 back and forth adjustment of stepsize didn't finish. 3, smallest
|
||
|
stepsize still improves too slow. 6, no improvement found. 1, zero
|
||
|
gradient.
|
||
|
---------------------
|
||
|
Modified 7/22/96 to omit variable-length P list, for efficiency and compilation.
|
||
|
Places where the number of P's need to be altered or the code could be returned to
|
||
|
its old form are marked with ARGLIST comments.
|
||
|
|
||
|
Fixed 7/17/93 to use inverse-hessian instead of hessian itself in bfgs
|
||
|
update.
|
||
|
|
||
|
Fixed 7/19/93 to flip eigenvalues of H to get better performance when
|
||
|
it's not psd.
|
||
|
|
||
|
tailstr = ')';
|
||
|
for i=nargin-6:-1:1
|
||
|
tailstr=[ ',P' num2str(i) tailstr];
|
||
|
end
|
||
|
ANGLE = .03;</pre></div>
|
||
|
|
||
|
<!-- crossreference -->
|
||
|
<h2><a name="_cross"></a>CROSS-REFERENCE INFORMATION <a href="#_top"><img alt="^" border="0" src="../up.png"></a></h2>
|
||
|
This function calls:
|
||
|
<ul style="list-style-image:url(../matlabicon.gif)">
|
||
|
</ul>
|
||
|
This function is called by:
|
||
|
<ul style="list-style-image:url(../matlabicon.gif)">
|
||
|
<li><a href="csminwel.html" class="code" title="function [fh,xh,gh,H,itct,fcount,retcodeh] = csminwel(fcn,x0,H0,grad,crit,nit,varargin)">csminwel</a> [fhat,xhat,ghat,Hhat,itct,fcount,retcodehat] = csminwel(fcn,x0,H0,grad,crit,nit,varargin)</li><li><a href="mr_gstep.html" class="code" title="function [f0, x] = mr_gstep(func0,x,htol0,varargin)">mr_gstep</a> Copyright (C) 2005 Marco Ratto</li><li><a href="newrat.html" class="code" title="function [xparam1, hh, gg, fval, igg] = newrat(func0, x, hh, gg, igg, ftol0, nit, flagg, varargin)">newrat</a> </li></ul>
|
||
|
<!-- crossreference -->
|
||
|
|
||
|
|
||
|
<h2><a name="_source"></a>SOURCE CODE <a href="#_top"><img alt="^" border="0" src="../up.png"></a></h2>
|
||
|
<div class="fragment"><pre>0001 <a name="_sub0" href="#_subfunctions" class="code">function [fhat,xhat,fcount,retcode] = csminit(fcn,x0,f0,g0,badg,H0,varargin)</a>
|
||
|
0002 <span class="comment">% [fhat,xhat,fcount,retcode] = csminit(fcn,x0,f0,g0,badg,H0,...</span>
|
||
|
0003 <span class="comment">% P1,P2,P3,P4,P5,P6,P7,P8)</span>
|
||
|
0004 <span class="comment">% retcodes: 0, normal step. 5, largest step still improves too fast.</span>
|
||
|
0005 <span class="comment">% 4,2 back and forth adjustment of stepsize didn't finish. 3, smallest</span>
|
||
|
0006 <span class="comment">% stepsize still improves too slow. 6, no improvement found. 1, zero</span>
|
||
|
0007 <span class="comment">% gradient.</span>
|
||
|
0008 <span class="comment">%---------------------</span>
|
||
|
0009 <span class="comment">% Modified 7/22/96 to omit variable-length P list, for efficiency and compilation.</span>
|
||
|
0010 <span class="comment">% Places where the number of P's need to be altered or the code could be returned to</span>
|
||
|
0011 <span class="comment">% its old form are marked with ARGLIST comments.</span>
|
||
|
0012 <span class="comment">%</span>
|
||
|
0013 <span class="comment">% Fixed 7/17/93 to use inverse-hessian instead of hessian itself in bfgs</span>
|
||
|
0014 <span class="comment">% update.</span>
|
||
|
0015 <span class="comment">%</span>
|
||
|
0016 <span class="comment">% Fixed 7/19/93 to flip eigenvalues of H to get better performance when</span>
|
||
|
0017 <span class="comment">% it's not psd.</span>
|
||
|
0018 <span class="comment">%</span>
|
||
|
0019 <span class="comment">%tailstr = ')';</span>
|
||
|
0020 <span class="comment">%for i=nargin-6:-1:1</span>
|
||
|
0021 <span class="comment">% tailstr=[ ',P' num2str(i) tailstr];</span>
|
||
|
0022 <span class="comment">%end</span>
|
||
|
0023 <span class="comment">%ANGLE = .03;</span>
|
||
|
0024 ANGLE = .005;
|
||
|
0025 <span class="comment">%THETA = .03;</span>
|
||
|
0026 THETA = .3; <span class="comment">%(0<THETA<.5) THETA near .5 makes long line searches, possibly fewer iterations.</span>
|
||
|
0027 FCHANGE = 1000;
|
||
|
0028 MINLAMB = 1e-9;
|
||
|
0029 <span class="comment">% fixed 7/15/94</span>
|
||
|
0030 <span class="comment">% MINDX = .0001;</span>
|
||
|
0031 <span class="comment">% MINDX = 1e-6;</span>
|
||
|
0032 MINDFAC = .01;
|
||
|
0033 fcount=0;
|
||
|
0034 lambda=1;
|
||
|
0035 xhat=x0;
|
||
|
0036 f=f0;
|
||
|
0037 fhat=f0;
|
||
|
0038 g = g0;
|
||
|
0039 gnorm = norm(g);
|
||
|
0040 <span class="comment">%</span>
|
||
|
0041 <span class="keyword">if</span> (gnorm < 1.e-12) & ~badg <span class="comment">% put ~badg 8/4/94</span>
|
||
|
0042 retcode =1;
|
||
|
0043 dxnorm=0;
|
||
|
0044 <span class="comment">% gradient convergence</span>
|
||
|
0045 <span class="keyword">else</span>
|
||
|
0046 <span class="comment">% with badg true, we don't try to match rate of improvement to directional</span>
|
||
|
0047 <span class="comment">% derivative. We're satisfied just to get some improvement in f.</span>
|
||
|
0048 <span class="comment">%</span>
|
||
|
0049 <span class="comment">%if(badg)</span>
|
||
|
0050 <span class="comment">% dx = -g*FCHANGE/(gnorm*gnorm);</span>
|
||
|
0051 <span class="comment">% dxnorm = norm(dx);</span>
|
||
|
0052 <span class="comment">% if dxnorm > 1e12</span>
|
||
|
0053 <span class="comment">% disp('Bad, small gradient problem.')</span>
|
||
|
0054 <span class="comment">% dx = dx*FCHANGE/dxnorm;</span>
|
||
|
0055 <span class="comment">% end</span>
|
||
|
0056 <span class="comment">%else</span>
|
||
|
0057 <span class="comment">% Gauss-Newton step;</span>
|
||
|
0058 <span class="comment">%---------- Start of 7/19/93 mod ---------------</span>
|
||
|
0059 <span class="comment">%[v d] = eig(H0);</span>
|
||
|
0060 <span class="comment">%toc</span>
|
||
|
0061 <span class="comment">%d=max(1e-10,abs(diag(d)));</span>
|
||
|
0062 <span class="comment">%d=abs(diag(d));</span>
|
||
|
0063 <span class="comment">%dx = -(v.*(ones(size(v,1),1)*d'))*(v'*g);</span>
|
||
|
0064 <span class="comment">% toc</span>
|
||
|
0065 dx = -H0*g;
|
||
|
0066 <span class="comment">% toc</span>
|
||
|
0067 dxnorm = norm(dx);
|
||
|
0068 <span class="keyword">if</span> dxnorm > 1e12
|
||
|
0069 disp(<span class="string">'Near-singular H problem.'</span>)
|
||
|
0070 dx = dx*FCHANGE/dxnorm;
|
||
|
0071 <span class="keyword">end</span>
|
||
|
0072 dfhat = dx'*g0;
|
||
|
0073 <span class="comment">%end</span>
|
||
|
0074 <span class="comment">%</span>
|
||
|
0075 <span class="comment">%</span>
|
||
|
0076 <span class="keyword">if</span> ~badg
|
||
|
0077 <span class="comment">% test for alignment of dx with gradient and fix if necessary</span>
|
||
|
0078 a = -dfhat/(gnorm*dxnorm);
|
||
|
0079 <span class="keyword">if</span> a<ANGLE
|
||
|
0080 dx = dx - (ANGLE*dxnorm/gnorm+dfhat/(gnorm*gnorm))*g;
|
||
|
0081 dfhat = dx'*g;
|
||
|
0082 dxnorm = norm(dx);
|
||
|
0083 disp(sprintf(<span class="string">'Correct for low angle: %g'</span>,a))
|
||
|
0084 <span class="keyword">end</span>
|
||
|
0085 <span class="keyword">end</span>
|
||
|
0086 disp(sprintf(<span class="string">'Predicted improvement: %18.9f'</span>,-dfhat/2))
|
||
|
0087 <span class="comment">%</span>
|
||
|
0088 <span class="comment">% Have OK dx, now adjust length of step (lambda) until min and</span>
|
||
|
0089 <span class="comment">% max improvement rate criteria are met.</span>
|
||
|
0090 done=0;
|
||
|
0091 factor=3;
|
||
|
0092 shrink=1;
|
||
|
0093 lambdaMin=0;
|
||
|
0094 lambdaMax=inf;
|
||
|
0095 lambdaPeak=0;
|
||
|
0096 fPeak=f0;
|
||
|
0097 lambdahat=0;
|
||
|
0098 <span class="keyword">while</span> ~done
|
||
|
0099 <span class="keyword">if</span> size(x0,2)>1
|
||
|
0100 dxtest=x0+dx'*lambda;
|
||
|
0101 <span class="keyword">else</span>
|
||
|
0102 dxtest=x0+dx*lambda;
|
||
|
0103 <span class="keyword">end</span>
|
||
|
0104 <span class="comment">% home</span>
|
||
|
0105 f = eval([fcn <span class="string">'(dxtest,varargin{:})'</span>]);
|
||
|
0106 <span class="comment">%ARGLIST</span>
|
||
|
0107 <span class="comment">%f = feval(fcn,dxtest,P1,P2,P3,P4,P5,P6,P7,P8,P9,P10,P11,P12,P13);</span>
|
||
|
0108 <span class="comment">% f = feval(fcn,x0+dx*lambda,P1,P2,P3,P4,P5,P6,P7,P8);</span>
|
||
|
0109 disp(sprintf(<span class="string">'lambda = %10.5g; f = %20.7f'</span>,lambda,f ))
|
||
|
0110 <span class="comment">%debug</span>
|
||
|
0111 <span class="comment">%disp(sprintf('Improvement too great? f0-f: %g, criterion: %g',f0-f,-(1-THETA)*dfhat*lambda))</span>
|
||
|
0112 <span class="keyword">if</span> f<fhat
|
||
|
0113 fhat=f;
|
||
|
0114 xhat=dxtest;
|
||
|
0115 lambdahat = lambda;
|
||
|
0116 <span class="keyword">end</span>
|
||
|
0117 fcount=fcount+1;
|
||
|
0118 shrinkSignal = (~badg & (f0-f < max([-THETA*dfhat*lambda 0]))) | (badg & (f0-f) < 0) ;
|
||
|
0119 growSignal = ~badg & ( (lambda > 0) & (f0-f > -(1-THETA)*dfhat*lambda) );
|
||
|
0120 <span class="keyword">if</span> shrinkSignal & ( (lambda>lambdaPeak) | (lambda<0) )
|
||
|
0121 <span class="keyword">if</span> (lambda>0) & ((~shrink) | (lambda/factor <= lambdaPeak))
|
||
|
0122 shrink=1;
|
||
|
0123 factor=factor^.6;
|
||
|
0124 <span class="keyword">while</span> lambda/factor <= lambdaPeak
|
||
|
0125 factor=factor^.6;
|
||
|
0126 <span class="keyword">end</span>
|
||
|
0127 <span class="comment">%if (abs(lambda)*(factor-1)*dxnorm < MINDX) | (abs(lambda)*(factor-1) < MINLAMB)</span>
|
||
|
0128 <span class="keyword">if</span> abs(factor-1)<MINDFAC
|
||
|
0129 <span class="keyword">if</span> abs(lambda)<4
|
||
|
0130 retcode=2;
|
||
|
0131 <span class="keyword">else</span>
|
||
|
0132 retcode=7;
|
||
|
0133 <span class="keyword">end</span>
|
||
|
0134 done=1;
|
||
|
0135 <span class="keyword">end</span>
|
||
|
0136 <span class="keyword">end</span>
|
||
|
0137 <span class="keyword">if</span> (lambda<lambdaMax) & (lambda>lambdaPeak)
|
||
|
0138 lambdaMax=lambda;
|
||
|
0139 <span class="keyword">end</span>
|
||
|
0140 lambda=lambda/factor;
|
||
|
0141 <span class="keyword">if</span> abs(lambda) < MINLAMB
|
||
|
0142 <span class="keyword">if</span> (lambda > 0) & (f0 <= fhat)
|
||
|
0143 <span class="comment">% try going against gradient, which may be inaccurate</span>
|
||
|
0144 lambda = -lambda*factor^6
|
||
|
0145 <span class="keyword">else</span>
|
||
|
0146 <span class="keyword">if</span> lambda < 0
|
||
|
0147 retcode = 6;
|
||
|
0148 <span class="keyword">else</span>
|
||
|
0149 retcode = 3;
|
||
|
0150 <span class="keyword">end</span>
|
||
|
0151 done = 1;
|
||
|
0152 <span class="keyword">end</span>
|
||
|
0153 <span class="keyword">end</span>
|
||
|
0154 <span class="keyword">elseif</span> (growSignal & lambda>0) | (shrinkSignal & ((lambda <= lambdaPeak) & (lambda>0)))
|
||
|
0155 <span class="keyword">if</span> shrink
|
||
|
0156 shrink=0;
|
||
|
0157 factor = factor^.6;
|
||
|
0158 <span class="comment">%if ( abs(lambda)*(factor-1)*dxnorm< MINDX ) | ( abs(lambda)*(factor-1)< MINLAMB)</span>
|
||
|
0159 <span class="keyword">if</span> abs(factor-1)<MINDFAC
|
||
|
0160 <span class="keyword">if</span> abs(lambda)<4
|
||
|
0161 retcode=4;
|
||
|
0162 <span class="keyword">else</span>
|
||
|
0163 retcode=7;
|
||
|
0164 <span class="keyword">end</span>
|
||
|
0165 done=1;
|
||
|
0166 <span class="keyword">end</span>
|
||
|
0167 <span class="keyword">end</span>
|
||
|
0168 <span class="keyword">if</span> ( f<fPeak ) & (lambda>0)
|
||
|
0169 fPeak=f;
|
||
|
0170 lambdaPeak=lambda;
|
||
|
0171 <span class="keyword">if</span> lambdaMax<=lambdaPeak
|
||
|
0172 lambdaMax=lambdaPeak*factor*factor;
|
||
|
0173 <span class="keyword">end</span>
|
||
|
0174 <span class="keyword">end</span>
|
||
|
0175 lambda=lambda*factor;
|
||
|
0176 <span class="keyword">if</span> abs(lambda) > 1e20;
|
||
|
0177 retcode = 5;
|
||
|
0178 done =1;
|
||
|
0179 <span class="keyword">end</span>
|
||
|
0180 <span class="keyword">else</span>
|
||
|
0181 done=1;
|
||
|
0182 <span class="keyword">if</span> factor < 1.2
|
||
|
0183 retcode=7;
|
||
|
0184 <span class="keyword">else</span>
|
||
|
0185 retcode=0;
|
||
|
0186 <span class="keyword">end</span>
|
||
|
0187 <span class="keyword">end</span>
|
||
|
0188 <span class="keyword">end</span>
|
||
|
0189 <span class="keyword">end</span>
|
||
|
0190 disp(sprintf(<span class="string">'Norm of dx %10.5g'</span>, dxnorm))</pre></div>
|
||
|
<hr><address>Generated on Fri 16-Jun-2006 09:09:06 by <strong><a href="http://www.artefact.tk/software/matlab/m2html/">m2html</a></strong> © 2003</address>
|
||
|
</body>
|
||
|
</html>
|