• 求回复!供热建模方面


    关注 码龄 粉丝数 原力等级 -- 被采纳 被点赞 采纳率 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 元 提供问题酬金的用户不参与问题酬金结算和分配 支付即为同意 《付费问题酬金结算规则》 结题 再想想 删除 再等等

    2条回答 默认 最新

    • 笑面虎 2024-05-10 15:02
      关注

      以下内容由CHATGPT及笑面虎共同生成、有用望采纳:


      【您想要解决的问题】: 您提问的目的是解决在运行PPO深度强化学习算法时,遇到的EnvDhs类初始化方法__init__()缺少必需的位置参数T_out_lstT_supply_lst的问题。

      【问题出现原因】: 问题出现的原因是在创建EnvDhs类的实例时,没有传递必需的参数T_out_lstT_supply_lst。在您的代码中,EnvDhs类的构造函数需要两个参数,但在if __name__ == '__main__':部分创建环境实例时,没有提供这两个参数。

      【问题解决方案】: 要解决这个问题,您需要在创建EnvDhs类的实例时提供这两个参数。您可以创建两个列表来表示室外温度和供水温度的序列,然后将它们作为参数传递给EnvDhs

      【提供代码】: 以下是修改后的代码示例,其中包括了如何传递T_out_lstT_supply_lst参数:

      # 假设这是您的室外温度和供水温度的数据列表
      T_out_lst = [20, 21, 22, 23, 24, 25, 26]  # 示例数据,实际应用中应该是一个温度序列
      T_supply_lst = [40, 41, 42, 43, 44, 45, 46]  # 示例数据,实际应用中应该是一个温度序列
      
      # 创建环境实例时传递这两个列表
      env = EnvDhs(T_out_lst, T_supply_lst)
      
      # 接下来的代码不变...
      state = env.reset()
      next_state, reward, done, info = env.step(25)
      print(next_state, reward, done, info)
      

      【代码运行方式】: 运行您的代码需要有Python环境,并且需要安装深度强化学习库,如Stable Baselines等,以及NumPy和SciPy库。您可以在命令行中运行修改后的脚本。

      【代码预期运行结果】: 如果您正确地提供了T_out_lstT_supply_lst参数,代码应该能够正常运行,并且您应该能够看到环境的初始状态和第一步的反馈结果。

      【推荐相关链接】:

      展开全部

      评论 编辑记录
    • 专家-皆知 2024-05-10 15:02
      关注

      在调用EnvDhs.init()时,确保提供T_out_lst和T_supply_lst参数。

      以上回复有部分引自免费微信小程序:皆我百晓生。 如问题尚未解决,还请稍待,如有疑问请回复进一步沟通。

      评论
    编辑
    预览

    报告相同问题?

  • 相关阅读:
    【论文阅读】《Learning Safe Prediction for Semi-Supervised Regression∗》
    软件和硬件中的调用
    ChatGPT + Flutter快速开发多端聊天机器人App
    基于Springboot+Mybatis+mysql+vue宠物领养网站1.0
    基于 Python 的音乐流派分类
    Charles工具
    计算机网络(六) | 应用层:HTTP协议详解
    【k8s】五、Pod生命周期(一)
    前端文件、图片直传OOS、分片上传、el-upload上传(vue+elementUI)
    贪心算法介绍
  • 原文地址:https://ask.csdn.net/questions/8101464