| /* |
| * 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 <[email protected]> 2013 |
| * |
| * Licence: see ../COPYING (FreeBSD) |
| * |
| * Homepage: apps.jcns.fz-juelich.de/lmfit |
| */ |
| |
| #include "lmmin.h" |
| #include <stdio.h> |
| #include <stdlib.h> |
| |
| 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; |
| } |