static void do_fit(FILE *out,int n,bool bYdy,int ny,real *x0,real **val, int npargs,t_pargs *ppa) { real *c1=NULL,*sig=NULL,*fitparm; real dt=0,tendfit,tbeginfit; int i,efitfn,nparm; efitfn = get_acffitfn(); nparm = nfp_ffn[efitfn]; fprintf(out,"Will fit to the following function:\n"); fprintf(out,"%s\n",longs_ffn[efitfn]); c1 = val[n]; if (bYdy) { c1 = val[n]; sig = val[n+1]; fprintf(out,"Using two columns as y and sigma values\n"); } else { snew(sig,ny); } if (opt2parg_bSet("-beginfit",npargs,ppa)) { tbeginfit = opt2parg_real("-beginfit",npargs,ppa); } else { tbeginfit = x0 ? x0[0] : 0; } if (opt2parg_bSet("-endfit",npargs,ppa)) { tendfit = opt2parg_real("-endfit",npargs,ppa); } else { tendfit = x0 ? x0[ny-1] : (ny-1)*dt; } snew(fitparm,nparm); switch(efitfn) { case effnEXP1: fitparm[0] = 0.5; break; case effnEXP2: fitparm[0] = 0.5; fitparm[1] = c1[0]; break; case effnEXP3: fitparm[0] = 1.0; fitparm[1] = 0.5*c1[0]; fitparm[2] = 10.0; break; case effnEXP5: fitparm[0] = fitparm[2] = 0.5*c1[0]; fitparm[1] = 10; fitparm[3] = 40; fitparm[4] = 0; break; case effnEXP7: fitparm[0] = fitparm[2] = fitparm[4] = 0.33*c1[0]; fitparm[1] = 1; fitparm[3] = 10; fitparm[5] = 100; fitparm[6] = 0; break; case effnEXP9: fitparm[0] = fitparm[2] = fitparm[4] = fitparm[6] = 0.25*c1[0]; fitparm[1] = 0.1; fitparm[3] = 1; fitparm[5] = 10; fitparm[7] = 100; fitparm[8] = 0; break; default: fprintf(out,"Warning: don't know how to initialize the parameters\n"); for(i=0; (i<nparm); i++) fitparm[i] = 1; } fprintf(out,"Starting parameters:\n"); for(i=0; (i<nparm); i++) fprintf(out,"a%-2d = %12.5e\n",i+1,fitparm[i]); if (do_lmfit(ny,c1,sig,dt,x0,tbeginfit,tendfit, bDebugMode(),efitfn,fitparm,0)) { for(i=0; (i<nparm); i++) fprintf(out,"a%-2d = %12.5e\n",i+1,fitparm[i]); } else { fprintf(out,"No solution was found\n"); } }
static void do_fit(FILE *out, int n, gmx_bool bYdy, int ny, real *x0, real **val, int npargs, t_pargs *ppa, const gmx_output_env_t *oenv, const char *fn_fitted) { real *c1 = NULL, *sig = NULL; double *fitparm; real tendfit, tbeginfit; int i, efitfn, nparm; efitfn = get_acffitfn(); nparm = effnNparams(efitfn); fprintf(out, "Will fit to the following function:\n"); fprintf(out, "%s\n", effnDescription(efitfn)); c1 = val[n]; if (bYdy) { c1 = val[n]; sig = val[n+1]; fprintf(out, "Using two columns as y and sigma values\n"); } else { snew(sig, ny); } if (opt2parg_bSet("-beginfit", npargs, ppa)) { tbeginfit = opt2parg_real("-beginfit", npargs, ppa); } else { tbeginfit = x0[0]; } if (opt2parg_bSet("-endfit", npargs, ppa)) { tendfit = opt2parg_real("-endfit", npargs, ppa); } else { tendfit = x0[ny-1]; } snew(fitparm, nparm); switch (efitfn) { case effnEXP1: fitparm[0] = 0.5; break; case effnEXP2: fitparm[0] = 0.5; fitparm[1] = c1[0]; break; case effnEXPEXP: fitparm[0] = 1.0; fitparm[1] = 0.5*c1[0]; fitparm[2] = 10.0; break; case effnEXP5: fitparm[0] = fitparm[2] = 0.5*c1[0]; fitparm[1] = 10; fitparm[3] = 40; fitparm[4] = 0; break; case effnEXP7: fitparm[0] = fitparm[2] = fitparm[4] = 0.33*c1[0]; fitparm[1] = 1; fitparm[3] = 10; fitparm[5] = 100; fitparm[6] = 0; break; case effnEXP9: fitparm[0] = fitparm[2] = fitparm[4] = fitparm[6] = 0.25*c1[0]; fitparm[1] = 0.1; fitparm[3] = 1; fitparm[5] = 10; fitparm[7] = 100; fitparm[8] = 0; break; default: fprintf(out, "Warning: don't know how to initialize the parameters\n"); for (i = 0; (i < nparm); i++) { fitparm[i] = 1; } } fprintf(out, "Starting parameters:\n"); for (i = 0; (i < nparm); i++) { fprintf(out, "a%-2d = %12.5e\n", i+1, fitparm[i]); } if (do_lmfit(ny, c1, sig, 0, x0, tbeginfit, tendfit, oenv, bDebugMode(), efitfn, fitparm, 0, fn_fitted) > 0) { for (i = 0; (i < nparm); i++) { fprintf(out, "a%-2d = %12.5e\n", i+1, fitparm[i]); } } else { fprintf(out, "No solution was found\n"); } }