MATLAB.Exponenta
MATLAB и Simulink на русском
Технологии разработки и отладки
		сложных технических систем

Optimization Toolbox 2.2 Руководство пользователя

А.Г.Трифонов. Многократный вызов функции вывода информации

Для ряда задач может возникнуть необходимость вывода информации на каждом цикле оптимизационного алгоритма. Например, пусть необходимо найти последовательность точек, которые являются результатом применения некого расчетного алгоритма, а так же получить график этих значений точек. Для того, что получить данную схему, следует построить программу вывода, которая вызывается оптимизационной функцией на каждой итерации. Далее приводится пример, как это можно достигнуть.

Данный пример является продолжением примера, представленного в разделе Пример минимизации с ограничениями в форме нелинейных неравенств, в котором используется функция fmincon для решения нелинейной задачи с ограничениями. Для реализации данного примера, в первую очередь следует, как это приведено ниже, создать М-файл для целевой функции, objfcn.m, а также М-файл для ограничений, confcn.m.

На каждой итерации данная программа вывода будет осуществлять:

  • Построение графика текущей точки согласно принятому алгоритму.
  • Запоминать точку, значение соответствующей целевой функции, а также направление текущего поиска. Направлением поиска в данном случае является некий вектор, который указывает направлением от текущей точки к следующей.

По завершению алгоритма, данная программа вывода сохраняет, с возможностью просмотра, всю используемую информацию в рабочем пространстве MATLAB.

Создание программы вывода

Для построения функции вывода следует выполнить следующие операции

1.  Открыть новый М-файл в редакторе MATLA.
2.  Скопировать и записать следующие коды в М-файл. 

function stop = outfun(x,optimValues,state,varargin)
stop=[];
persistent history
persistent searchdir
hold on
switch state
    case 'init'
        history = []; searchdir = [];
    case 'iter'
% Конкатенация текущей точки и значения целевой функции 
% с history. x должен быть строчным вектором.
        history = [history;[x optimValues.fval]];
        % Конкатенация направления текущего поиска с searchdir.
        searchdir = [searchdir; optimValues.searchdirection']
        plot(x(1),x(2),'o');
        % Метки указывают номер итерации.
        text(x(1)+.15,x(2),num2str(optimValues.iteration));
    case 'done'
        assignin('base','hist', history);
        assignin('base','search', searchdir);
otherwise
end
hold off

3. Сохранить данный файл как myfunction.m в текущей рабочей директории для MATLAB.

Функция отимизации передает в myfunction следующие входные аргументы:

  • х - точка расчета по заданному алгоритму при данной текущей итерации
  • В данном примере эти точки сохраняются в матрице history и выводятся на график.
  • В примере используется следующее поле optimValues.
  • optimValues.iteration, что было номером текущей итерации, является меткой текущей точки на графике.
  • optimValues.fval есть текущее значение целевой функции в history.
  • optimValues.searchdirection есть направление текущего поиска в searchdir.
  • state - текущее состояние выполняемого алгоритма.
  • В данном примере последовательно определяется текущее состояние алгоритма и состояние выполнения алгоритма. В приводимом примере параметр состояния имеет одно из следующих значений:
  • 'init' - в алгоритме еще не начата первая итерация.
  • 'iter' - в алгоритме только что закончилось выполнение итерации.
  • 'done'- в алгоритме закончено выполнение последней итерации.
  • varargin - содержит дополнительные определяемые типом задачи входные аргументы, которые функция оптимизации может передать в myfunction.
  • В приводимом примере отсутствуют дополнительные аргументы, поэтому нет необходимости в подключении параметра varargin. Однако, в общем случае, правильно было бы это включить, так как в случае вызова функции оптимизации эти аргументы передаются в выходную функцию. Смотри Замечания по varargin.

Стоп выходного аргумента, который не используется в данном примере, возвращает флаг с информацией о выходе или продолжении итерации. Параметр стоп можно использовать для коррекции критерия, используемого в fmincon для решения об останове.

Относительно детальной информации о применении данного аргумента смотри раздел Функция вывода.

Выполнение примера

Для задания в функции fmincon на каждой итерации вызова функции вывода outfun следует установить параметр options Outputfcn в @outfun с помощью следующей команды:

options =
optimset('OutputFcn',@outfun,'LargeScale','off');

Далее для запуска примера вызывается fmincon с options в качестве входного аргумента и использовании начальной точки [-1 1]:

x0 = [-1 1];
fmincon(@objfun,x0,[],[],[],[],[],[],@confun,options)

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

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

В данном примере возвращается последовательность точек, которые согласно алгоритму вычисляются в виде матрицы hist, а так же последовательность направлений поиска в виде матрицы search. Последовательность точек может быть просмотрена после ввода hist, где координаты точек находится в первых двух колонках, а соответствующие значения целевой функции помещены в третью колонку.

hist =
   -1.0000    1.0000    1.8394
   -1.3679    1.2500    1.8513
   -5.5708    3.4699    0.3002
   -4.8000    2.2752    0.5298
   -6.7054    1.2618    0.1870
   -8.0679    1.0186    0.0729
   -9.0230    1.0532    0.0353
   -9.5471    1.0471    0.0236
   -9.5474    1.0474    0.0236

Направления поиска можно просмотреть после ввода search.

search =
   -0.3679    0.2500
   -4.2029    2.2199
    0.7708   -1.1947
   -3.8108   -2.0268
   -1.3625   -0.2432
   -0.9552    0.0346
   -0.5241   -0.0061
   -0.0003    0.0003

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

hist(2:end,1:2) -  hist(1:end-1,1:2)
ans =
   -0.3679    0.2500
   -4.2029    2.2199
    0.7708   -1.1947
   -1.9054   -1.0134
   -1.3625   -0.2432
   -0.9552    0.0346
   -0.5241   -0.0061
   -0.0003    0.0003

Замечания по varargin

Если выполнить команду fmincon в следующем представлении

fmincon(@fun,x0,[],[],[],[],[],[],@confun,options,P1,P2,...)

то fmincon передает параметры P1, P2, ... в целевую функцию, fun, функцию ограничений confun и передает их в myfunction как vargin(1), varargin(2) и т.д.


Поиск по сайту:

Система Orphus

Яндекс.Метрика