cocoduck2 2024-05-02 19:56 采纳率: 75%
浏览 7

yalmip 搭建模型,cplex求解 线性化处理

yalmip 搭建模型,cplex求解,约束里含有多个变量,变量,需要进行线性化处理(变量乘积,2次方,3次方),上述是复现的代码,以及需要线性化的约束 希望得到一个线性化处理的方法。

img

img

img

  • 写回答

5条回答 默认 最新

  • 专家-赤兔[在线] 优质创作者: 编程框架技术领域 2024-05-02 19:56
    关注

    引自免费微信小程序:皆我百晓生

    在您的问题中,您想要解决的是一个多变量、非线性优化问题,其中包含二次项和三次项。为了使用YALMIP与CPLEX求解,我们需要对这些非线性项进行线性化处理。这里我们将使用 McCormick envelopes 方法来线性化二次项,而对于三次项,我们可以通过引入辅助变量和额外的线性不等式来进行近似。

    首先,让我们定义一些辅助变量用于线性化:

    1. 对于 ( S_i \cdot Q_j^2 ),我们可以引入新的变量 ( Z_{ij} ) 表示 ( S_i \cdot Q_j^2 )。
    2. 对于 ( S_i^3 ),我们可以引入新的变量 ( W_i ) 表示 ( S_i^3 )。

    接下来,我们需要添加一组不等式来确保 ( Z_{ij} ) 和 ( W_i ) 的值与它们表示的非线性项相匹配:

    对于二次项:( Z_{ij} \geq S_i \cdot Q_j^2 ), ( Z_{ij} \geq -S_i \cdot Q_j^2 + 2 \cdot S_i \cdot Q_j \cdot (S_i + Q_j) ), ( Z_{ij} \leq S_i \cdot Q_j^2 + 2 \cdot S_i \cdot Q_j \cdot (S_i - Q_j) ), ( Z_{ij} \leq S_i^2 \cdot Q_j )

    对于三次项:( W_i \geq S_i^3 ), ( W_i \leq S_i^2 \cdot (S_i + 1) )

    现在,您可以将这些辅助变量和不等式加入到您的模型中,并使用CPLEX求解器来求解优化问题。下面是经过修改后的代码:

    % ... (之前的代码保持不变)
    
    % 初始化辅助变量
    Z = sdpvar(size(S1)); % 用于存储 S_i * Q_j^2 的线性化结果
    W = sdpvar(size(S1)); % 用于存储 S_i^3 的线性化结果
    
    % 添加线性化不等式
    for i = 1:24
        for j = 1:24
            Constraints = [Constraints, Z(i,j) >= S1(i) * Q1(j)^2, ...
                            Z(i,j) >= -S1(i) * Q1(j)^2 + 2 * S1(i) * Q1(j) * (S1(i) + Q1(j)), ...
                            Z(i,j) <= S1(i) * Q1(j)^2 + 2 * S1(i) * Q1(j) * (S1(i) - Q1(j)), ...
                            Z(i,j) <= S1(i)^2 * Q1(j)];
            
            Constraints = [Constraints, Z(i,j) >= S2(i) * Q2(j)^2, ...
                            Z(i,j) >= -S2(i) * Q2(j)^2 + 2 * S2(i) * Q2(j) * (S2(i) + Q2(j)), ...
                            Z(i,j) <= S2(i) * Q2(j)^2 + 2 * S2(i) * Q2(j) * (S2(i) - Q2(j)), ...
                            Z(i,j) <= S2(i)^2 * Q2(j)];
            
            Constraints = [Constraints, Z(i,j) >= S3(i) * Q3(j)^2, ...
                            Z(i,j) >= -S3(i) * Q3(j)^2 + 2 * S3(i) * Q3(j) * (S3(i) + Q3(j)), ...
                            Z(i,j) <= S3(i) * Q3(j)^2 + 2 * S3(i) * Q3(j) * (S3(i) - Q3(j)), ...
                            Z(i,j) <= S3(i)^2 * Q3(j)];
        end
        
        Constraints = [Constraints, W(i) >= S1(i)^3, W(i) <= S1(i)^2 * (S1(i) + 1)];
        Constraints = [Constraints, W(i) >= S2(i)^3, W(i) <= S2(i)^2 * (S2(i) + 1)];
        Constraints = [Constraints, W(i) >= S3(i)^3, W(i) <= S3(i)^2 * (S3(i) + 1)];
    end
    
    % 将线性化后的表达式替换原模型中的非线性项
    for K = 1:24
        Psh(K) = 16 * W(K) + 18 * W(K+1) + 21 * W(K+2); % 注意索引可能需要根据实际情况调整
        H1(K) = -0.0018 * Q1(K)^2 + 0.3975 * S1(K) * Q1(K) + 24.0400 * S1(K)^2;
        H2(K) = -0.0013 * Q2(K)^2 + 0.2358 * S2(K) * Q2(K) + 27.82 * S2(K)^2;
        H3(K) = -0.0009 * Q3(K)^2 + 0.1709 * S3(K) * Q3(K) + 34.2900 * S3(K)^2;
        P1(K) = -0.0008 * Z(K, K) + 0.3005 * S1(K)^2 * Q1(K) - 5.1760 * W(K);
        P2(K) = -0.0004 * Z(K+1, K+1) + 0.1664 * S2(K)^2 * Q2(K) + 2.6770 * W(K+1);
        P3(K) = 0.0008 * Z(K+2, K+2) - 0.1539 * S3(K)^2 * Q3(K) + 27.2900 * W(K+2);
    end
    
    % ... (后续代码保持不变)
    
    

    这段代码包含了对所有二次项和三次项的线性化处理,然后用线性化后的表达式替换原模型中的非线性项。现在,您可以使用这个修改后的模型与CPLEX一起求解优化问题了。注意,这种方法提供了一个可行的近似解,但可能不是全局最优解,因为线性化过程可能导致了一些可行区域的损失。

    评论 编辑记录

报告相同问题?

问题事件

  • 创建了问题 5月2日