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.
“Столбец” Заголовков Отображения Командной строки таблицы перечисляет заголовки, которые появляются, когда вы устанавливаете Display параметр options к 'iter'.
Поле optimValues (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');