【问题标题】:Maximize function with fminsearch使用 fminsearch 最大化功能
【发布时间】:2012-05-02 09:22:27
【问题描述】:

在我的日常工作中,我必须最大化利用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 来获得相同的分析?

【问题讨论】:

    标签: function matlab mathematical-optimization


    【解决方案1】:

    好吧,不直接使用 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
    

    【讨论】:

      【解决方案2】:

      Andrey 的想法是正确的,提供点球的更流畅的方式并不难:只需将距离添加到等式中。

      继续使用匿名函数:

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

      【讨论】:

        【解决方案3】:

        绑定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
        

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

        【讨论】:

          猜你喜欢
          • 2019-03-17
          • 2017-09-26
          • 1970-01-01
          • 2021-02-15
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-10-06
          • 1970-01-01
          相关资源
          最近更新 更多