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');