Выходная функция - это функция, которую функция оптимизации вызывает при каждой итерации своего алгоритма. Как правило, функция вывода используется для создания графического вывода, записи истории данных, генерируемых алгоритмом, или остановки алгоритма на основе данных в текущей итерации. Функцию вывода можно создать как файл функции, локальную функцию или вложенную функцию.
Вы можете использовать OutputFcn со следующими функциями оптимизации MATLAB ®:
Ниже приведен простой пример функции вывода, отображающей точки, сгенерированные функцией оптимизации.
function stop = outfun(x, optimValues, state) stop = false; hold on; plot(x(1),x(2),'.'); drawnow
Эту функцию вывода можно использовать для построения графиков точек, генерируемых fminsearch в решении задачи оптимизации
x1x2 + 2x2).
Для этого
Создайте файл, содержащий предыдущий код, и сохраните его как 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 на каждой итерации.
В примере Создание и использование функции вывода (Creating and Using an Output Function) не требуется, чтобы функция вывода сохраняла данные из одной итерации в другую. Если не требуется сохранять данные между итерациями, можно записать функцию вывода как файл функции и вызвать функцию оптимизации непосредственно из командной строки. Однако, чтобы иметь функцию вывода для записи данных из одной итерации в следующую, запишите один файл, который выполняет следующие действия:
Содержит функцию вывода в виде вложенной функции - дополнительные сведения см. в разделе Вложенные функции в основах программирования MATLAB.
Вызывает функцию оптимизации.
В следующем примере файл функции также содержит целевую функцию как локальную функцию. Вместо этого можно записать целевую функцию как отдельный файл или как анонимную функцию.
Вложенные функции имеют доступ к переменным в окружающем файле. Поэтому этот метод позволяет функции вывода сохранять переменные из одной итерации в следующую.
В следующем примере функция вывода используется для записи fminsearch итерации при решении
x1x2 + 2x2).
Функция вывода возвращает последовательность точек в виде матрицы с именем 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 (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');