Function 使用fminsearch最大化函数

Function 使用fminsearch最大化函数,function,matlab,mathematical-optimization,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]); 正如我所期望的,

在我的日常工作中,我必须利用
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
4
为了获得正确的结果,我应该使用优化工具箱,不幸的是我无法手动使用


有没有办法只使用fminsearch来获得相同的分析?

最简单的绑定
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
函数res=f(x,c,k)
如果x(1)>5 | | x(1)那么,不直接使用fminsearch,但是如果您愿意从文件交换下载,那么可以。对一般目标函数进行有界约束最小化,作为fminsearch的覆盖。它为您调用fminsearch,对问题应用边界

从本质上讲,这个想法是为你转换你的问题,在你的目标函数看来,它似乎是在解决一个约束问题。它是完全透明的。您可以使用函数、参数空间中的起点以及一组上下限来调用

例如,最小化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

安德烈的想法是正确的,更流畅的判罚方式并不难:只要在等式中加上距离即可

要继续使用匿名函数,请执行以下操作:

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) ;
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。。。
+(xXmax)*(x'-Xmax'+10000);