Problem with the convergence of TMinuit

Hello everybody!
I have a problem with TMinuit. The code should generate N angles following a certain function. The second step is to perform a Maximum Lilelihood minimization to find the three parameters of the function. Here I report only the section of the code in which I implement TMinuit.

double x[N], y[N]; // variables for MC events

void fcn(int &npar, double *deriv, double &f, double *par, int iflag){
	double lnL = 0.;
	for(int i = 0; i < N; i++){
		lnL += log(0.2388 * (0.5*(1-par[0]) + 0.5*(3*par[0]-1)*pow(cos(x[i]),2) - par[1]*pow(sin(x[i]),2)*pow(cos(2*y[i]),2) 
			- sqrt(2)*par[2]*sin(2*y[i])*cos(y[i]))); 
	}
	f = -lnL;
}


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

/*MonteCarlo generator. This is not a problem since it works. 
I report it just fot the sake of completeness. */

	srand(time(NULL));
	TNtuple cas ("cas", "cas", "x:y");
	for(int i = 0; i < N; i++){
		auto casuale = rand_TAC(0, 6.28, 0, 6.28, 0, 1);
		cas.Fill(get<0>(casuale), get<1>(casuale));
		x[i] = get<0>(casuale);
		y[i]= get<1>(casuale);
	}

//TMinuit

	double arglist[10];
	int ierflg = 0;

	TMinuit minuit (3);
	minuit.SetFCN(fcn);
	arglist[0] = 0.5;
	minuit.mnparm(0, "alpha", 0.40, 0.05, 0.0, 0.0, ierflg);
	minuit.mnparm(1, "beta", 0.01, 0.01, 0.0, 0.0, ierflg);
	minuit.mnparm(2, "gamma", -0.10, -0.01, 0.00, 0.0, ierflg);
	minuit.mnexcm("MIGRAD", arglist, 0, ierflg);

	return 0;
}

My problem is about the output:

PARAMETER DEFINITIONS:
    NO.   NAME         VALUE      STEP SIZE      LIMITS
     1 alpha        4.00000e-01  5.00000e-02     no limits
     2 beta         1.00000e-02  1.00000e-02     no limits
     3 gamma       -1.00000e-01  constant
 **********
 **    1 **MIGRAD
 **********
 FIRST CALL TO USER FUNCTION AT NEW START POINT, WITH IFLAG=4.
 START MIGRAD MINIMIZATION.  STRATEGY  1.  CONVERGENCE WHEN EDM .LT. 1.00e-04
 FCN=119989 FROM MIGRAD    STATUS=INITIATE        8 CALLS           9 TOTAL
                     EDM= unknown      STRATEGY= 1      NO ERROR MATRIX       
  EXT PARAMETER               CURRENT GUESS       STEP         FIRST   
  NO.   NAME      VALUE            ERROR          SIZE      DERIVATIVE 
   1  alpha        4.00000e-01   5.00000e-02   5.00000e-02  -6.18671e+04
   2  beta         1.00000e-02   1.00000e-02   1.00000e-02   2.38230e+04
   3  gamma       -1.00000e-01   constant   
 MIGRAD FAILS TO FIND IMPROVEMENT
 COVARIANCE MATRIX CALCULATED SUCCESSFULLY
 FCN=92233.7 FROM HESSE     STATUS=OK             10 CALLS          49 TOTAL
                     EDM=18768.6    STRATEGY= 1      ERROR MATRIX ACCURATE 
  EXT PARAMETER                                   STEP         FIRST   
  NO.   NAME      VALUE            ERROR          SIZE      DERIVATIVE 
   1  alpha        7.90493e-01   6.33068e-03   9.37632e-04  -2.92199e+04
   2  beta        -6.60789e-01   1.53865e-02   2.27887e-03   1.25535e+04
   3  gamma       -1.00000e-01   constant   
 MIGRAD FAILS TO FIND IMPROVEMENT
 MIGRAD TERMINATED WITHOUT CONVERGENCE.
 FCN=92233.7 FROM MIGRAD    STATUS=FAILED         59 CALLS          60 TOTAL
                     EDM=18768.6    STRATEGY= 1      ERR MATRIX APPROXIMATE
  EXT PARAMETER                APPROXIMATE        STEP         FIRST   
  NO.   NAME      VALUE            ERROR          SIZE      DERIVATIVE 
   1  alpha        7.90493e-01   6.33068e-03   0.00000e+00  -2.92199e+04
   2  beta        -6.60789e-01   1.53865e-02  -0.00000e+00   1.25535e+04
   3  gamma       -1.00000e-01   constant   
 EXTERNAL ERROR MATRIX.    NDIM=  25    NPAR=  2    ERR DEF=1
  4.008e-05 -4.836e-06 
 -4.836e-06  2.367e-04 
ERR MATRIX APPROXIMATE
 PARAMETER  CORRELATION COEFFICIENTS  
       NO.  GLOBAL      1      2
        1  0.04964   1.000 -0.050
        2  0.04964  -0.050  1.000
 ERR MATRIX APPROXIMATE

Something does not work. I think the main problem is “MIGRAD FAILS TO FIND IMPROVEMENT”.
Is there someone who can help me, please?


_ROOT Version: 6.16/00
_Platform: Ubuntu 18
_Compiler: g++


Hi

This error is normally caused by limited precision or errors in your FCN function. I would check if the function implementation is correct and it is not having large discontinuities, especially in the derivatives

Lorenzo