3

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

2 回答 2

5

如何将 fmin 搜索功能设置为在尝试查找最小值时不尝试负值?

在您的 minimiser 函数的开头添加值的约束。如果您遇到此约束,则返回一个巨大的最小化函数值。这将防止 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 'MaxFunEvals' 的参数是评估的最大数量 - 请注意,这个 cout 甚至是您约束的值,所以如果您担心准确性,也许按照 @slayton 的建议设置 'TolX' 可能会更好。

options = optimset('MaxFunEvals',numberOfVariations);
minValuePossible = fminsearch(@minimiser, inValues,options);
于 2013-02-09T11:07:28.960 回答
1

文档fminsearch没有描述限制要最小化的函数域的方法。

如果要将范围限制为所有非负数,则可以简单地将函数包装在对 的调用中abs,具体取决于语法。

minValuePossible = fminsearch( @(x)(minimiser( abs(x) ) ), inValues); 

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

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

fminsearch( @(x)(minimiser(abs(x))), inValues, 'TolX', x_tolerance);
于 2013-01-29T16:20:49.097 回答