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

如何通过Ctrl+C终止Matlab的fminsearch并保留当前最优解?

手动终止Matlab fminsearch并保留当前最优解的方法

方法1:使用输出函数(OutputFcn)保存迭代进度

这是最安全且无需修改内置函数的方案,通过自定义输出函数在每次迭代时自动保存当前最优解,即使按Ctrl+C终止,也能拿到最后一次迭代的结果。

  1. 新建一个名为saveCurrentSolution.m的函数文件,内容如下:
function stop = saveCurrentSolution(x, optimValues, state)
    stop = false; % 不终止迭代,仅执行保存操作
    % 将当前最优解和目标函数值同步到工作区
    assignin('base', 'currentBestX', x);
    assignin('base', 'currentBestFval', optimValues.fval);
    % 同时保存到本地文件,防止MATLAB意外崩溃导致数据丢失
    save('fminsearch_progress.mat', 'currentBestX', 'currentBestFval');
end
  1. 调用fminsearch时指定该输出函数:
% 替换为你的目标函数和初始猜测值
objFunc = @(x) your_objective_function(x);
initialGuess = [1, 2, 3]; 

% 配置优化选项,绑定自定义输出函数
options = optimset('OutputFcn', @saveCurrentSolution);

% 启动fminsearch
[x, fval] = fminsearch(objFunc, initialGuess, options);

当你按Ctrl+C终止程序后,工作区的currentBestX和currentBestFval就是最后一次迭代的最优解;如果MATLAB意外崩溃,也可以通过load('fminsearch_progress.mat')读取本地备份的数据。

方法2:修改fminsearch内置函数(谨慎使用)

如果需要更直接的中断处理,可以修改fminsearch的源代码,但务必先备份原文件,避免影响其他场景的使用。

  1. 在MATLAB命令行输入which fminsearch,找到函数文件路径并打开编辑。
  2. 定位到迭代循环的核心部分(通常是while循环),在循环内部插入以下代码:
% 每次迭代时保存当前解到工作区
assignin('base', 'currentX', x);
assignin('base', 'currentFval', fval);

% 捕获Ctrl+C中断,保存最终解后再抛出异常
try
    % 保留原循环内的迭代逻辑代码
catch ME
    if strcmp(ME.identifier, 'MATLAB:ctrlc')
        assignin('base', 'finalX', x);
        assignin('base', 'finalFval', fval);
        rethrow(ME); % 继续触发中断,但已提前保存解
    end
end

修改后保存文件,下次调用fminsearch时,按Ctrl+C会自动将中断前的最后一组解保存到工作区的finalX和finalFval中。

注意事项

  • 输出函数会在迭代的不同阶段触发(如init、iter、done),上述代码确保每次迭代都执行保存操作。
  • 如果目标函数计算耗时较长,保存操作的性能开销可以忽略,优先选择方法1。
  • 使用文件保存时,每次迭代会自动覆盖旧文件,避免占用过多磁盘空间。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 03:15:28