Hello all,

     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)).

    Unfortunately I haven't yet figured out why it's stalling, but
in the meantime I thought I'd post this code and see if anyone
else has been having similar difficulties. It's a bit of an unusual
function, but it's continuous everywhere and all of the other
minimizers I try happily succeed without complaint.

Take care,
Andrew
( http://o2scl.sourceforge.net )
#include <stdlib.h>
#include <gsl/gsl_multimin.h>
#include <gsl/gsl_errno.h>

double pi;

double spring(const gsl_vector *x, void *pa) {
  double x0=gsl_vector_get(x,0);
  double x1=gsl_vector_get(x,1);
  double x2=gsl_vector_get(x,2);

  double theta=atan2(x1,x0);
  double r=sqrt(x0*x0+x1*x1);
  double z=x2;
  while (z>pi) z-=2.0*pi;
  while (z<-pi) z+=2.0*pi;
  double tmz=theta-z;
  double rm1=r-1.0;
  double ret=exp(tmz*tmz+rm1*rm1)+fabs(x2/10.0);
  if (!finite(ret)) exit(-1);
  return ret;
}

int main(int argv, char *argc[]) {

  pi=acos(-1.0);

  int nvar=3;

  {
    const gsl_multimin_fminimizer_type *T=gsl_multimin_fminimizer_nmsimplex;
    gsl_multimin_fminimizer *s=0;
    gsl_multimin_function minex_func;

    gsl_vector *gx=gsl_vector_alloc(nvar);
    gsl_vector_set(gx,0,1.0);
    gsl_vector_set(gx,1,0.0);
    gsl_vector_set(gx,2,7.0*pi);
	
    int iter=0;
    int status;
    double size;
     
    gsl_vector *ss;
    ss=gsl_vector_alloc(nvar);
    gsl_vector_set_all(ss,1.0);
     
    minex_func.n=nvar;
    minex_func.f=&spring;
    minex_func.params=0;
      
    s=gsl_multimin_fminimizer_alloc(T,nvar);
    gsl_multimin_fminimizer_set(s,&minex_func,gx,ss);
      
    do {
      iter++;
      status=gsl_multimin_fminimizer_iterate(s);
        
      if (status) break;

      size=gsl_multimin_fminimizer_size(s);
      status=gsl_multimin_test_size(size,1.0e-4);

      if (iter%20==0) {
	printf("%d %6.5e %6.5e %6.5e\n",iter,
	       gsl_vector_get(s->x,0),
	       gsl_vector_get(s->x,1),
	       gsl_vector_get(s->x,2));
      }
	
    } while (status == GSL_CONTINUE && iter < 600);

    gsl_vector_free(ss);
    gsl_vector_free(gx);
    gsl_multimin_fminimizer_free(s);
  }

  printf("\n");

  {
    const gsl_multimin_fminimizer_type *T=gsl_multimin_fminimizer_nmsimplex2;
    gsl_multimin_fminimizer *s=0;
    gsl_multimin_function minex_func;

    gsl_vector *gx=gsl_vector_alloc(nvar);
    gsl_vector_set(gx,0,1.0);
    gsl_vector_set(gx,1,0.0);
    gsl_vector_set(gx,2,7.0*pi);
	
    int iter=0;
    int status;
    double size;
     
    gsl_vector *ss;
    ss=gsl_vector_alloc(nvar);
    gsl_vector_set_all(ss,1.0);
     
    minex_func.n=nvar;
    minex_func.f=&spring;
    minex_func.params=0;
      
    s=gsl_multimin_fminimizer_alloc(T,nvar);
    gsl_multimin_fminimizer_set(s,&minex_func,gx,ss);
      
    do {
      iter++;
      status=gsl_multimin_fminimizer_iterate(s);
        
      if (status) break;

      size=gsl_multimin_fminimizer_size(s);
      status=gsl_multimin_test_size(size,1.0e-4);

      if (iter%20==0) {
	printf("%d %6.5e %6.5e %6.5e\n",iter,
	       gsl_vector_get(s->x,0),
	       gsl_vector_get(s->x,1),
	       gsl_vector_get(s->x,2));
      }
	
    } while (status == GSL_CONTINUE && iter < 600);

    gsl_vector_free(ss);
    gsl_vector_free(gx);
    gsl_multimin_fminimizer_free(s);
  }

  return 0;
}
 
_______________________________________________
Bug-gsl mailing list
[email protected]
http://lists.gnu.org/mailman/listinfo/bug-gsl

Reply via email to