关注 码龄 粉丝数 原力等级 -- 被采纳 被点赞 采纳率 Christmas_Chris 2024-05-10 15:00
采纳率: 0%
浏览 4 首页/
编程语言
/ 求回复!供热建模方面 python 求指点,运行结果是EnvDhs.init() missing 2 required positional arguments: T_out_lst and T_supply_lst。做的是PPO深度强化学习算法,T_out_lst和T_supply_lst这两个没有传参,我想用这种方法传参self.T_out_lst = T_out_lst,self.T_supply_lst = T_supply_lst,该如何改正
import env as env
import numpy as np
from scipy import integrate
class EnvDhs:
def __init__(self, T_out_lst, T_supply_lst):
self.T_out_lst = T_out_lst # 室外温度序列
self.T_supply_lst = T_supply_lst # 供水温度序列
self.c_w = 4.187e3 # 水的比热容 (J.(kg.K)^-1)
self.C_hr2 = 5.69432e5 # 板式换热器二次供水的热容量 (J.K^-1)
self.G_2 = 121 # 二次系统设计质量流量 (kg.s^-1)
self.B = 0.8 # 水垢系数
self.F = 34 # 换热板换热面积 m^2
self.T_g1 = 95 # 一次网供水温度 ℃
self.T_h1 = 70 # 一次网回水温度 ℃
self.K_hr = 4e3 # 板式换热器传热系数
self.C_s = 1.64e7 # 网管中热水的热容量 J.K^-1
self.K_gw = 11.63 # 网管的散热传热系数 W.(m^2.K)^-1
self.L_gw = 80 # 二次网管段长度 m
self.T_soil = -5.74 # 土壤的地表面温度
self.A = 99900 # 采暖面积
self.C_dr = 6.565e8 # 地热管盘热容量 J.K^-1
self.U_r = 1.4411e5 # 室内与室外之间的传热系数 W.K^-1
self.C_n = 2.897e8 # 室内空气热容量
self.t = np.arange(3600 * 7) # 时序列表 -- 据实验效果可知,网络在7小时可达到稳定,故时序列表可设置7小时
self.T_pointer = 0 # 指示当前的室外温度和供水温度索引
self.target_temp = 23.0 / 10 # 定义目标温度为23℃
self.episode_T_out = None # 每个Episode内保存室外温度不变
self.s_dim = 4 # state的维度 -- [T_out, T_in, T_supply, T_return]
self.a_dim = 1 # action的维度 -- setpoint(t)
self.data_length = self.T_out_lst.shape[0]
def q_hr(self, T_g2, T_h2):
'''板式换热器换热量计算公式
:param T_g2: 二次网供水温度
:param T_h2: 二次网回水温度
:return:
'''
fz = (self.T_g1 - T_g2) - (self.T_h1 - T_h2)
fm1 = (self.T_g1 - T_g2) / (self.T_h1 - T_h2)
fm = np.log(fm1)
delta_t_hr = fz / fm # 板式换热器一二级网侧换热温差
return self.B * self.F * self.K_hr * delta_t_hr
def heat_source(self, s, t, T_h2):
'''热源锅炉的数学模型
:param s: 变量列表
:param t: 时间序列
:param T_h2: 热源锅炉回水温度
:return T_g2: 热源锅炉供水温度
'''
T_g2 = s
Q_g = self.c_w * self.G_2 * (T_g2 - T_h2) # Q_g 代表换热站的供热量 W
# 建立数学模型时可以忽略换热器散热损失并且认为板片绝热,能够根据热平衡原理得出冷热流体的吸放热量是相等的,则换热器二级网侧
# 冷流体温升热量就等于板式换热器换热量减去二级网侧冷流体通过循环带走的热量
dT_g2_dt = (self.q_hr(T_g2, T_h2) - Q_g) / self.C_hr2
return dT_g2_dt
def supply_network(self, s, t, T_g2):
'''二次网供水管网数学模型
:param s: 变量列表
:param t: 时间序列
:param T_g2: 二次网供水温度
:return T_g: 住户端入水管口供水温度
'''
# 热网的作用是把热能从一处输送到另一处,供热管道在输送热水到热用户的过程中,由于管道内热水的温度高于管道外部环境的温度,热量将不断的散失到管道外部环境中
# 本文中供热网管采用直埋敷设,且忽略网管失水损失
# 存储在网管中的热量等于网管输入与输出的热量差减去该管段的散热损失
T_g = s
dT_g_dt = self.c_w * self.G_2 * (T_g2 - T_g) - self.K_gw * self.L_gw * (T_g2 - self.T_soil)
dT_g_dt = dT_g_dt / self.C_s
return dT_g_dt
def radiator_user(self, s, t, T_g, T_w):
'''散热器数学模型
:param s: 变量列表
:param t: 时间序列
:param T_g: 住户端供水温度
:return: T_h -- 住户端的出水口回水温度, T_n -- 室内温度
'''
T_h, T_n = s
# 此处文献中有一处为0.969的次方项,但考虑到实际中处理较为繁琐,故改为1次项,就实际结果而言,差距在0.09左右,最终设置补偿即可
q_s = (((T_g + T_h) / 2) - T_n) / ((9.82 / 100) + 0.218) # q_s为地面的散热量 W.m^-2
dT_h_dt = self.c_w * self.G_2 * (T_g - T_h) - q_s * self.A
dT_h_dt = dT_h_dt / self.C_dr
# 此处仅考虑室外温度变化对室内温度的影响,房间中储存的净热量等于地板表面输入房间的热量与通过围护结构散出的热量之差
dT_n_dt = q_s * self.A - self.U_r * (T_n - T_w)
dT_n_dt = dT_n_dt / self.C_n
return dT_h_dt, dT_n_dt
def return_network(self, s, t, T_h):
'''二次网回水管网数学模型
:param s: 变量列表
:param t: 时间序列
:param T_h: 住户端的出水口回水温度
:return T_h2: 锅炉回水温度
'''
T_h2 = s
dT_h2_dt = self.c_w * self.G_2 * (T_h - T_h2) - self.K_gw * self.L_gw * (T_h - self.T_soil)
dT_h2_dt = dT_h2_dt / self.C_s
return dT_h2_dt
def dhs(self, T_out, T_supply):
"""搭建区域供暖系统仿真系统
:param T_out: 室外温度
:param T_supply: 供水温度
"""
# 1. 搭建板式换热器的数学模型 -- 此处最终会用DDPG中的Agent代替,故此处不做设置,具体建模过程可参见heat_source()函数
# 2. 搭建二级网管供水端的数学模型
T_g2 = T_supply # 假设二次网管热源锅炉供水温度为35℃
T_g = integrate.odeint(self.supply_network, 0, self.t, args=(T_g2,))[-1, 0]
# 3. 搭建地热管盘散热器和热用户的数学模型
T_w = T_out # 假设室外温度为-10℃
result = integrate.odeint(self.radiator_user, (0, 0), self.t, args=(T_g, T_w))
T_h = result[-1, 0] # 住户端的出水口回水温度
T_n = result[-1, 1] # 室内温度
# 4. 搭建二级网管出水端的数学模型
T_h2 = integrate.odeint(self.return_network, 0, self.t, args=(T_h,))[-1, 0]
# 细节处理 -- 住户端模型中需要补充0.09的误差
delta_heat = 0.077
T_in = np.round(T_n - delta_heat, 2), np.round(T_h2, 2)
T_return = np.round(T_n - delta_heat, 2), np.round(T_h2, 2)
return T_in, T_return
def get_random_T_out_supply(self):
"""得到随机室外温度和供水温度
:return: 室外温度、供水温度
"""
T_out = self.T_out_lst[self.T_pointer % self.data_length]
T_supply = self.T_supply_lst[self.T_pointer % self.data_length]
self.T_pointer += 1
return T_out, T_supply
def reset(self):
"""初始化状态向量
:return: State -> numpy格式 [T_out(t), T_in(t), T_supply(t), T_return(t)]
"""
T_out, T_supply = self.get_random_T_out_supply() # 随机初始化室外温度和供水温度
# 保存随机初始化的室外温度,该室外温度在一个Episode内是恒定不变的,作为训练Agent的外部变量
T_out, T_supply = T_out / 10, T_supply / 10
T_out = np.round(T_out, 2)
T_supply = np.round(T_supply, 2)
self.episode_T_out = T_out # 将该室外温度保存为全局变量
# 根据室外温度和供水温度可以得到室内温度和回水温度
T_in, T_return = self.dhs(T_out, T_supply)
state = np.array([T_out, T_in, T_supply, T_return])
return state
def step(self, action: np.ndarray):
"""迭代函数,传入智能体动作向量,返回状态向量、奖励和其他信息
:param: setpoint(t) -- 供水温度设置点 -- 供水温度设置点的范围在 (20℃ - 50℃)
:return: [next_state, reward, done, info]
"""
# step 函数用来通过调节供水温度改变室内温度,以对抗室外温度改变对于室内温度的影响
# 当前state下的室内温度是不合适的,需要改变state,此时室外温度不应该改变,只需改变供水温度即可
T_out = self.episode_T_out # 当前温度在一个Episode内是恒定不变的
T_supply = action # 供水温度由 Agent 提供
T_supply = np.round(T_supply, 2)
T_in, T_return = self.dhs(T_out, T_supply) # 根据室外温度和供水温度返回室内温度和回水温度
T_in = np.round(T_in, 2)
T_return = np.round(T_return, 2)
# 奖励回报 -- 看当前 T_supply 下的 T_in 和目标温度之间的距离
# 距离最小值为0,此时是 reward 的最大值;距离越大,reward 越小且为负
reward = -1 * 0.01 * (self.target_temp * 10 - T_in * 10) ** 2
reward = round(reward, 2)
next_state = np.array([T_out, T_in, T_supply, T_return]).astype(np.float32)
info = ""
return next_state, reward, info, T_in, T_return
def render(self):
pass
if __name__ == '__main__':
# -------------- 强化学习迭代测试环境 ---------------
env = EnvDhs()
state = env.reset()
next_state, reward, done, info = env.step(25.)
print(next_state, reward, done, info)
展开全部
收起
写回答
好问题
0 提建议
追加酬金
关注问题
微信扫一扫 点击复制链接 分享 邀请回答
编辑 收藏 删除 结题 收藏 举报 追加酬金 (90%的用户在追加酬金后获得了解决方案) 当前问题酬金 ¥ 0
(可追加 ¥500)
¥ 15¥ 20¥ 50¥ 100¥ 200 支付方式 扫码支付
二维码出错
点击刷新
支付金额
15 元
提供问题酬金的用户不参与问题酬金结算和分配
支付即为同意
《付费问题酬金结算规则》 结题 再想想 删除 再等等