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