/* * Library: lmfit (Levenberg-Marquardt least squares fitting) * * File: demo/curve1.c * * Contents: Example for the solution of 2 nonlinear equations in 2 variables. * Find the intersection of a circle and a parabola. * * Note: Any modification of this example should be copied to the wiki. * * Author: Joachim Wuttke 2013 * * Licence: see ../COPYING (FreeBSD) * * Homepage: apps.jcns.fz-juelich.de/lmfit */ #include "lmmin.h" #include #include void evaluate_nonlin1( const double *p, int n, const void *data, double *f, int *info ) { f[0] = p[0]*p[0] + p[1]*p[1] - 1; /* unit circle x^2+y^2=1 */ f[1] = p[1] - p[0]*p[0]; /* standard parabola y=x^2 */ } int main( int argc, char **argv ) { int n = 2; /* dimension of the problem */ double p[2]; /* parameter vector p=(x,y) */ /* auxiliary parameters */ lm_control_struct control = lm_control_double; lm_status_struct status; control.verbosity = 31; /* get start values from command line */ if( argc!=3 ){ fprintf( stderr, "usage: nonlin1 x_start y_start\n" ); exit(-1); } p[0] = atof( argv[1] ); p[1] = atof( argv[2] ); /* the minimization */ printf( "Minimization:\n" ); lmmin( n, p, n, NULL, evaluate_nonlin1, &control, &status ); /* print results */ printf( "\n" ); printf( "lmmin status after %d function evaluations:\n %s\n", status.nfev, lm_infmsg[status.outcome] ); printf( "\n" ); printf("Solution:\n"); printf(" x = %19.11f\n", p[0]); printf(" y = %19.11f\n", p[1]); printf(" d = %19.11f => ", status.fnorm); /* convergence of lmfit is not enough to ensure validity of the solution */ if( status.fnorm >= control.ftol ) printf( "not a valid solution, try other starting values\n" ); else printf( "valid, though not the only solution: " "try other starting values\n" ); return 0; }