Matlab 获取每次迭代的fminsearch函数调用数
此代码将找到我的esm6函数的本地最小值,由于“显示”选项,它将输出如下字符串 迭代函数计数最小f(x)过程Matlab 获取每次迭代的fminsearch函数调用数,matlab,fminsearch,Matlab,Fminsearch,此代码将找到我的esm6函数的本地最小值,由于“显示”选项,它将输出如下字符串 迭代函数计数最小f(x)过程 01 36.9193 1 5 35.9815初始单工 2 7 35.4924内部合同 3.9 35.4924内部合同 4 11 33.0085扩展 因此,在命令窗口中,我得到每个迭代步骤的函数计数。由fminsearch创建的结构输出,其中只有func计数的总量。是否有一种方法可以接收所有在命令窗口和输出结构中输出的信息 编辑: 我想我已经接近解决方案了。我编写了这个输出函数: opti
01 36.9193
1 5 35.9815初始单工
2 7 35.4924内部合同
3.9 35.4924内部合同
4 11 33.0085扩展 因此,在命令窗口中,我得到每个迭代步骤的函数计数。由fminsearch创建的结构
输出
,其中只有func计数的总量。是否有一种方法可以接收所有在命令窗口和输出结构中输出的信息
编辑:我想我已经接近解决方案了。我编写了这个输出函数:
options = optimset('Display','iter','MaxIter',3,'OutputFcn',@outfun);
[x,fval,~,output] = fminsearch(@(param) esm6(param,identi),result(k,1:end-1),options);
因为这应该是可行的,但事实上,matlab告诉我
???对不存在的字段“funcount”的引用
你知道为什么会发生这种情况吗?很肯定这不会解决你的问题,但是在比较字符串时,你应该使用
isequal
而不是=
。你可以通过写mystruct.field1
,mystruct.field2
,。。。因此,您的错误意味着optimvalues
是一个具有不同字段的结构,但没有名为funcount的字段。检查代码中定义optimvalues
的部分。顺便说一下,我不太理解您的输出函数。您将stop
定义为输出,但stop将始终等于0,因此该函数非常无用。@BillBokeey:strcmp
可能是首选方法。@Max:联机文档适用于最新版本的Matlab。您是否查阅了本地版本文档,以确认输出函数的工作方式和参数相同?您是否尝试过将大小写降低到optimvalues.funcount
?我认为在optimvalues
和output
结构中,字段的大写形式可能不同。这肯定不会解决您的问题,但在比较字符串时,您应该使用isequal
而不是=
当您通过写入mystruct.field1
,mystruct.field2
,。。。因此,您的错误意味着optimvalues
是一个具有不同字段的结构,但没有名为funcount的字段。检查代码中定义optimvalues
的部分。顺便说一下,我不太理解您的输出函数。您将stop
定义为输出,但stop将始终等于0,因此该函数非常无用。@BillBokeey:strcmp
可能是首选方法。@Max:联机文档适用于最新版本的Matlab。您是否查阅了本地版本文档,以确认输出函数的工作方式和参数相同?您是否尝试过将大小写降低到optimvalues.funcount
?我认为该字段在optimvalues
和output
结构中的大写形式可能不同。
function stop = outfun(x,optimvalues,state);
stop = false;
if state == 'iter'
history = evalin('base','history');
history = [history; optimvalues.iteration optimvalues.funcCount];
assignin('base','history',history);
end
end