如何使用 CVX 优化器找到该函数的最小值

问题描述 投票:0回答:1

我是优化领域的新手,正在尝试使用 CVX 优化问题。这就是我定义目标的方式:

cvx_begin
    variables x1 x2 % Define the optimization variables
    expression obj % Define the objective function expression
    
    % Define the objective function
    obj = x1 + x2 + 1/log2(1 + x1/(1 + x2)) + 1/log2(1 + x2/(1 + x1));
    
    % Minimize the objective function
    minimize(obj)
    
cvx_end

但是出现了这个错误:

纪律凸规划错误: 无法执行以下操作:{real affine} ./ {real affine}

./ 中的错误(第 19 行) z = 次( x, y, './' );

* 错误(第 36 行) z = feval( 操作符, x, y );

/ 中的错误(第 15 行) z = mtimes( x, y, 'rdivide' );

测试错误(第7行) obj = x1 + x2 + 1/log2(1 + x1/(1 + x2)) + 1/log2(1 + x2/(1 + x1));

我尝试使用 inv_pos 之类的

% Start the CVX optimization
cvx_begin
    variables x1 x2 % Define the optimization variables
    expression obj % Define the objective function expression
    
    % Reformulate the objective function
    obj = x1 + x2 + inv_pos(log(2) * log(1 + x1/(1 + x2))) + inv_pos(log(2) * log(1 + x2/(1 + x1)));
    
    % Minimize the objective function
    minimize(obj)
    
cvx_end

但问题在于。

matlab optimization cvx
1个回答
0
投票

您在 CVX 中遇到的错误源于 CVX 强制执行“纪律凸规划 (DCP)”规则。如果 CVX 不将优化变量之间的除法等操作视为凸函数,则

x1/(1+x2)
会违反这些规则。

您需要将术语

1/log2(1 + x1/(1 + x2))
1/log2(1 + x2/(1 + x1))
重新表述为 CVX 接受的凸形式。您可能想使用这些术语的“凸近似”。

我的方法可能取决于您要优化的目标函数的确切形式。

如果您要使用 log-sum-exp 函数来改进您的问题,该函数被认为是凸函数,可以用作基于对数的表达式的近似值。

$$\text{log-sum-exp}(x) = \log \left( \sum_i e^{x_i} \right)$$

(该方程基于 LaTeX)

CVX 还提供

rel_entr(x, y)
函数来计算
x log (x/y)
,可用于将对数项重写为凸形式。

cvx_begin
    variables x1 x2
    expression obj
    
    % Reformulate the objective using relative entropy (convex reformulation of log)
    obj = x1 + x2 + rel_entr(1, 1 + x1/(1 + x2)) / log(2) + rel_entr(1, 1 + x2/(1 + x1)) / log(2);
    
    % Minimize the objective
    minimize(obj)
    
cvx_end

如果这种方法不起作用,您可能需要简化或线性化函数的某些部分。如果您的目标是非凸的,您可以使用的其他优化方法包括基于梯度的优化。

© www.soinside.com 2019 - 2024. All rights reserved.