在我的日常工作中,我必须利用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就能得到同样的分析结果呢?
发布于 2012-05-02 20:13:33
好吧,不是直接使用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-02 20:07:44
绑定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-02 20:29:36
安德烈的想法是正确的,提供点球的更流畅的方式并不难:只需在等式中添加距离。
要继续使用匿名函数:
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) ;https://stackoverflow.com/questions/10410930
复制相似问题