如何在C++中使用DLIB的find_min_single_variable
How to use find_min_single_variable of DLIB in C++
我正在尝试在 C++[= 中使用来自 DLIB 的函数 find_min_single_variable 19=]。
对于我的示例,我需要计算 sin(X) com 0 < X < 2*pi 的最小值。结果应该是-1。但结果始终为 0。
有什么想法吗?
#include <iostream>
#include <cstdio>
#include <dlib/optimization.h>
#include <cmath>
using namespace dlib;
double my_sin(double x)
{
return std::sin(x);
}
void main()
{
// declare variables
const double begin = 0.0;
const double end = 6.28318530718;
double starting_point = 0.0;
const double eps = 1e-3;
const long max_iter = 100;
const double initial_search_radius = 0.01;
// print variables
std::cout << "result: \n" << find_min_single_variable(my_sin, starting_point, begin, end, eps, max_iter, initial_search_radius) << std::endl;
std::printf("press any key to continue \n");
std::getchar();
}
提前致谢
这是因为 0 是 sin(x) 在 0 附近的局部最小值,左边界为 0。所以它做对了,因为 dlib::find_min_single_variable() 是 局部优化器。它找到离起点最近的局部最小值。
但您真正想要的是一个全局优化器。 github 上的最新 dlib 代码包括一个针对这种情况的新优化器。如果你得到新的 dlib 代码并尝试这个:
auto result = dlib::find_min_global(my_sin, begin, end, max_function_calls(30));
cout << result.x/pi << endl;
cout << result.y << endl;
你会看到它找到 x==1.5*pi 的全局最小值,根据需要给出 sin(x)==-1。 dlib::find_min_global() 也不需要您指定任何起点或其他繁琐的参数。
我正在尝试在 C++[= 中使用来自 DLIB 的函数 find_min_single_variable 19=]。 对于我的示例,我需要计算 sin(X) com 0 < X < 2*pi 的最小值。结果应该是-1。但结果始终为 0。 有什么想法吗?
#include <iostream>
#include <cstdio>
#include <dlib/optimization.h>
#include <cmath>
using namespace dlib;
double my_sin(double x)
{
return std::sin(x);
}
void main()
{
// declare variables
const double begin = 0.0;
const double end = 6.28318530718;
double starting_point = 0.0;
const double eps = 1e-3;
const long max_iter = 100;
const double initial_search_radius = 0.01;
// print variables
std::cout << "result: \n" << find_min_single_variable(my_sin, starting_point, begin, end, eps, max_iter, initial_search_radius) << std::endl;
std::printf("press any key to continue \n");
std::getchar();
}
提前致谢
这是因为 0 是 sin(x) 在 0 附近的局部最小值,左边界为 0。所以它做对了,因为 dlib::find_min_single_variable() 是 局部优化器。它找到离起点最近的局部最小值。
但您真正想要的是一个全局优化器。 github 上的最新 dlib 代码包括一个针对这种情况的新优化器。如果你得到新的 dlib 代码并尝试这个:
auto result = dlib::find_min_global(my_sin, begin, end, max_function_calls(30));
cout << result.x/pi << endl;
cout << result.y << endl;
你会看到它找到 x==1.5*pi 的全局最小值,根据需要给出 sin(x)==-1。 dlib::find_min_global() 也不需要您指定任何起点或其他繁琐的参数。