You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

MATLAB中如何查看patternsearch每次迭代的优化解x值

在Pattern Search中显示每次迭代的解x值

我完全懂你的痛点——默认的patternsearch只输出目标函数值fval,没法直接看到每次迭代的解x,对于试错式的优化来说确实不方便。其实用**自定义输出函数(Output Function)**就能轻松解决这个问题,下面是具体的实现步骤:

1. 编写自定义输出函数

创建一个名为displayXOutputFcn.m的函数文件,它会在每次迭代时捕获当前的解x并打印出来:

function stop = displayXOutputFcn(x, optimValues, state)
    stop = false; % 设置为false,让优化过程继续执行
    % 只在迭代阶段输出信息(跳过初始化、结束等状态)
    if strcmp(state, 'iter')
        fprintf('迭代 %d: 当前解 x = [', optimValues.iteration);
        fprintf('%.4f ', x); % 这里可以调整数值显示精度,比如改成%.6f
        fprintf(']\n');
    end
end

2. 在Pattern Search中启用这个输出函数

调用patternsearch时,通过optimoptions把自定义输出函数配置进去,同时保留默认的迭代显示(可选):

% 示例:假设你的目标函数是myObjective,初始点x0
x0 = [1.0; 2.5]; % 替换成你的实际初始点
% 配置优化选项
options = optimoptions('patternsearch', ...
    'OutputFcn', @displayXOutputFcn, ... % 加入自定义输出函数
    'Display', 'iter'); % 保留默认的迭代信息显示(包含fval等)
% 启动优化
[x_final, fval_final] = patternsearch(@myObjective, x0, [], [], [], [], [], [], options);

3. 进阶:保存所有迭代的x值到工作区

如果不仅想实时查看,还想把所有迭代的x值保存下来后续分析,可以用全局变量或者嵌套函数实现。这里用全局变量举个例子:

修改输出函数:

function stop = displayXOutputFcn(x, optimValues, state)
    global allIterX; % 声明全局变量用于存储所有x值
    stop = false;
    if strcmp(state, 'iter')
        fprintf('迭代 %d: 当前解 x = [', optimValues.iteration);
        fprintf('%.4f ', x);
        fprintf(']\n');
        % 将当前x以行向量形式追加到allIterX中
        allIterX = [allIterX; x'];
    end
end

然后在主脚本中初始化全局变量:

global allIterX;
allIterX = []; % 初始化空矩阵

% 后续就是之前的优化调用代码
x0 = [1.0; 2.5];
options = optimoptions('patternsearch', 'OutputFcn', @displayXOutputFcn, 'Display', 'iter');
[x_final, fval_final] = patternsearch(@myObjective, x0, [], [], [], [], [], [], options);

% 迭代结束后,allIterX里就保存了所有迭代的x值

这个方法的核心是利用patternsearch的输出函数钩子——每次迭代完成后,它都会调用你指定的输出函数,并传递当前的解x、迭代状态等信息,这样我们就能轻松捕获并显示x了。

内容的提问来源于stack exchange,提问作者Babak

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.22 08:44:08