You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
72 lines
2.0 KiB
72 lines
2.0 KiB
/*
|
|
* 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 <j.wuttke@fz-juelich.de> 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;
|
|
}
|