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 来获得相同的分析?

4

3 回答 3

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
于 2012-05-02T12:13:32.697 回答
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

您可以通过以更平滑的方式给予惩罚来改进这种方法。

于 2012-05-02T12:07:44.193 回答
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) ;
于 2012-05-02T12:29:35.810 回答