使用fminsearch最大化功能

时间:2012-05-02 09:22:27

标签: function matlab mathematical-optimization

在我的日常工作中,我必须最大化使用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 个答案:

答案 0 :(得分:3)

好吧,不是直接使用fminsearch,但是如果你愿意从文件交换中下载fminsearchbnd,那么是的。 fminsearchbnd对一般目标函数进行约束最小化约束,作为fminsearch的叠加。它为您调用fminsearch,对问题应用边界。

基本上,我们的想法是为您转换问题,使您的目标函数看作是解决受约束的问题。它是完全透明的。您可以使用函数,参数空间中的起点以及一组下限和上限来调用fminsearchbnd

例如,最小化rosenbrock函数会通过fminsearch在[1,1]处返回最小值。但是如果我们对每个变量的2问题应用纯粹的下界,则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

答案 1 :(得分: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 :(得分: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) ;