ILNumerics: возвращает неожиданный минимум при оптимизации функции.

Я запускаю пробную версию ILNumerics (самая новая версия на момент публикации), но получаю неправильный минимум при запуске оптимизатора Optimization.fmin.

Минимум должен быть при f(-5,218) = -3,342 с границами поиска при -10 ‹= x ‹= 10.

private void Compute()
    {
        //var function = new Func<double, double>(input =>
        //{
        //    var output = Math.Pow(input, 3) / Math.Exp(Math.Pow(input, 0.8));
        //    return output;
        //});

        Array<double> bounds = new double[] {-10.0, 10.0};
        Array<double> start = new double[] {1};
        Array<double> y = Optimization.fmin(myfunc, start, lowerBound: bounds[0], upperBound: bounds[1]);

        Console.WriteLine("The minimum is found at");
        Console.WriteLine("{0}", y);
        Console.WriteLine("The value is");
        Console.WriteLine("{0}", myfunc(y));

        Console.ReadLine();

        return;


    }

    static RetArray<double> myfunc(InArray<double> x)
    {
        var input = x.GetValue(0);
        var output = Math.Pow(input, 3) / Math.Exp(Math.Pow(input, 0.8));
        return output;
    }

person Matt    schedule 08.10.2018    source источник
comment
Какая ценность у вас есть?   -  person user492238    schedule 08.10.2018


Ответы (1)


Ваша целевая функция возвращает NaN в отрицательных позициях. Вы можете легко это проверить:

Сначала добавьте выборочные значения в целевой диапазон (-10...10) и вычислите результат целевой функции.

Array<double> bounds = new double[] { -10.0, 10.0 };
Array<double> start = new double[] { 1 };
Array<double> y = Optimization.fmin(myfunc, start, lowerBound: bounds[0], upperBound: bounds[1]);

Array<double> range = linspace(-10.0, 10, 100); 
Array<double> YinRange = apply(range, range, (a,b) => (double)myfunc(a));

Console.WriteLine("The minimum is found at");
Console.WriteLine("{0}", y);
Console.WriteLine("The value is");
Console.WriteLine("{0}", myfunc(y));

Теперь фактические значения можно визуализировать во время сеанса отладки с помощью ArrayVisualizer:

ObjectiveFunction в ArrayVizualizer

fmin вернул примерно 0, что кажется разумным, учитывая, что он пытается игнорировать значения NaN. Согласно этому графику 0 на самом деле является минимумом, и минимизатором.

См. также: MSDN по математике. .Пой

person user492238    schedule 08.10.2018
comment
Извините, вы правы. Я использовал неправильную целевую функцию. - person Matt; 20.10.2018