使用scipy.optimize做电池优化时遇numpy布尔减法TypeError求助
电池优化问题的Scipy报错修复
错误根源
你遇到的TypeError是因为约束函数返回了布尔值,而scipy.optimize.minimize对约束函数的返回值有明确要求:
'ineq'类型约束:需返回≥0的数值(满足约束时≥0,不满足时<0)'eq'类型约束:需返回=0的数值(满足约束时=0,不满足时≠0)
你的constraint1返回True/False,constraint2返回布尔判断结果,当Scipy用数值法计算约束的雅可比矩阵时,会尝试对这些布尔值做减法,而Numpy不支持布尔值的减法运算,直接触发报错。
修正后的完整代码
import numpy as np from scipy.optimize import minimize TIME = 2 MAX_BATTERY_CHARGE_RATE = 4 # kwh MAX_BATTERY_CAPACITY = 12 # kw INITIAL_BATTERY_CHARGE = 5 BUY_RATE = [0.1, 0.3] SELL_RATE = [0, 0] L = [2, 5] S = [1, 1] def objective(B): cost = 0 for i in range(TIME): isum = (L[i] - S[i] + B[i]) if isum > 0 : cost += BUY_RATE[i] * isum else: cost += SELL_RATE[i] * isum return cost # 充电/放电速率边界 b = (-MAX_BATTERY_CHARGE_RATE, MAX_BATTERY_CHARGE_RATE) bnds = [b for _ in range(TIME)] # 修正约束条件 # 约束1:任意时刻累计充放电量在0到电池容量之间 def constraint1(x): constraints = [] for i in range(1, TIME+1): current_sum = np.sum(x[:i]) constraints.append(current_sum) # 确保累计量 ≥ 0 constraints.append(MAX_BATTERY_CAPACITY - current_sum) # 确保累计量 ≤ 最大容量 return np.array(constraints) # 约束2:初始充放电量等于设定值(eq约束返回0时满足) def constraint2(x): return x[0] - INITIAL_BATTERY_CHARGE con1 = {'type': 'ineq', 'fun': constraint1} con2 = {'type': 'eq', 'fun': constraint2} cons = [con1, con2] # 求解优化问题 B0 = np.ones(TIME) sol = minimize(objective, B0, method='SLSQP', bounds=bnds, constraints=cons) print(sol)
核心修正说明
- 约束函数返回值类型修正:
- 把返回布尔值的逻辑改成返回数值数组,符合Scipy约束函数的要求
- 对于
ineq约束,每个子约束返回值≥0时表示满足约束 - 对于
eq约束,返回值等于0时表示满足约束
- 补充缺失依赖:添加了
numpy和scipy.optimize.minimize的导入语句 - 逻辑优化:约束1中从
i=1开始遍历,避免空数组求和的冗余判断
内容的提问来源于stack exchange,提问作者evieeangeline
相关产品推荐
相关产品推荐

