Пример #1
0
void main ()
{
	real_t **allocate_real_matrix(int, int, int, int);
	void free_real_matrix(real_t **, int, int, int);
	void marquardt(int, int, real_t [], real_t [], real_t **,
						int (*)(int, int, real_t[], real_t[]),
						void (*)(int, int, real_t[], real_t[], real_t **),
						real_t [], real_t []);
	real_t in[7],out[8],rv[7],par[4],**jjinv;

	jjinv=allocate_real_matrix(1,3,1,3);
	in[0]=1.0e-6;  in[3]=1.0e-4;  in[4]=1.0e-1;  in[5]=75.0;
	in[6]=1.0e-2;
	x[1] = -5.0;  x[2] = -3.0;  x[3] = -1.0;  x[4]=1.0;
	x[5]=3.0;  x[6]=5.0;
	y[1]=127.0;  y[2]=151.0;  y[3]=379.0;  y[4]=421.0;
	y[5]=460.0;  y[6]=426.0;
	par[1]=580.0;  par[2] = -180.0;  par[3] = -0.160;
	marquardt(6,3,par,rv,jjinv,expfunct,jacobian,in,out);
	printf("Parameters:\n   %9.4e   %9.4e   %9.4e\n\nOUT:\n"
		" %14.6e\n %14.6e\n %14.6e\n %14.6e\n %14.6e\n %14.6e\n"
		" %14.6e\n\nLast residual vector:\n"
		" %6.1f  %6.1f  %6.1f  %6.1f  %6.1f  %6.1f\n",
		par[1],par[2],par[3],out[7],out[2],out[6],out[3],out[4],
		out[5],out[1],rv[1],rv[2],rv[3],rv[4],rv[5],rv[6]);
	free_real_matrix(jjinv,1,3,1);
}
Пример #2
0
int  Ti_Optimization::D2Circle_fitting(int m,				// number of points
				   double**g_pnt,		/*point array*/
				   double* const par)	/*array of unknown variables
										 Par[1--3], circle center 
										 Par[4--6], circle plane vector
										 Par[7], circle radius*/
{
	/*/begin parameter initialization*/
    int i;
	//initialize the center point
	par[1] = par[2] = par[3] = 0;
	for (int i=1; i <= m; i++)
	{
		par[1] += g_pnt[i][1];
		par[2] += g_pnt[i][2];

	}
	par[1] /= m;
	par[2] /= m;


	/*initialize the circle radius*/

	par[3] = sqrt((g_pnt[1][1] - par[1])*(g_pnt[1][1] - par[1]) +
				  (g_pnt[1][2] - par[2])*(g_pnt[1][2] - par[2]));	

/*	par[1] = 0.1;
	par[2] = 0;
	par[3] = 0;
*/
	// end initialization

	//Ti_Optimization algorithm;
	double temp = 0;
	double in[7],out[8],*rv,**jjinv;
	rv	  = allocate_real_vector(1,m);
	jjinv = allocate_real_matrix(1,3,1,3);//7 stand for the number of variables
	
	in[0]=1.0e-30; 
	in[3]=1.0e-10; 
	in[4]=1.0e-10;  
	in[5]=2000;
	in[6]=1.0e-6;

	marquardt(
		m,
		3,
		g_pnt,
		par,
		rv,
		jjinv,
		Evaluatefor2DCircle,
		Jacobianfor2DCircle,
		in,
		out);


	/*calculate the average errors*/
	double ave_error=0, temp_center[3];

	temp_center[0] = par[1];
	temp_center[1] = par[2];


	for (i=1; i <= m; i++)
		ave_error += sqrt((g_pnt[i][1] - par[1])*(g_pnt[i][1] - par[1]) +
						  (g_pnt[i][2] - par[2])*(g_pnt[i][2] - par[2])) - par[3];
	ave_error /= m;

	/*free the memory*/
    if (jjinv != NULL)
	{
		free_real_matrix(jjinv,1,3,1);///
		jjinv = NULL;
	}
	if( rv != NULL)
	{
		free_real_vector(rv,1);
		rv = NULL;
	}

	return 0;

}