我在Matlab中有这个函数,它应该通过改变inValues的两个初始设置值来找到minValuePossible可能的最小值。如何在尝试查找最小值时将fmin搜索功能设置为不尝试负值?另外,如何设置fminsearch函数在尝试查找最小值时执行的不同变体的数量?因为目前它尝试在两个inValues中的大约20种不同组合的某处,然后完成。也许定义它改变每个值的数量?我该怎么做?
function Valueminimiser
inValues = [50,50];
minValuePossible = fminsearch(@minimiser, inValues);
function result = minimiser(inValues)
x=inValues(1);
y=inValues(2);
RunMode = 2;
ValueOne = x;
ValueTwo = y;
[maxSCRAout] = main(RunMode,ValueOne,ValueTwo);
result = minValuePossible;
end
end
答案 0 :(得分:4)
如何在尝试查找最小值时将fmin搜索功能设置为不尝试负值?
在开头添加最小化函数值的约束。如果您遇到此约束,则返回最小化器的巨大函数值。这将阻止fminsearch考虑不符合您兴趣的数字:
function result = minimiser(inValues)
if (sum(inValues < 0) > 1) % check if there is any negative number in input variable
result = hugeValue; % give a big value to the result
return; % return to fminsearch - do not execute the rest of the code
end
x=inValues(1);
y=inValues(2);
RunMode = 2;
ValueOne = x;
ValueTwo = y;
[maxSCRAout] = main(RunMode,ValueOne,ValueTwo);
result = minValuePossible;
另外,如何设置fminsearch函数在尝试查找最小值时执行的不同变体的数量?
您可以使用optimset函数定义fminsearch的选项。 optimset&#39; MaxFunEvals&#39;的参数是评估的最大数量 - 注意这个cout甚至是你约束的值,所以可能设置&#39; TolX&#39;如果你担心这种准确性,@slayton建议可能会更好。
options = optimset('MaxFunEvals',numberOfVariations);
minValuePossible = fminsearch(@minimiser, inValues,options);
答案 1 :(得分:1)
docs for fminsearch
没有描述限制你想要最小化的函数域的方法。
如果您想将范围限制为所有非负数,那么您可以简单地将函数包装到abs
的调用中,具体取决于语法。
minValuePossible = fminsearch( @(x)(minimiser( abs(x) ) ), inValues);
如果您担心它会不断收敛到相同的最小值,那么请尝试各种不同的初始值。
最后,您可以使用X
和minValuePossible
输入参数更改TolX
和TolFun
的终止容差。这是通过标准参数值语法完成的:function(...., 'Param', value)
fminsearch( @(x)(minimiser(abs(x))), inValues, 'TolX', x_tolerance);