Rosenbrock関数の最適化
連続関数の最適化のベンチマークでよく登場するRosenbrock関数を使って最適化を行います。
解の初期値x= (0,0)から最適解はx = (1, 1)を見つけることができています。
#include <iostream>
#include <Eigen/Dense>
#include <cpp_robotics/optimize/no_constraint_method.hpp>
int main()
{
namespace cr = cpp_robotics;
// 2変数 Rosenbrock関数
// 最適解は x = (1, 1)
auto f = [](Eigen::VectorXd x) -> double
{
return 100*( std::pow( (x(0) - std::pow(x(1),2)), 2) ) + std::pow(1 - x(1), 2);
};
auto g = [&](const Eigen::VectorXd &x)
{
return cr::derivative(f, x);
};
Eigen::VectorXd x_init = Eigen::VectorXd::Zero(2);
{
auto [ret, rx, rcnt] = cr::quasi_newton_method(f, g, x_init);
std::cout << "optimize Rosenbrock function with quasi newton method" << std::endl;
std::cout << "ans: " << rx.transpose() << std::endl;
std::cout << "itr: " << rcnt << std::endl;
}
}
出力
optimize Rosenbrock function with quasi newton method
ans: 1 1
itr: 20