【问题标题】:Is it possible to control the the value computed in optimization to finite value?是否可以将优化中计算的值控制为有限值?
【发布时间】:2019-07-11 16:03:54
【问题描述】:

我有一个 function.m,这样 function(x,y) 是一个连续函数,因为它是明确定义的。对于从0.04:0.02:0.2 范围内的每个y,我想找到x 使得function(x,y) 给出值0.5。不幸的是,function(x,y) 没有为任何x 定义。例如,当y=0.04,当function(x,y)=0.4x=2,当function(x,y)=0.55x=3。当x<2 时,它也会给出function(x,y)=-inf。另一方面,当y=0.05function(x,y)=0.4,当x=5function(x,y)=0.81,当x=9function(x,y)=-inf,当x<5。我想在matlab中使用fmincon来解决这个问题,所以我写了一个循环让我找到x

y=0.04:0.02:0.2;

对于 i=1:length(y)

结果=fmincon(@(x)abs(函数(x,y(i))-0.5),2,[],[],[],[],[],[]);

结束

但是,在做优化的时候,会发生,比如y=0.04x的值选择小于2,给-inf值,不能再进一步。我想知道是否可以设置matlab只能找到有限值,或者当它尝试给出objective -inf的点时,它可以自动找到另一个x值并继续该过程。

我知道我可以找到特定的范围,它首先为每个 y 赋予价值 0.5,但这非常耗时,我不想这样做。

【问题讨论】:

    标签: matlab optimization mathematical-optimization


    【解决方案1】:

    假设

    f = @(x, y)-y.*exp(x);
    
    • f的最小值为-inf
    • 目标:查找x,其中f 具有最小值但不是-inf
    • 约束
    -inf < f < inf --> f - inf < 0 and -f - inf < 0
    
    • infmatlab 上的近似值
    >> exp(709) = 8.2184e+307 
    

    同时

    >> exp(710) = inf
    

    我选择infexp(709)

    现在我有一个非线性约束

    f - exp(710) < 0 and -f - exp(710) < 0
    

    将此添加到fmincon() f 不会获得无限价值

    请通读 cmets

    % 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
    

    输出:

    x = [76.6352  551.6941  702.1137   10.4739   13.6470  250.4344   22.4630   
    28.4753  100.6441];
    
    fval =  1.0e+303 *[-0.0000   -0.0000   -6.7174   -0.0000   -0.0000   -0.0000   
    -0.0000   -0.0000   -0.0000]
    

    【讨论】:

    • 我明白你的意思。但请注意,在 i=1 和 i=2 的循环中,域是不同的。当 i=1 时,x 的下限为 2,但当 i=2 时,x 的下限为 5。如果 y 有 10000 个输入,我不可能为每个 y 找到 x 的下限。如果我将每个循环的下限设置为 2,当 i=2 时,它可能会测试小于 5 的值而无法继续。是否应该有任何方法让 matlab 知道它应该尝试另一个值,比如 3,下一次是 4,然后是 5,以便它可以运行?
    • @will_cheuk 检查新的更新,您可以通过包含nonlinear constraint来相应地更改您的代码
    猜你喜欢
    • 2014-06-18
    • 1970-01-01
    • 1970-01-01
    • 2019-09-24
    • 2015-03-25
    • 1970-01-01
    • 1970-01-01
    • 2023-03-25
    • 1970-01-01
    相关资源
    最近更新 更多