使用scipy.optimize.minimize求解优化问题时出现维度不匹配错误
问题排查与解决方案
核心错误原因
- 初始值维度不符合要求:
scipy.optimize.minimize要求输入的初始猜测值x0必须为一维数组,原代码中定义的x0 = np.zeros((14,1))是形状为(14,1)的二维列向量,不符合接口要求。 - Vout维度不匹配:原代码中
Vout被处理为形状为(10,1)的二维数组,当一维的优化变量参与矩阵运算后,得到的结果是一维数组,二者相减会触发维度报错。 - 约束返回值维度不符合要求:scipy的约束函数要求返回值为一维数组,原代码的等式约束返回值是二维数组,不符合接口规范。
另外补充一个逻辑问题提醒:原代码中的不等式约束写反了方向,fun返回值要求大于等于0,原写法是要求流量大于等于上限值,如果实际需求是限制流量不超过上限,需要调换减号两边的计算项。
修正后的完整代码
# Constantes # Constantes de eficiencia de los conversores del EH n_Q = 0.4 n_W = 0.3 n_AB = 0.8 n_C = 3 n_R = 0.7 # Constantes de máxima capacidad de flujo de energía C_max_CHP_g = 400 C_max_CHP_e = 120 C_max_CHP_t = 160 C_max_AB = 400 C_max_CERG = 300 C_max_WARG = 300 # Precio del gas P_g = 0.04 #kW/h # Librerias necesarias import numpy as np import matplotlib.pyplot as plt from scipy.optimize import minimize # Matrices de incidencia A1 = np.array([[0,0,1,0,0,0,0,0,0,0,0,0], [0,0,0,0,-1,-1,0,0,0,0,0,0], [0,0,0,0,0,0,-1,-1,0,0,0,0]]) A2 = np.array([[0,0,0,1,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,-1,-1,0,0]]) A3 = np.array([[0,1,0,0,1,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,-1,0]]) A4 = np.array([[0,0,0,0,0,0,0,1,1,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,-1]]) # Matrices de carácteristicas H1 = np.array([[n_Q,1,0], [n_W,0,1]]) H2 = np.array([n_AB,1]) H3 = np.array([n_C,1]) H4 = np.array([n_R,1]) # Matrices de incidencia X = np.array([[1,1,0,0,0,0,0,0,0,0,0,0], [0,0,1,1,0,0,0,0,0,0,0,0]]) # Entrada Y = np.array([[1,0,0,0,0,1,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,1,1], [0,0,0,0,0,0,1,0,0,1,0,0]]) # Salida # Matrices de flujo de energía Z1 = np.dot(H1,A1) Z2 = np.dot(H2,A2)[np.newaxis] Z3 = np.dot(H3,A3)[np.newaxis] Z4 = np.dot(H4,A4)[np.newaxis] # Matriz de flujo de energía del EH Z = np.transpose(np.concatenate((Z1.T,Z2.T,Z3.T,Z4.T),axis=1)) # Matrices para de acoplamiento (Input-to-Output) R = np.concatenate((-np.eye(2),np.zeros((5,2))),axis=0) Q = np.concatenate((X,Z),axis=0) # Matriz de acoplamiento aumentada (J) J_1 = np.concatenate((np.zeros((3,2)),Y),axis=1) J_2 = np.concatenate((R,Q),axis=1) J = np.concatenate((J_1,J_2),axis=0) # Vector de maxima capacidad C_max = np.array([C_max_CHP_g,C_max_CHP_e,C_max_CHP_t,C_max_AB,C_max_CERG,C_max_WARG]) # Demanda 修正为一维数组 Vout = np.array([150,0,400,0,0,0,0,0,0,0]) # Definición de funciones def objective_function(V): return 110*V[0] + P_g*V[1] # Restricciones 调整了不等式约束方向为上限约束 cons=({'type': 'eq', 'fun': lambda V: np.dot(J,V) - Vout}, {'type': 'ineq', 'fun': lambda V: np.sum(C_max[0:2]) - np.sum(np.dot(A1,V[2:]))}, {'type': 'ineq', 'fun': lambda V: C_max[3] - np.sum(np.dot(A2,V[2:]))}, {'type': 'ineq', 'fun': lambda V: C_max[4] - np.sum(np.dot(A3,V[2:]))}, {'type': 'ineq', 'fun': lambda V: C_max[5] - np.sum(np.dot(A4,V[2:]))}) # Condicion inicial 修正为一维数组 x0 = np.zeros(14) res = minimize(objective_function,x0,constraints=cons) print(res)
内容的提问来源于stack exchange,提问作者Julio Ortegón
相关产品推荐
相关产品推荐

