Для некоторых проблем вы можете хотеть вывод от алгоритма оптимизации в каждой итерации. Например, вы можете хотеть найти последовательность точек, что алгоритм вычисляет, и постройте те точки. Для этого создайте выходную функцию, которую вызывает на каждой итерации оптимизационная функция. Смотрите Синтаксис Выходной функции и Функции построения графика для деталей и синтаксис.
Этот раздел показывает основанный на решателе подход к выходным функциям. Для подхода, основанного на проблеме смотрите Выходную функцию для Основанной на проблеме Оптимизации.
Обычно решатели, которые могут использовать выходную функцию, являются теми, которые могут взять нелинейные функции в качестве входных параметров. Можно определить, какие решатели могут иметь выходную функцию посмотрев в разделе Options страниц ссылки на функцию.
В этом примере показано, как использовать выходную функцию, чтобы контролировать fmincon
процесс решения для решения ограниченной нелинейной задачи оптимизации. Выходная функция делает следующее в конце каждого fmincon
итерация:
Постройте текущую точку.
Сохраните текущую точку и ее соответствующее значение целевой функции в переменной под названием history
, и сохраните текущее поисковое направление в переменной под названием searchdir
. Поисковое направление является вектором, который указывает в направлении от текущей точки до следующей.
Кроме того, сделать историю доступной за пределами fmincon
функционируйте, выполните оптимизацию во вложенной функции, которая вызывает fmincon
и возвращает переменные выходной функции. Для получения дополнительной информации об этом методе передающей информации, смотрите Передающие Дополнительные Параметры. runfmincon
функция в конце этого примера содержит вызов вложенной функции.
Проблема состоит в том, чтобы минимизировать функцию
подвергните нелинейным ограничениям неравенства
objfun
функция вкладывается в runfmincon
реализует целевую функцию. confun
функция вкладывается в runfmincon
реализует ограничительную функцию.
Получить решение проблемы и видеть историю fmincon
итерации, вызовите runfmincon
функция.
[xsol,fval,history,searchdir] = runfmincon;
Max Line search Directional First-order Iter F-count f(x) constraint steplength derivative optimality Procedure 0 3 1.8394 0.5 Infeasible start point 1 6 1.85127 -0.09197 1 0.109 0.778
2 9 0.300167 9.33 1 -0.117 0.313 Hessian modified twice
3 12 0.529835 0.9209 1 0.12 0.232
4 16 0.186965 -1.517 0.5 -0.224 0.13
5 19 0.0729085 0.3313 1 -0.121 0.054
6 22 0.0353323 -0.03303 1 -0.0542 0.0271
7 25 0.0235566 0.003184 1 -0.0271 0.00587
8 28 0.0235504 9.031e-08 1 -0.0146 8.51e-07
Active inequalities (to within options.ConstraintTolerance = 1e-06): lower upper ineqlin ineqnonlin 1 2
Local minimum found that satisfies the constraints. Optimization completed because the objective function is non-decreasing in feasible directions, to within the value of the optimality tolerance, and constraints are satisfied to within the value of the constraint tolerance.
Выходная функция создает график точек что fmincon
оценивает. Каждая точка помечена ее номером итерации. Оптимальная точка происходит в восьмой итерации. Последние две точки в последовательности так близки, что они перекрываются.
Выход history
структура, которая содержит два поля.
disp(history)
x: [9x2 double] fval: [9x1 double]
fval
поле в history
содержит значения целевой функции, соответствующие последовательности точек fmincon
вычисляет.
disp(history.fval)
1.8394 1.8513 0.3002 0.5298 0.1870 0.0729 0.0353 0.0236 0.0236
Это те же значения, отображенные в итеративном выходе в столбце с заголовком f(x)
.
x
поле history
содержит последовательность точек что fmincon
вычисляет.
disp(history.x)
-1.0000 1.0000 -1.3679 1.2500 -5.5708 3.4699 -4.8000 2.2752 -6.7054 1.2618 -8.0679 1.0186 -9.0230 1.0532 -9.5471 1.0471 -9.5474 1.0474
Второй выходной аргумент, searchdir
, содержит поисковые направления для fmincon
в каждой итерации. Поисковое направление является вектором, указывающим от точки, вычисленной в текущей итерации к точке, вычисленной в следующей итерации.
disp(searchdir)
-0.3679 0.2500 -4.2029 2.2199 0.7708 -1.1947 -3.8108 -2.0268 -1.3625 -0.2432 -0.9552 0.0346 -0.5241 -0.0061 -0.0003 0.0003
Следующий код создает runfmincon
функция, содержа outfun
выходная функция, objfun
целевая функция и confun
нелинейная ограничительная функция как вложенные функции,
function [xsol,fval,history,searchdir] = runfmincon % Set up shared variables with OUTFUN history.x = []; history.fval = []; searchdir = []; % call optimization x0 = [-1 1]; options = optimoptions(@fmincon,'OutputFcn',@outfun,... 'Display','iter','Algorithm','active-set'); [xsol,fval] = fmincon(@objfun,x0,[],[],[],[],[],[],@confun,options); function stop = outfun(x,optimValues,state) stop = false; switch state case 'init' hold on case 'iter' % Concatenate current point and objective function % value with history. x must be a row vector. history.fval = [history.fval; optimValues.fval]; history.x = [history.x; x]; % Concatenate current search direction with % searchdir. searchdir = [searchdir;... optimValues.searchdirection']; plot(x(1),x(2),'o'); % Label points with iteration number and add title. % Add .15 to x(1) to separate label from plotted 'o' text(x(1)+.15,x(2),... num2str(optimValues.iteration)); title('Sequence of Points Computed by fmincon'); case 'done' hold off otherwise end end function f = objfun(x) f = exp(x(1))*(4*x(1)^2 + 2*x(2)^2 + 4*x(1)*x(2) +... 2*x(2) + 1); end function [c, ceq] = confun(x) % Nonlinear inequality constraints c = [1.5 + x(1)*x(2) - x(1) - x(2); -x(1)*x(2) - 10]; % Nonlinear equality constraints ceq = []; end end