exponenta event banner

Пользовательская функция печати

Сведения о пользовательских функциях печати

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

Создание пользовательской функции печати

Чтобы создать функцию печати для этого примера, скопируйте и вставьте следующий код в новый файл функции в редакторе MATLAB ® Editor:

function stop = psplotchange(optimvalues, flag)
% PSPLOTCHANGE Plots the change in the best objective function 
% value from the previous iteration.
  
% Best objective function value in the previous iteration
persistent last_best
 
stop = false;
if(strcmp(flag,'init')) 
        set(gca,'Yscale','log'); %Set up the plot
        hold on;
        xlabel('Iteration'); 
        ylabel('Log Change in Values');
        title(['Change in Best Function Value']);
end
 
% Best objective function value in the current iteration
best = min(optimvalues.fval);  
 
 % Set last_best to best
if optimvalues.iteration == 0
last_best = best;
        
else
        %Change in objective function value
			 change = last_best - best; 
        plot(optimvalues.iteration, change, '.r');
end

Сохранить файл как psplotchange.m в папке на пути MATLAB. Код описан в разделе Как работает функция графика.

Настройка проблемы

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

  1. В командной строке MATLAB введите следующее:

    x0 = [2 1 0 9 1 0];
    Aineq = [-8 7 3 -4 9 0];
    bineq = 7;
    Aeq = [7 1 8 3 3 3; 5 0 -5 1 -5 8; -2 -6 7 1 1 9; 1 -1 2 -2 3 -3];
    beq = [84 62 65 1];
  2. Поскольку это проблема с линейным ограничением, установите PollMethod опция для 'GSSPositiveBasis2N'. Включить оба @psplotbestf встроенная функция печати и пользовательская функция печати @psplotchange в опциях.

    options = optimoptions('patternsearch',...
        'PlotFcn',{@psplotbestf,@psplotchange},...
        'PollMethod','GSSPositiveBasis2N');

Запуск оптимизации с помощью пользовательской функции печати

Запустите пример, вызвав patternsearch начиная с x0.

[x,fval] = patternsearch(@lincontest7,x0,...
    Aineq,bineq,Aeq,beq,[],[],[],options);

Поскольку масштаб оси Y на нижнем пользовательском графике является логарифмическим, на графике отображаются только изменения, превышающие 0.

Принцип работы функции графика

Функция графика использует информацию, содержащуюся в следующих структурах.

  • optimvalues - Текущее состояние решателя, структура

  • flag - Текущее состояние алгоритма, символьный вектор

Наиболее важные операторы пользовательской функции печати, psplotchange.m, обобщены в следующей таблице.

Пользовательские инструкции функции печати

ЗаявлениеОписание
persistent last_best

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

set(gca,'Yscale','log')

Настройка графика перед запуском алгоритма.

best = min(optimvalues.fval)

Наборы best равно минимальному значению целевой функции. Область optimvalues.fval содержит значение целевой функции в текущей итерации. Переменная best - минимальное значение целевой функции. Для получения полного описания полей структуры optimvalues, см. Структура функций графика.

change = last_best - best

Задает переменную change на лучшее значение целевой функции на предыдущей итерации минус лучшее значение целевой функции в текущей итерации.

plot(optimvalues.iteration, change, '.r')

Печать переменной change при текущем значении целевой функции для текущей итерации, содержащейся вoptimvalues.iteration.

Связанные темы