Я пытаюсь использовать функцию find_min_single_variable от DLIB в C ++.
Для моего примера мне нужно вычислить min of sin (X) com 0 < Икс < 2 * пи. Результат должен быть -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 () является локальный оптимизатор. Он находит ближайший локальный минимизатор к начальной точке.
Но то, что вы действительно хотите, это глобальный оптимизатор. Новейший dlib-код на github включает новый оптимизатор именно для такого случая. Если вы получили новый код 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 * пи, давая sin (x) == — 1 по желанию. dlib :: find_min_global () также не требует от вас указания какой-либо начальной точки или других утомительных параметров.
Других решений пока нет …