系统状态
def update_ambient_temp(self, ambient_temp): """更新环境温度""" self.ambient_temp = ambient_temp
def _thermal_model(self, T, t, heat_generation, fan_power, pump_power, compressor_power): """电池热动力学模型""" # 计算热生成项(来自充电/放电) q_gen = heat_generation # W
def _calculate_energy_consumption(self, dt): """计算热管理系统能耗""" # 风扇能耗 (W) fan_energy = self.fan_power * 10 * dt # 假设最大10W
def pid_controller(self, current_temp, target_temp, error_sum, last_error, kp=20, ki=0.5, kd=5): """PID控制器计算控制信号""" # 计算当前误差 error = target_temp - current_temp
def simulate(self, duration, time_step=1, charging_profile=None): """模拟热管理系统运行""" if charging_profile is None: # 默认充电功率曲线 (kW) charging_profile = [50 if t < duration/2 else 25 for t in range(0, int(duration), int(time_step))]
# 目标温度 (°C)
target_temp = 30
# PID控制器参数
kp_fan = 20
ki_fan = 0.5
kd_fan = 5
kp_pump = 15
ki_pump = 0.3
kd_pump = 3
# 初始化PID状态
error_sum_fan = 0
last_error_fan = 0
error_sum_pump = 0
last_error_pump = 0
# 模拟循环
current_time = 0
for i in range(len(charging_profile)):
# 当前充电功率转换为热生成率 (W)
charge_power = charging_profile[i] * 1000 # kW to W
heat_generation = charge_power * 0.05 # 假设5%的能量转化为热量
# 使用PID控制器计算控制信号
fan_power, error_sum_fan, last_error_fan = self.pid_controller(
self.current_temp, target_temp, error_sum_fan, last_error_fan,
kp_fan, ki_fan, kd_fan
)
pump_power, error_sum_pump, last_error_pump = self.pid_controller(
self.current_temp, target_temp, error_sum_pump, last_error_pump,
kp_pump, ki_pump, kd_pump
)
# 简化:假设压缩机仅在高温时工作
compressor_power = 100 if self.current_temp > 40 else 0
# 记录控制参数
self.fan_power = fan_power
self.pump_power = pump_power
self.compressor_power = compressor_power
# 求解热动力学方程
time_points = [0, time_step]
result = odeint(self._thermal_model, self.current_temp, time_points,
args=(heat_generation, fan_power, pump_power, compressor_power))
# 更新当前温度
self.current_temp = result[-1][0]
# 更新时间和温度历史
current_time += time_step
self.time_history.append(current_time)
self.temp_history.append(self.current_temp)
# 计算能耗
self._calculate_energy_consumption(time_step)
return {
'time': self.time_history,
'temperature': self.temp_history,
'fan_power': [self.fan_power] * len(self.time_history),
'pump_power': [self.pump_power] * len(self.time_history),
'compressor_power': [self.compressor_power] * len(self.time_history),
'energy_consumption': self.energy_consumption / 3600000 # kWh
}
def visualize_results(self, simulation_results): """可视化模拟结果""" plt.figure(figsize=(14, 10))
# 绘制温度变化
plt.subplot(2, 1, 1)
plt.plot(simulation_results['time'], simulation_results['temperature'], 'b-', linewidth=2)
plt.axhline(y=30, color='g', linestyle='--', label='目标温度')
plt.axhline(y=45, color='r', linestyle='--', label='高温警戒线')
plt.xlabel('时间 (秒)')
plt.ylabel('电池温度 (°C)')
plt.title('电池温度变化')
plt.grid(True)
plt.legend()
# 绘制控制参数
plt.subplot(2, 1, 2)
plt.plot(simulation_results['time'], simulation_results['fan_power'], 'r-', label='风扇功率 (%)')
plt.plot(simulation_results['time'], simulation_results['pump_power'], 'g-', label='泵功率 (%)')
plt.plot(simulation_results['time'], simulation_results['compressor_power'], 'b-', label='压缩机功率 (%)')
plt.xlabel('时间 (秒)')
plt.ylabel('功率 (%)')
plt.title('热管理系统控制参数')
plt.grid(True)
plt.legend()
plt.tight_layout()
plt.show()
# 打印总能耗
print(f"热管理系统总能耗: {simulation_results['energy_consumption']:.4f} kWh")