コード例 #1
0
ファイル: curve1.c プロジェクト: Alcibiades586/roadrunner
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;
}
コード例 #2
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;
}