Чтобы использовать функцию печати, отличную от тех, которые включены в программу, можно написать собственную пользовательскую функцию печати, которая вызывается в каждой итерации поиска массива для создания печати. В этом примере показано, как создать функцию графика, отображающую логарифмическое изменение значения лучшей целевой функции от предыдущей итерации к текущей итерации. Дополнительные сведения о функции печати можно найти в разделе «Параметры печати».
Чтобы создать функцию печати для этого примера, скопируйте и вставьте следующий код в новый файл функции в редакторе 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. Код описан в разделе Как работает функция графика.
Проблема аналогична задаче «Минимизация с ограничением с помощью поиска массива» и «Оптимизировать оперативный редактор». Чтобы настроить проблему, выполните следующие действия.
В командной строке 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];
Поскольку это проблема с линейным ограничением, установите 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 | Создание постоянной переменной |
set(gca,'Yscale','log') | Настройка графика перед запуском алгоритма. |
best = min(optimvalues.fval) | Наборы |
change = last_best - best | Задает переменную |
plot(optimvalues.iteration, change, '.r') | Печать переменной |