如何线性化均方根(RMS)以用于线性规划与混合整数线性优化?
均方根(RMS)函数的线性化方法(用于线性/MILP优化)
针对将RMS函数 S = √(P² + Q²) 线性化以适配线性规划(LP)或混合整数线性规划(MILP)的需求,以下是几种可行的实现方案:
一、分段线性近似(Piecewise Linear Approximation)
这是线性化RMS最常用的方案,通过将P-Q平面的取值区域划分为若干段,用直线段近似圆弧曲线,精度可通过增加分段数量灵活调整。
实现思路
- 基于P、Q的取值范围(示例中为
[-10,10]),将平面按角度划分成多个区间(比如8个方向分段,或更细的16段)。 - 对每个区间推导对应线性近似的系数,通过添加多组线性约束形成凸包逼近RMS曲线;若需精确等式约束,可引入整数变量选择当前解对应的分段(仅MILP场景需要)。
示例代码(8段近似)
import numpy as np import pulp model = pulp.LpProblem("Linearise RMS", pulp.LpMaximize) # 定义变量 P = pulp.LpVariable("P", lowBound=-10, upBound=10, cat="Continuous") Q = pulp.LpVariable("Q", lowBound=-10, upBound=10, cat="Continuous") S = pulp.LpVariable("S", lowBound=0, upBound=10*np.sqrt(2), cat="Continuous") # 添加RMS的分段线性约束:用8个方向的线性下界逼近 S ≥ √(P²+Q²) angles = [0, np.pi/4, np.pi/2, 3*np.pi/4, np.pi, 5*np.pi/4, 3*np.pi/2, 7*np.pi/4] for theta in angles: model += S >= np.cos(theta)*P + np.sin(theta)*Q # 设置目标函数 objective_function = P * 100 model.setObjective(objective_function) # 求解 cbc_solver = pulp.PULP_CBC_CMD(options=['ratioGap=0.02']) result = model.solve(solver=cbc_solver) # 输出结果 print(f"P = {pulp.value(P):.2f}") print(f"Q = {pulp.value(Q):.2f}") print(f"S = {pulp.value(S):.2f}")
该示例中,多组线性约束形成的凸锥会逼近RMS的可行域,当目标为最大化P*100时,解会落在P=10、Q=0、S=10,完全符合预期。
二、二阶锥松弛(适用于凸优化场景)
若你的求解器支持二阶锥规划(SOCP),可直接使用精确的锥约束替代线性化,这种方法精度远高于分段线性,无需近似。
示例代码
import numpy as np import pulp model = pulp.LpProblem("RMS SOCP", pulp.LpMaximize) P = pulp.LpVariable("P", lowBound=-10, upBound=10, cat="Continuous") Q = pulp.LpVariable("Q", lowBound=-10, upBound=10, cat="Continuous") S = pulp.LpVariable("S", lowBound=0, upBound=10*np.sqrt(2), cat="Continuous") # 添加精确的RMS锥约束:S² ≥ P² + Q² model += pulp.LpConstraint(e=S**2 - (P**2 + Q**2), sense=pulp.LpConstraintGE, rhs=0, name="RMS_constraint") # 设置目标函数 objective_function = P * 100 model.setObjective(objective_function) # 使用支持SOCP的求解器(如Gurobi、CPLEX) # solver = pulp.GUROBI() # result = model.solve(solver=solver) # 输出结果 print(f"P = {pulp.value(P):.2f}") print(f"Q = {pulp.value(Q):.2f}") print(f"S = {pulp.value(S):.2f}")
注:该方案不属于严格的线性规划,但多数商业求解器和部分开源工具支持SOCP,适合对精度要求高且无需严格MILP的场景。
三、绝对值替换+分段线性(适用于MILP场景)
对于必须使用MILP求解器的场景,可先将P、Q拆分为正负分量,再对绝对值组合进行分段线性近似:
- 定义
P_pos = max(P, 0)、P_neg = max(-P, 0),则P = P_pos - P_neg,|P| = P_pos + P_neg;同理处理Q。 - 对
√(|P|² + |Q|²)进行分段线性近似,引入整数变量选择对应的线性段,将非线性约束转化为整数线性约束。
这种方法能严格适配MILP求解器,精度可通过调整分段数量灵活控制。
内容的提问来源于stack exchange,提问作者Peslier53




