You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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)

核心修正说明

  1. 约束函数返回值类型修正:
    • 把返回布尔值的逻辑改成返回数值数组,符合Scipy约束函数的要求
    • 对于ineq约束,每个子约束返回值≥0时表示满足约束
    • 对于eq约束,返回值等于0时表示满足约束
  2. 补充缺失依赖:添加了numpy和scipy.optimize.minimize的导入语句
  3. 逻辑优化:约束1中从i=1开始遍历,避免空数组求和的冗余判断

内容的提问来源于stack exchange,提问作者evieeangeline

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.10 11:35:37