# HG changeset patch # User Jaroslav Hajek # Date 1242575691 -7200 # Node ID 25f50d2d76b3e4b9a8b371546c711134fcd9a54b # Parent 5f36c6c9be13d6904662ce217a3cba2ea3bb3bf1 improve TR updating strategy for fminunc and fsolve diff -r 5f36c6c9be13 -r 25f50d2d76b3 scripts/ChangeLog --- a/scripts/ChangeLog Fri May 15 16:02:30 2009 -0400 +++ b/scripts/ChangeLog Sun May 17 17:54:51 2009 +0200 @@ -1,3 +1,8 @@ +2009-05-17 Jaroslav Hajek + + * optimization/fminunc.m: Improve TR updating strategy. + * optimization/fsolve.m: Ditto. + 2009-05-15 John W. Eaton * general/nargchk.m: Don't generate error if output is struct. diff -r 5f36c6c9be13 -r 25f50d2d76b3 scripts/optimization/fminunc.m --- a/scripts/optimization/fminunc.m Fri May 15 16:02:30 2009 -0400 +++ b/scripts/optimization/fminunc.m Sun May 17 17:54:51 2009 +0200 @@ -199,6 +199,8 @@ endif suc = false; + decfac = 0.5; + ## Inner loop. while (! suc && niter <= maxiter && nfev < maxfev && ! info) @@ -231,8 +233,9 @@ endif ## Update delta. - if (ratio < min(max(0.1, lastratio), 0.9)) - delta *= 0.5; + if (ratio < min(max(0.1, 0.8*lastratio), 0.9)) + delta *= decfac; + decfac ^= 1.4142; if (delta <= 1e1*macheps*xn) ## Trust region became uselessly small. info = -3; @@ -240,10 +243,11 @@ endif else lastratio = ratio; + decfac = 0.5; if (abs (1-ratio) <= 0.1) - delta = 2*sn; + delta = 1.4142*sn; elseif (ratio >= 0.5) - delta = max (delta, 2*sn); + delta = max (delta, 1.4142*sn); endif endif diff -r 5f36c6c9be13 -r 25f50d2d76b3 scripts/optimization/fsolve.m --- a/scripts/optimization/fsolve.m Fri May 15 16:02:30 2009 -0400 +++ b/scripts/optimization/fsolve.m Sun May 17 17:54:51 2009 +0200 @@ -256,6 +256,8 @@ lastratio = 0; nfail = 0; nsuc = 0; + decfac = 0.5; + ## Inner loop. while (niter <= maxiter && nfev < maxfev && ! info) @@ -296,10 +298,11 @@ endif ## Update delta. - if (ratio < min(max(0.1, lastratio), 0.9)) + if (ratio < min(max(0.1, 0.8*lastratio), 0.9)) nsuc = 0; nfail ++; - delta *= 0.5; + delta *= decfac; + decfac ^= 1.4142; if (delta <= 1e1*macheps*xn) ## Trust region became uselessly small. info = -3; @@ -307,12 +310,13 @@ endif else lastratio = ratio; + decfac = 0.5; nfail = 0; nsuc ++; if (abs (1-ratio) <= 0.1) - delta = 2*sn; + delta = 1.4142*sn; elseif (ratio >= 0.5 || nsuc > 1) - delta = max (delta, 2*sn); + delta = max (delta, 1.4142*sn); endif endif