void callback(const size_t iter, void *params, const gsl_multifit_nlinear_workspace *w) { gsl_vector *f = gsl_multifit_nlinear_residual(w); gsl_vector *x = gsl_multifit_nlinear_position(w); double rcond; /* compute reciprocal condition number of J(x) */ gsl_multifit_nlinear_rcond(&rcond, w); fprintf(stderr, "iter %2zu: A = %.4f, lambda = %.4f, b = %.4f, cond(J) = %8.4f, |f(x)| = %.4f\n", iter, gsl_vector_get(x, 0), gsl_vector_get(x, 1), gsl_vector_get(x, 2), 1.0 / rcond, gsl_blas_dnrm2(f)); }
static void test_fdf_checksol(const char *sname, const char *pname, const double epsrel, gsl_multifit_nlinear_workspace *w, test_fdf_problem *problem) { gsl_multifit_nlinear_fdf *fdf = problem->fdf; const double *sigma = problem->sigma; gsl_vector *f = gsl_multifit_nlinear_residual(w); gsl_vector *x = gsl_multifit_nlinear_position(w); double sumsq; /* check solution vector x and sumsq = ||f||^2 */ gsl_blas_ddot(f, f, &sumsq); (problem->checksol)(x->data, sumsq, epsrel, sname, pname); /* check variances */ if (sigma) { const size_t n = fdf->n; const size_t p = fdf->p; size_t i; gsl_matrix * covar = gsl_matrix_alloc (p, p); gsl_matrix *J = gsl_multifit_nlinear_jac (w); gsl_multifit_nlinear_covar (J, 0.0, covar); for (i = 0; i < p; i++) { double ei = sqrt(sumsq/(n-p))*sqrt(gsl_matrix_get(covar,i,i)); gsl_test_rel (ei, sigma[i], epsrel, "%s/%s, sigma(%d)", sname, pname, i) ; } gsl_matrix_free (covar); } }