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