我有一个function.m,因此function(x,y)
是一个连续的函数,定义明确。对于y
范围内的每个0.04:0.02:0.2
,我想找到x
使得function(x,y)
给出值0.5
。不幸的是,function(x,y)
没有为任何x
定义。例如,当y=0.04
时,function(x,y)=0.4
时x=2
,function(x,y)=0.55
时x=3
。当function(x,y)=-inf
时,也会给出x<2
。另一方面,当y=0.05
时,function(x,y)=0.4
时x=5
,function(x,y)=0.81
时x=9
,function(x,y)=-inf
时x<5
。我想在Matlab中使用fmincon
来解决问题,所以我写了一个循环让我找到x
y = 0.04:0.02:0.2;
对于i = 1:长度(y)
result = fmincon(@(x)abs(function(x,y(i))-0.5),2,[],[],[],[],[],[]);
结束
但是,在进行优化时,例如,当y=0.04
,x
的值被选择为小于2且给出-inf值并且无法继续使用时,会发生这种情况。我想知道是否可以设置matlab仅查找有限值,或者当它尝试给出目标-inf的点时,它可以自动找到另一个x值并继续执行该过程。
我了解我可以找到一个特定的范围,该范围首先为每个0.5
赋值y
,但这非常耗时,我不想这样做。
答案 0 :(得分:0)
假设
f = @(x, y)-y.*exp(x);
-inf
x
的值最小但f
的{{1}} -inf
-inf < f < inf --> f - inf < 0 and -f - inf < 0
在Matlab上的值近似值inf
同时
>> exp(709) = 8.2184e+307
我选择>> exp(710) = inf
为inf
现在我有一个非线性约束
exp(709)
将其添加到f - exp(710) < 0 and -f - exp(710) < 0
fmincon()
不会取无穷大的价值
请仔细阅读评论
f
输出:
% Given y
y = 0.04:0.02:0.2;
% Given function f
f = @(x, y)-y.*exp(x);
% store fmincon solution x
x = zeros(size(y));
% store fminconfunction evaluation x
fval =zeros(size(y));
for i = 1:length(y)
% function depending on x only
g =@(x)f(x, y(i));
% initial function evaluation constrained not to take infinite values
c = @(x)[g(x)-exp(709); -g(x)-exp(709)];
ceq = @(x)[];
constraints = @(k)deal(c(k),ceq(k));
[x(i), fval(i)] = fmincon(g,2,[],[],[],[],[],[],constraints);
end