int main() { /* parameter vector */ int n_par = 3; // number of parameters in model function f double par[3] = { 1, 0, 1 }; // relatively bad starting value /* data pairs: slightly distorted standard parabola */ int m_dat = 11; // number of data pairs int i; double x[11] = { -5., -4., -3., -2., -1., 0., 1., 2., 3., 4., 5. }; double y[11] = { 25.5, 16.6, 9.9, 4.4, 1.1, 0, 1.1, 4.2, 9.3, 16.4, 25.5 }; /* auxiliary parameters */ lm_status_struct status; lm_control_struct control = lm_control_double; control.printflags = 3; // monitor status (+1) and parameters (+2) /* perform the fit */ printf( "Fitting:\n" ); lmcurve_fit( n_par, par, m_dat, x, y, f, &control, &status ); /* print results */ printf( "\nResults:\n" ); printf( "status after %d function evaluations:\n %s\n", status.nfev, lm_infmsg[status.info] ); printf("obtained parameters:\n"); for ( i = 0; i < n_par; ++i) printf(" par[%i] = %12g\n", i, par[i]); printf("obtained norm:\n %12g\n", status.fnorm ); printf("fitting data as follows:\n"); for ( i = 0; i < m_dat; ++i) printf( " t[%2d]=%12g y=%12g fit=%12g residue=%12g\n", i, x[i], y[i], f(x[i],par), y[i] - f(x[i],par) ); return 0; }
int main() { /* initialize random number generator */ srand(1); /* loop over random draws */ int iter; for( iter=0; iter<100; ++iter ){ /* parameter vector */ int n_par = 8; double ini[8], par[8]; int j; for( j=0; j<n_par; ++j ){ ini[j] = 10. * rand()/RAND_MAX; /* to generate data */ par[j] = 10. * rand()/RAND_MAX; /* start values for fit */ } /* data pairs */ int m_dat = 100; // number of data pairs double t[100], y[100]; int i; for( i=0; i<m_dat; ++i ){ /* time points chosen logarithmically spaced between 0.01 and 100 */ t[i] = exp( log(0.01)+log(100/0.01)*i/(m_dat-1) ); y[i] = f( t[i], ini ); } /* auxiliary parameters */ lm_status_struct status; lm_control_struct control = lm_control_double; control.maxcall = 8000; control.printflags = 0; /* perform the fit */ lmcurve_fit( n_par, par, m_dat, t, y, f, &control, &status ); /* print results */ printf( "%2d %5d %18.11f\n", status.info, status.nfev, status.fnorm ); /* printf( "status after %d function evaluations:\n %s\n", status.nfev, lm_infmsg[status.info] ); printf("initial and fitted parameters:\n"); for ( i = 0; i < n_par; ++i) printf(" par%i: %18.11f -> %18.11f\n", i, ini[i], par[i]); printf("obtained norm:\n %12g\n", status.fnorm ); printf("fitting data as follows:\n"); for ( i = 0; i < m_dat; ++i) printf( " t[%2d]=%12g y=%12g fit=%12g residue=%12g\n", i, t[i], y[i], f(t[i],par), y[i] - f(t[i],par) ); */ } return 0; }