bug-gsl
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Bug-gsl] Possible bug (or room for improvement) in gsl_mmin_simp2


From: Brian Gough
Subject: Re: [Bug-gsl] Possible bug (or room for improvement) in gsl_mmin_simp2
Date: Wed, 05 Aug 2009 17:23:09 +0100
User-agent: Wanderlust/2.14.0 (Africa) Emacs/22.2 Mule/5.0 (SAKAKI)

At Mon, 27 Jul 2009 09:22:46 -0400,
Andrew W. Steiner wrote:
>      I've been finding that the new simplex algorithm seems to fail
> to converge much more frequently than the old one. It took me
> awhile to generate a sufficiently portable case which demonstrates
> this, but attached is a program which shows that the simplex
> minimizer succeeds, but the simplex2 minimizer stalls and gets
> stuck (the true minimum is at (1,0,0)).
> 

By comparing with the original simplex output, I found that the center
and size were not updated in contract_by_best, causing the values to
drift.  

With the patch below the results should be identical with the standard
simplex algorithm. I also added the spring function as a test
case. 

Thanks to everyone who contributed to the bug report.

-- 
Brian Gough
(GSL Maintainer)

Support freedom by joining the FSF 
http://www.fsf.org/associate/support_freedom/join_fsf?referrer=37


commit 8fd1a5b178bc0956b50870d272551b9f3fd2d192
Author: Brian Gough <address@hidden>
Date:   Wed Aug 5 17:13:33 2009 +0100

    fix for bug #27180: nmsimplex2 failed to converge (A.Steiner)

diff --git a/multimin/simplex2.c b/multimin/simplex2.c
index c9d01a7..bcf99df 100644
--- a/multimin/simplex2.c
+++ b/multimin/simplex2.c
@@ -57,6 +57,11 @@ typedef struct
 }
 nmsimplex_state_t;
 
+static int
+compute_center (const nmsimplex_state_t * state, gsl_vector * center);
+static double
+compute_size (nmsimplex_state_t * state, const gsl_vector * center);
+
 static double
 try_corner_move (const double coeff,
                 const nmsimplex_state_t * state,
@@ -173,6 +178,10 @@ contract_by_best (nmsimplex_state_t * state, size_t best,
        }
     }
 
+  /* We need to update the centre and size as well */
+  compute_center (state, state->center);
+  compute_size (state, state->center);
+
   return status;
 }
 




reply via email to

[Prev in Thread] Current Thread [Next in Thread]