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