Matlab fminsearch选项/限制

时间:2013-01-29 16:10:17

标签: function matlab fminsearch

我在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

2 个答案:

答案 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); 

如果您担心它会不断收敛到相同的最小值,那么请尝试各种不同的初始值。

最后,您可以使用XminValuePossible输入参数更改TolXTolFun的终止容差。这是通过标准参数值语法完成的:function(...., 'Param', value)

fminsearch( @(x)(minimiser(abs(x))), inValues, 'TolX', x_tolerance);