TMinuit does not optimize; step sizes = 0

Hello,

I am using TMinuit to solve for three parameters in a linear system of equations. I am compiling this with g++.

I know these are not the optimal values. I put them in to learn how TMinuit is working. What am I doing wrong? Here is the output:

[code] PARAMETER DEFINITIONS:
NO. NAME VALUE STEP SIZE LIMITS
1 A_UD -2.61290e-05 1.00000e-09 no limits
2 A_LR -2.33700e-06 1.00000e-09 no limits
3 A_O 3.06000e-07 1.00000e-09 no limits


** 1 **MIGRAD 1.256e-312 1.706e-316


FIRST CALL TO USER FUNCTION AT NEW START POINT, WITH IFLAG=4.
START MIGRAD MINIMIZATION. STRATEGY 1. CONVERGENCE WHEN EDM .LT.1.71e-319
FCN=inf FROM MIGRAD STATUS=INITIATE 105 CALLS 106 TOTAL
EDM= unknown STRATEGY= 1 NO ERROR MATRIX
EXT PARAMETER CURRENT GUESS STEP FIRST
NO. NAME VALUE ERROR SIZE DERIVATIVE
1 A_UD -2.61290e-05 1.00000e-09 0.00000e+00 nan
2 A_LR -2.33700e-06 1.00000e-09 0.00000e+00 nan
3 A_O 3.06000e-07 1.00000e-09 0.00000e+00 nan
MIGRAD FAILS TO FIND IMPROVEMENT
MACHINE ACCURACY LIMITS FURTHER IMPROVEMENT.
MIGRAD MINIMIZATION HAS CONVERGED.
MIGRAD WILL VERIFY CONVERGENCE AND ERROR MATRIX.
MINUIT WARNING IN HESSE
============== MATRIX FORCED POS-DEF BY ADDING nan TO DIAGONAL.
FCN=nan FROM MIGRAD STATUS=CONVERGED 162 CALLS 163 TOTAL
EDM=-nan STRATEGY= 1 ERR MATRIX NOT POS-DEF
EXT PARAMETER APPROXIMATE STEP FIRST
NO. NAME VALUE ERROR SIZE DERIVATIVE
1 A_UD -2.61290e-05 nan 1.34863e-03 -nan
2 A_LR -2.33700e-06 nan 1.20623e-04 -nan
3 A_O 3.06000e-07 -nan 1.57940e-05 -nan
EXTERNAL ERROR MATRIX. NDIM= 25 NPAR= 3 ERR DEF=1
-nan -nan -nan
-nan -nan -nan
-nan -nan nan
ERR MATRIX NOT POS-DEF
PARAMETER CORRELATION COEFFICIENTS
NO. GLOBAL 1 2 3
1 nan -nan -nan -nan
2 nan -nan -nan -nan
3 -nan -nan -nan nan
ERR MATRIX NOT POS-DEF[/code]

Here is the chi-squared function:

[code]void chisquare(int &npar, double grad[3], double &chisqt, double par[3], int flag) {
const int ndets = 48;
double uda[ndets];
double lra[ndets];
double ude[ndets];
double lre[ndets];
factors(uda,lra,ude,lre);

double rasy[ndets];
double rerr[ndets];
raws(rasy,rerr);

double chi = 0;
double chisq = 0;
chisqt = 0;
for(int i = 0; i < ndets; i++) {
chi = (rasy[i] - uda[i]*par[0] - lra[i]*par[1] - par[2])/rerr[i];
chisq = squ(chi);
chisqt+=chisq;
}
}[/code]

Here are the calls:

[code] TMinuit *asymMinuit = new TMinuit(3);

double* arglist = new double[3];
asymMinuit->SetFCN(chisquare);
int errflag = 0;

double strt[3] = {-0.000026129,-0.000002337,0.000000306};
double step[3] = {0.000001,0.000001,0.000001};
asymMinuit->mnparm(0, “A_UD”, strt[0], step[0], 0.0, 0.0, errflag);
asymMinuit->mnparm(1, “A_LR”, strt[1], step[1], 0.0, 0.0, errflag);
asymMinuit->mnparm(2, “A_O”, strt[2], step[2], 0.0, 0.0, errflag);

asymMinuit->mnexcm(“MIGRAD”, arglist, 2, errflag);[/code]