我有一个非常耗时的优化问题,我需要做很多次(这对我来说这是一个试错法)。但是,我不想等待最终结果。我需要在每次迭代时看到优化的结果。更具体地说,我想看到x值(解决方案)并且对fval不太感兴趣(x处的目标函数值)。不幸的是,patternsearch只显示fval,而不是每次迭代时的优化解决方案。我知道我应该通过"输出功能"来解决这个问题。并花了很多时间,无法理解如何做到这一点。为了方便你,让我们考虑以下简单的优化问题:
options = optimoptions('patternsearch');
options = optimoptions(options,'Display', 'iter','TolX',1e-6);
x0=2;lb=-3;ub=3;
x = patternsearch(@(x)x^2,x0,[],[],[],[],lb,ub,[],options);
我们在命令窗口中看到的前几行如下所示:
Iter f-count f(x) MeshSize Method
0 1 4 1
1 2 4 0.5 Refine Mesh
2 3 0 1 Successful Poll
不幸的是,我对x没什么看法。
请您更改我的代码,以便我也可以在每次迭代时看到解决方案(x),非常感谢!
巴巴克
答案 0 :(得分:0)
function [stop,options,optchanged] = fun(optimvalues,options,flag)
的有效输出函数处理程序应指定如下:
options = optimoptions('patternsearch');
options = optimoptions(options,'Display','iter','OutputFcns',@custom,'TolX',1e-6);
x0 = 2; lb = -3; ub = 3;
x = patternsearch(@(x)x^2,x0,[],[],[],[],lb,ub,[],options);
function [stop,options,optchanged] = custom(optimvalues,options,flag)
stop = false;
optchanged = false;
if (strcmp(flag,'iter'))
disp([' Iteration performed for X=' num2str(optimvalues.x)]);
end
end
以下代码应足以显示您要查找的信息:
Iter Func-count f(x) MeshSize Method
0 1 4 1
Iteration performed for X=2
1 2 4 0.5 Refine Mesh
Iteration performed for X=0
2 3 0 1 Successful Poll
Iteration performed for X=0
3 3 0 0.5 Refine Mesh
Iteration performed for X=0
4 5 0 0.25 Refine Mesh
Iteration performed for X=0
...
这是输出:
{{1}}
这只是一个例子,当然,您可以调整功能,以便以您喜欢的方式显示文本。