output function является функцией, которую вызывает оптимизационная функция при каждой итерации своего алгоритма. Обычно вы используете выходную функцию, чтобы сгенерировать графический выход, записать историю данных, которые генерирует алгоритм, или остановить алгоритм на основе данных при текущей итерации. Можно создать выходную функцию как файл функции, локальную функцию или вложенную функцию.
Можно использовать OutputFcn опция со следующей MATLAB® Оптимизационные функции:
Ниже приведен простой пример выходной функции, которая строит графики точек, сгенерированных оптимизационной функцией.
function stop = outfun(x, optimValues, state) stop = false; hold on; plot(x(1),x(2),'.'); drawnow
Можно использовать эту выходную функцию для построения графика точек, сгенерированных fminsearch в решении задачи оптимизации
Для этого,
Создайте файл, содержащий предыдущий код, и сохраните его как outfun.m в папке по пути MATLAB.
Установите значение Outputfcn поле options структуру в указатель на функцию, для outfun.
options = optimset('OutputFcn', @outfun);Введите следующие команды:
hold on objfun=@(x) exp(x(1))*(4*x(1)^2+2*x(2)^2+x(1)*x(2)+2*x(2)); [x fval] = fminsearch(objfun, [-1 1], options) hold off
Эти команды возвращают решение
x =
0.1290 -0.5323
fval =
-0.5689и отобразите следующий график точек, сгенерированных fminsearch:

Линия определения функции выходной функции имеет следующую форму:
stop = outfun(x, optimValues, state)
где
stop является флагом, который true или false в зависимости от того, остановлена или продолжается стандартная программа оптимизации. См. «Стоп-флаг».
x - точка, вычисленная алгоритмом при текущей итерации.
optimValues - структура, содержащая данные текущей итерации. Поля в optimValues подробно описывают структуру.
state - текущее состояние алгоритма. Состояния Алгоритма перечисляют возможные значения.
Оптимизационная функция передает значения входных параметров в outfun при каждой итерации.
Пример в Создании и использовании Выходной функции не требует, чтобы выходная функция сохраняла данные от одной итерации к следующей. Когда вам не нужно сохранять данные между итерациями, можно записать выходную функцию как файл функции и вызвать оптимизационную функцию непосредственно из командной строки. Однако, чтобы иметь выходную функцию для записи данных с одной итерации на следующую, запишите один файл, который делает следующее:
Содержит выходную функцию как вложенную функцию - см. «Вложенные функции в основах программирования MATLAB» для получения дополнительной информации.
Вызывает оптимизационную функцию.
В следующем примере файл функции также содержит целевую функцию как локальную функцию. Можно вместо этого записать целевую функцию как отдельный файл или как анонимную функцию.
Вложенные функции имеют доступ к переменным в окружающем файле. Поэтому этот метод позволяет выходной функции сохранять переменные от одной итерации к следующей.
В следующем примере используется выходная функция для записи fminsearch итерация в решении
Выходная функция возвращает последовательность точек как матрицу, называемую history.
Чтобы запустить пример, выполните следующие шаги:
Откройте новый файл в редакторе MATLAB.
Скопируйте и вставьте в файл следующий код.
function [x fval history] = myproblem(x0)
history = [];
options = optimset('OutputFcn', @myoutput);
[x fval] = fminsearch(@objfun, x0,options);
function stop = myoutput(x,optimvalues,state);
stop = false;
if isequal(state,'iter')
history = [history; x];
end
end
function z = objfun(x)
z = exp(x(1))*(4*x(1)^2+2*x(2)^2+x(1)*x(2)+2*x(2));
end
endСохраните файл следующим myproblem.m в папке по пути MATLAB.
В подсказке MATLAB введите
[x fval history] = myproblem([-1 1]);
Функция fminsearch возвращает x, оптимальную точку и fval, значение целевой функции в x.
x,fval
x =
0.1290 -0.5323
fval =
-0.5689В сложение выходная функция myoutput возвращает матрицу history, который содержит точки, сгенерированные алгоритмом при каждой итерации, в рабочее пространство MATLAB. Первые четыре строки history являются
history(1:4,:) ans = -1.0000 1.0000 -1.0000 1.0000 -1.0750 0.9000 -1.0125 0.8500
Последняя строка точек в history совпадает с оптимальной точкой, x.
history(end,:)
ans =
0.1290 -0.5323
objfun(history(end,:))
ans =
-0.5689В следующей таблице перечислены поля optimValues структуры, которые обеспечиваются оптимизационными функциями fminbnd, fminsearch, и fzero.
В столбце «Command-Line Display Headings» таблицы перечислены заголовки, которые появляются при установке Display параметр options на 'iter'.
optimValues Field (optimValues.field) | Описание | Заголовок отображения командной строки |
|---|---|---|
| Совокупное количество вычислений функции |
|
| Значение функции в текущей точке |
|
| Число итерации - начинается с |
|
| Сообщения о процедуре |
|
В следующей таблице перечислены возможные значения для state:
Государство | Описание |
|---|---|
| Алгоритм находится в начальном состоянии перед первой итерацией. |
| Алгоритм выполняет итерацию. В этом состоянии выходная функция может остановить текущую итерацию оптимизации. Можно хотеть, чтобы выходная функция остановила итерацию, чтобы улучшить эффективность расчетов. Когда состояние установлено в |
| Алгоритм находится в конце итерации. |
| Алгоритм находится в конечном состоянии после последней итерации. |
Следующий код иллюстрирует, как выходная функция использует значение state решить, какие задачи выполнять при текущей итерации.
switch state
case 'init'
% Setup for plots or dialog boxes
case 'iter'
% Make updates to plots or dialog boxes as needed
case 'interrupt'
% Check conditions to see whether optimization
% should quit
case 'done'
% Cleanup of plots, dialog boxes, or final plot
endВыходной аргумент stop является флагом, который true или false. Флаг сообщает оптимизационной функции, остановка оптимизации (true) или продолжается (false). В следующих примерах показаны типичные способы использования stop флаг.
Выходная функция может остановить оптимизацию при любой итерации, основанной на текущих данных в optimValues. Для примера следующий код устанавливает stop на true если значение целевой функции меньше 5:
function stop = myoutput(x, optimValues, state)
stop = false;
% Check if objective function is less than 5.
if optimValues.fval < 5
stop = true;
endЕсли вы проектируете пользовательский интерфейс для выполнения оптимизации, можно иметь выходную функцию, останавливающую оптимизацию, например, с помощью кнопки Stop. Следующий код показывает, как выполнить этот коллбэк. Код принимает, что коллбэк кнопки Stop сохраняет значение true в optimstop поле handles структура, называемая hObject хранится в appdata.
function stop = myoutput(x, optimValues, state) stop = false; % Check if user has requested to stop the optimization. stop = getappdata(hObject,'optimstop');