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