Main Content

本页采用了机器翻译。点击此处可查看英文原文。

自定义绘图函数

关于自定义绘图函数

要使用 patternsearch 绘图函数而不是软件附带的那些绘图函数,您可以编写自己的自定义绘图函数,以在模式搜索的每次迭代中被调用来创建绘图。此示例显示如何创建一个绘图函数,显示从上一次迭代到当前迭代的最佳目标函数值的对数变化。更多绘图函数详细信息请参阅 绘图选项

创建自定义绘图函数

要为此示例创建绘图函数,请将以下代码复制并粘贴到 MATLAB® 编辑器中的新函数文件中:

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 路径上的某个文件夹中。代码解释在绘图函数的工作原理中。

设置问题

该问题与 使用 patternsearch 和 Optimize 实时编辑器任务进行约束最小化 相同。要设置问题:

  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];
    H = [36 17 19 12  8 15; 
         17 33 18 11  7 14; 
         19 18 43 13  8 16;
         12 11 13 18  6 11; 
          8  7  8  6  9  8; 
         15 14 16 11  8 29];
    
    f = [ 20 15 21 18 29 24 ]';
     
    F = @(x)0.5*x'*H*x + f'*x;
  2. 因为这是一个线性约束问题,所以将 PollMethod 选项设置为 'GSSPositiveBasis2N'。在选项中同时包含 @psplotbestf 内置绘图函数和自定义绘图函数 @psplotchange

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

使用自定义绘图函数运行优化

通过从 x0 开始调用 patternsearch 来运行示例。

[x,fval] = patternsearch(F,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')

针对 optimvalues.iteration 中包含的当前迭代,绘制当前目标函数值的变量 change

相关主题