使用fminsearch最大化函数

3

在我的日常工作中,我需要使用 fminsearch 函数来最大化特定功能;代码如下:

clc
 clear all
 close all

 f = @(x,c,k) -(x(2)/c)^3*(((exp(-(x(1)/c)^k)-exp(-(x(2)/c)^k))/((x(2)/c)^k-(x(1)/c)^k))-exp(-(x(3)/c)^k))^2;
 c = 10.1;
 k = 2.3;
 X = fminsearch(@(x) f(x,c,k),[4,10,20]);

它能够正常工作,就像我预期的一样,但现在遇到了一个问题:我需要将x绑定在一定的范围内,例如:

 4 < x(1) < 5
 10 < x(2) < 15
20 < x(3) < 30

为了达到正确的结果,我应该使用优化工具箱,但不幸的是我无法处理它。
有没有办法只使用fminsearch来获得相同的分析结果?
3个回答

3

好的,直接使用fminsearch可能不行,但是如果你愿意从文件交换中心下载fminsearchbnd,那么可以。 fminsearchbnd通过在fminsearch上叠加一个约束条件,对一般目标函数进行了有界约束最小化。它会为您调用fminsearch,并将约束应用于问题。

本质上,这个想法是为您转换问题,以一种使您的目标函数看起来像解决有约束问题的方式。它是完全透明的。您使用一个函数、参数空间中的起始点和一组下限和上限边界调用fminsearchbnd

例如,通过最小化rosenbrock函数,fminsearch返回[1,1]处的最小值。但是,如果我们在每个变量的问题上应用纯下限,则fminsearchbnd找到了[2,4]处的有界约束解。

rosen = @(x) (1-x(1)).^2 + 105*(x(2)-x(1).^2).^2;

fminsearch(rosen,[3 3])     % unconstrained
ans =
   1.0000    1.0000

fminsearchbnd(rosen,[3 3],[2 2],[])     % constrained
ans =
   2.0000    4.0000

如果您的变量没有约束条件,那么请将-inf或inf作为相应的边界。

fminsearchbnd(rosen,[3 3],[-inf 2],[])
ans =
       1.4137            2

2

最朴素的限制 x 的方法是对不在范围内的任何 x 施加巨大的惩罚。

例如:

   function res = f(x,c,k)
        if x(1)>5 || x(1)<4
            penalty = 1000000000000;
        else
            penalty = 0;
        end
        res = penalty - (x(2)/c)^3*(((exp(-(x(1)/c)^k)-exp(-(x(2)/c)^k))/((x(2)/c)^k-(x(1)/c)^k))-exp(-(x(3)/c)^k))^2;
   end

您可以通过更加平滑地施加惩罚来改进此方法。

2

安德烈有一个正确的想法,并且更顺畅的提供罚款方式并不难:只需将距离添加到等式中即可。

要继续使用匿名函数:

f = @(x,c,k, Xmin, Xmax) -(x(2)/c)^3*(((exp(-(x(1)/c)^k)-exp(-(x(2)/c)^k))/((x(2)/c)^k-(x(1)/c)^k))-exp(-(x(3)/c)^k))^2 ...
+ (x< Xmin)*(Xmin' - x' + 10000) + (x>Xmax)*(x' - Xmax' + 10000) ;

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接