Решатель может сообщить, что минимизация выполнена успешно, но решение, о котором сообщается, может быть неверным. Для довольно тривиального примера рассмотрите возможность минимизации функции f (x ) = x3 для x между -2 и 2, начиная с точки1/3:
options = optimoptions('fmincon','Algorithm','active-set');
ffun = @(x)x^3;
xfinal = fmincon(ffun,1/3,[],[],[],[],-2,2,[],options)
Local minimum found that satisfies the constraints.
Optimization completed because the objective function is
non-decreasing in feasible directions, to within the default
valueof the function tolerance, and constraints were satisfied
to within the default value of the constraint tolerance.
No active inequalities.
xfinal =
-1.5056e-008Истинный минимум имеет место при x = -2. fmincon дает этот отчет, потому что функция f (x) настолько плоская около x = 0.
Другой распространенной проблемой является то, что решатель находит локальный минимум, но может потребоваться глобальный минимум. Дополнительные сведения см. в разделе Локальная и глобальная оптимизация.
Урок: проверьте результаты, даже если решатель сообщает, что он «нашел» локальный минимум, или «решил» уравнение.
В этом разделе приведены методы проверки результатов.
Начальная точка может оказать большое влияние на решение. Если вы получаете одинаковые или худшие решения из различных начальных точек, вы становитесь более уверенным в своем решении.
Например, минимизировать f (x ) = x3 + x4, начиная с точки 1/4:
ffun = @(x)x^3 + x^4;
options = optimoptions('fminunc','Algorithm','quasi-newton');
[xfinal fval] = fminunc(ffun,1/4,options)
Local minimum found.
Optimization completed because the size of the gradient
is less than the default value of the function tolerance.
x =
-1.6764e-008
fval =
-4.7111e-024Измените начальную точку на небольшую величину, и решатель найдет лучшее решение:
[xfinal fval] = fminunc(ffun,1/4+.001,options) Local minimum found. Optimization completed because the size of the gradient is less than the default value of the function tolerance. xfinal = -0.7500 fval = -0.1055
x = -0.75 является глобальным решением; начиная с других точек, не может улучшить решение.
Дополнительные сведения см. в разделе Локальная и глобальная оптимизация.
Чтобы увидеть, есть ли лучшие значения, чем сообщаемое решение, оцените свою целевую функцию и ограничения в различных ближайших точках.
Например, с помощью целевой функции ffun из «Что может быть не так, если решатель добьется успеха?» и заключительная точка xfinal = -1.5056e-008, рассчитать ffun(xfinal±Δ) для некоторых Δ:
delta = .1; [ffun(xfinal),ffun(xfinal+delta),ffun(xfinal-delta)] ans = -0.0000 0.0011 -0.0009
Целевая функция ниже при ffun(xfinal-Δ)поэтому решатель сообщил о неверном решении.
Менее тривиальный пример:
options = optimoptions(@fmincon,'Algorithm','active-set');
lb = [0,-1]; ub = [1,1];
ffun = @(x)(x(1)-(x(1)-x(2))^2);
[x fval exitflag] = fmincon(ffun,[1/2 1/3],[],[],[],[],...
lb,ub,[],options)
Local minimum found that satisfies the constraints.
Optimization completed because the objective function is
non-decreasing in feasible directions, to within the default
valueof the function tolerance, and constraints were satisfied
to within the default value of the constraint tolerance.
Active inequalities (to within options.ConstraintTolerance = 1e-006):
lower upper ineqlin ineqnonlin
1
x =
1.0e-007 *
0 0.1614
fval =
-2.6059e-016
exitflag =
1Оценка ffun в близлежащих возможных точках показывает, что решение x не является истинным минимумом:
[ffun([0,.001]),ffun([0,-.001]),...
ffun([.001,-.001]),ffun([.001,.001])]
ans =
1.0e-003 *
-0.0010 -0.0010 0.9960 1.0000Первые два перечисленных значения меньше вычисленного минимума fval.
При наличии лицензии Global Optimization Toolbox можно использовать patternsearch (Global Optimization Toolbox) для проверки ближайших точек.
Дважды проверьте целевую функцию и функции ограничения, чтобы убедиться, что они соответствуют задаче, которую требуется решить. Предложения:
Проверьте оценку целевой функции в нескольких точках.
Проверьте, что каждое ограничение неравенства имеет правильный знак.
Если вы выполнили максимизацию, не забудьте взять негатив от сообщенного решения. (Этот совет предполагает, что вы максимизировали функцию, минимизировав негатив цели.) Например, чтобы максимизировать f (x ) = x - x2, минимизировать g ( x) = -x + x2:
options = optimoptions('fminunc','Algorithm','quasi-newton');
[x fval] = fminunc(@(x)-x+x^2,0,options)
Local minimum found.
Optimization completed because the size of the gradient is
less than the default value of the function tolerance.
x =
0.5000
fval =
-0.2500Максимальное значение f равно 0,25, отрицательное значение fval.
Убедитесь, что неосуществимая точка не вызывает ошибки в функциях; см. раздел Итерации могут нарушать ограничения.