Решатель может сообщить, что минимизация, за которой следуют, и все же решение, о котором сообщают, может быть неправильной. Для довольно тривиального примера рассмотрите минимизацию функциональный 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
.
Проверяйте, что неосуществимая точка не вызывает ошибку в ваших функциях; смотрите, что Итерации Могут Нарушить Ограничения.