#include #include #include #include #include #include #include Eigen::VectorX autoopt::fit_ellipse( const std::vector>& data, const Eigen::VectorX& initial_params, const Eigen::VectorX& delta) { auto opt_func = [&](const Eigen::VectorX& params) { ellipse ellip(params(0), params(1), params(2)); quadric quad = ellip.to_quadric().rotated_by(params(3)); T error = T(0); for (const auto& [x, y] : data) { T y_fit = quad.slope_at(T(x)); error = error + (y_fit - T(y)) * (y_fit - T(y)); } return error / T(data.size()); }; auto_diff_optimization_problem problem(opt_func, initial_params); log_barrier_optimization_problem lb_problem(problem, delta, 1e-4); while (lb_problem._barrier_strength > 1e-20) { btls(lb_problem); lb_problem._barrier_strength *= 1e-2; } Eigen::VectorX fitted_params = problem.x(); std::cout << "Fitted parameters: " << std::setprecision(10) << fitted_params.transpose() << std::endl; double obj_value = problem.objective(fitted_params); std::cout << "Objective value: " << obj_value << std::endl; // rms in radians std::cout << "RMS error: " << std::sqrt(obj_value) << " radians" << std::endl; // rms in arcsec double rms_arcsec = std::sqrt(obj_value) * (3600.0 * 180.0 / M_PI); std::cout << "RMS error: " << rms_arcsec << " arcsec" << std::endl; return fitted_params; } Eigen::VectorX autoopt::fit_parabola( const std::vector>& data, const Eigen::VectorX& initial_params, const Eigen::VectorX& delta) { auto opt_func = [&](const Eigen::VectorX& params) { parabola parab(params(0), params(1)); quadric quad = parab.to_quadric().rotated_by(params(2)); T error = T(0); for (const auto& [x, y] : data) { T y_fit = quad.slope_at(T(x)); error = error + (y_fit - T(y)) * (y_fit - T(y)); } return error / T(data.size()); }; auto_diff_optimization_problem problem(opt_func, initial_params); log_barrier_optimization_problem lb_problem(problem, delta, 1e-4); while (lb_problem._barrier_strength > 1e-20) { btls(lb_problem); lb_problem._barrier_strength *= 1e-2; } Eigen::VectorX fitted_params = problem.x(); std::cout << "Fitted parameters: " << std::setprecision(10) << fitted_params.transpose() << std::endl; double obj_value = problem.objective(fitted_params); std::cout << "Objective value: " << obj_value << std::endl; // rms in radians std::cout << "RMS error: " << std::sqrt(obj_value) << " radians" << std::endl; // rms in arcsec double rms_arcsec = std::sqrt(obj_value) * (3600.0 * 180.0 / M_PI); std::cout << "RMS error: " << rms_arcsec << " arcsec" << std::endl; return fitted_params; }