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); }
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; }