如何在C ++中使用DLIB的find_min_single_variable

时间:2017-12-12 17:22:20

标签: c++ optimization dlib minimization

我尝试在 C ++ 中使用 DLIB 中的 find_min_single_variable 功能。 对于我的例子,我需要计算罪的最小值(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();
}

提前谢谢

1 个答案:

答案 0 :(得分:0)

这是因为0是sin(x)的局部最小化,在0附近,左边界为0.所以它正在做正确的事情,因为dlib :: find_min_single_variable()是本地优化器< / em>的。它找到最近的局部最小化器到起点。

但你真正想要的是全局优化器。 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的全局min,根据需要给出sin(x)== - 1。 dlib :: find_min_global()也不要求您指定任何起点或其他繁琐的参数。