在我的日常工作中,我必须最大化使用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来获得相同的分析?
答案 0 :(得分: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
答案 1 :(得分: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
你可以通过更顺畅地给予惩罚来改进这种方法。
答案 2 :(得分: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) ;