// Copyright (C) 2026 Kiyotsugu Arai // SPDX-License-Identifier: LGPL-3.0-or-later // // example_doc_optimization_samples.cpp // Verification harness for samples in api/Optimization.html (ja+en). #include #include #include #include #include #include #include #include using namespace sangi; int main() { std::cout << std::setprecision(15); // ---- Rosenbrock BFGS ----------------------------------------- { std::cout << "[Rosenbrock BFGS]\n"; auto f = [](const Vector& x) { double a = 1.0 - x[0]; double b = x[1] - x[0] * x[0]; return a * a + 100.0 * b * b; }; auto df = [](const Vector& x) -> Vector { double dx = -2.0 * (1.0 - x[0]) - 400.0 * x[0] * (x[1] - x[0] * x[0]); double dy = 200.0 * (x[1] - x[0] * x[0]); return Vector({dx, dy}); }; Vector x0({-1.0, 1.0}); auto result = bfgs_minimize, Matrix>(f, df, x0); std::cout << " minimizer = (" << result.point[0] << ", " << result.point[1] << ")\n"; std::cout << " min value = " << result.value << "\n"; std::cout << " iters = " << result.iterations << "\n"; std::cout << " success= " << std::boolalpha << result.success << "\n"; } // ---- curveFit y = a*exp(-b*x) -------------------------------- { std::cout << "[curveFit y = a*exp(-b*x)]\n"; auto model = [](double x, const Vector& p) { return p[0] * std::exp(-p[1] * x); }; std::vector xdata = {0.0, 0.5, 1.0, 1.5, 2.0, 2.5}; std::vector ydata = {5.0, 3.1, 1.8, 1.2, 0.7, 0.4}; Vector p0({4.0, 0.5}); auto result = curveFit(model, xdata, ydata, p0); std::cout << " a = " << result.parameters[0] << " +/- " << result.standardErrors[0] << "\n"; std::cout << " b = " << result.parameters[1] << " +/- " << result.standardErrors[1] << "\n"; std::cout << " chi^2/dof = " << result.reducedChiSquared << "\n"; std::cout << " iters = " << result.iterations << "\n"; } // ---- Linear programming -------------------------------------- { std::cout << "[Linear programming]\n"; LinearProgram lp; lp.objective = {1.0, 2.0}; lp.constraints = { LinearConstraint({1.0, 1.0}, ConstraintType::LessEqual, 4.0), LinearConstraint({1.0, 0.0}, ConstraintType::LessEqual, 3.0), LinearConstraint({0.0, 1.0}, ConstraintType::LessEqual, 3.0), }; auto result = simplexMaximize(lp); if (result.status == LPStatus::Optimal) { std::cout << " optimum = " << result.objectiveValue << "\n"; std::cout << " x = " << result.solution[0] << ", y = " << result.solution[1] << "\n"; } else { std::cout << " not optimal: status=" << static_cast(result.status) << "\n"; } } return 0; }