122 auto adata =
std::tie(parameter_manager, residual_estimator);
125 const gsl_multifit_nlinear_type *
type = gsl_multifit_nlinear_trust;
130 gsl_multifit_nlinear_parameters params = gsl_multifit_nlinear_default_parameters();
134 params.trs = gsl_multifit_nlinear_trs_lm;
137 params.scale = gsl_multifit_nlinear_scale_levenberg;
139 params.solver = gsl_multifit_nlinear_solver_cholesky;
141 params.fdtype = GSL_MULTIFIT_NLINEAR_FWDIFF;
146 gsl_multifit_nlinear_workspace *workspace = gsl_multifit_nlinear_alloc(
150 if (workspace ==
nullptr) {
157 gsl_vector_view gsl_param_view = gsl_vector_view_array(param_values.
data(), param_values.
size());
160 auto function = [](
const gsl_vector *x,
void *extra, gsl_vector *f) ->
int {
161 auto *extra_ptr = (
decltype(adata) *) extra;
168 gsl_multifit_nlinear_fdf fdf;
177 gsl_multifit_nlinear_init(&gsl_param_view.vector, &fdf, workspace);
181 gsl_vector *residual = gsl_multifit_nlinear_residual(workspace);
182 gsl_blas_ddot(residual, residual, &chisq0);
187 int ret = gsl_multifit_nlinear_driver(
202 gsl_blas_ddot(residual, residual, &chisq);
211 summary.
iteration_no = gsl_multifit_nlinear_niter(workspace);
216 gsl_matrix *J = gsl_multifit_nlinear_jac(workspace);
217 gsl_matrix_view covar = gsl_matrix_view_array(covariance_matrix.
data(), parameter_manager.
numberOfParameters(),
219 gsl_multifit_nlinear_covar(J, 0.0, &covar.matrix);
225 for (
size_t i = 0; i < residual->size; ++i) {
226 auto v = gsl_vector_get(residual, i);
229 sigma2 /= (fdf.n - fdf.p);
231 for (
auto ci = covariance_matrix.
begin(); ci != covariance_matrix.
end(); ++ci) {
241 int levmar_reason = 0;
242 if (ret == GSL_SUCCESS) {
243 levmar_reason = (info == 1) ? 2 : 1;
245 else if (ret == GSL_EMAXITER) {
252 gsl_blas_dnrm2(workspace->g),
253 gsl_blas_dnrm2(workspace->dx),
256 static_cast<double>(levmar_reason),
257 static_cast<double>(fdf.nevalf),
258 static_cast<double>(fdf.nevaldf),
263 gsl_multifit_nlinear_free(workspace);
GSLEngine(int itmax=1000, double xtol=1e-8, double gtol=1e-8, double ftol=1e-8, double delta=1e-4)
Constructs a new instance of the engine.