Выходные функции

Что такое выходная функция?

output function является функцией что оптимизация вызовы функции в каждой итерации ее алгоритма. Как правило, вы используете выходную функцию, чтобы сгенерировать вывод графических данных, записать историю данных, которые генерирует алгоритм, или остановите алгоритм на основе данных в текущей итерации. Можно создать выходную функцию как файл функции, локальную функцию или вложенную функцию.

Можно использовать опцию OutputFcn со следующими функциями оптимизации MATLAB®:

Создавая и Используя выходную функцию

Следующее является простым примером выходной функции, которая строит точки, сгенерированные функцией оптимизации.

function stop = outfun(x, optimValues, state)
stop = false;
hold on;
plot(x(1),x(2),'.');
drawnow

Можно использовать эту выходную функцию, чтобы построить точки, сгенерированные fminsearch в решении задачи оптимизации

minxf(x)=minxex1(4x12+2x22+x1x2+2x2).

Для этого

  1. Создайте файл, содержащий предыдущий код, и сохраните его как outfun.m в папке на пути MATLAB.

  2. Установите значение поля Outputfcn структуры options к указателю на функцию к outfun.

    options = optimset('OutputFcn', @outfun);
  3. Введите следующие команды:

    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 выполняет итерации в решении

minxf(x)=minxex1(4x12+2x22+x1x2+2x2).

Выходная функция возвращает последовательность точек как матрица под названием history.

Чтобы запустить пример, сделайте следующие шаги:

  1. Откройте новый файл в редакторе MATLAB.

  2. Скопируйте и вставьте следующий код в файл.

    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
  3. Сохраните файл как myproblem.m в папке на пути MATLAB.

  4. В посдказке 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

В следующей таблице перечислены поля структуры optimValues, которые обеспечиваются функциями оптимизации fminbnd, fminsearch и fzero.

“Столбец” Заголовков Отображения Командной строки таблицы перечисляет заголовки, которые появляются, когда вы устанавливаете параметр Display options к 'iter'.

Поле optimValues (optimValues.field)

Описание

Заголовок отображения командной строки

funccount

Совокупное число функциональных оценок

Func-count

fval

Значение функции в текущей точке

min f(x)

iteration

Номер итерации — запускается в 0

Iteration

procedure

Сообщения процедуры

Procedure

Состояния алгоритма

В следующей таблице перечислены возможные значения для state:

Состояние

Описание

'init'

Алгоритм находится в начальном состоянии перед первой итерацией.

'interrupt'

Алгоритм выполняет итерацию. В этом состоянии выходная функция может остановить текущую итерацию оптимизации. Вы можете хотеть, чтобы выходная функция остановила итерацию, чтобы повысить эффективность вычислений. Когда состояние установлено в 'interrupt', значения x и optimValues эквивалентны при последней возможности к выходной функции, в которой state установлен в 'iter'.

'iter'

Алгоритм в конце итерации.

'done'

Алгоритм находится в конечном состоянии после последней итерации.

Следующий код иллюстрирует, как выходная функция использует значение 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

Выходная функция может остановить оптимизацию в любой итерации на основе текущих данных в 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');

Похожие темы