changeset 9207:25f50d2d76b3

improve TR updating strategy for fminunc and fsolve
author Jaroslav Hajek <highegg@gmail.com>
date Sun, 17 May 2009 17:54:51 +0200
parents 5f36c6c9be13
children cb163402bf79
files scripts/ChangeLog scripts/optimization/fminunc.m scripts/optimization/fsolve.m
diffstat 3 files changed, 21 insertions(+), 8 deletions(-) [+]
line wrap: on
line diff
--- 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  <highegg@gmail.com>
+
+	* optimization/fminunc.m: Improve TR updating strategy.
+	* optimization/fsolve.m: Ditto.
+
 2009-05-15  John W. Eaton  <jwe@octave.org>
 
 	* general/nargchk.m: Don't generate error if output is struct.
--- 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
 
--- 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