使用pymgrid开发微电网代码时遇AttributeError:Microgrid无add_generator属性
解决pymgrid中Microgrid对象无add_generator属性的错误
错误原因
pymgrid的Microgrid类没有add_generator或add_load这类动态添加模块的方法,你调用的方法不存在,这是触发AttributeError的核心原因。pymgrid要求在初始化Microgrid时,就将所有需要的模块(如PV、负载)以列表形式传入构造函数,而非事后动态添加。
修正后的代码
import pymgrid import pandas as pd import numpy as np import matplotlib.pyplot as plt # 读取4个光伏系统和8个负载的小时容量数据 capacity_data = pd.read_excel("capacity_data.xlsx") # 初始化存储自洽效率和小时能量流的数组(8760小时×20年) efficiency = np.zeros((8760, 20)) energy_flows = np.zeros((8760, 20)) # 逐年创建微电网并计算相关指标 for year in range(20): modules = [] # 添加带年衰减的4个光伏模块 for i in range(4): # 计算光伏容量年衰减(20年总衰减5%) degradation = 1 - (year / 20) * 0.05 pv_capacity = capacity_data[f"PV{i}"] * degradation # 创建PV模块并加入模块列表 pv_module = pymgrid.modules.PV(data=pv_capacity.tolist()) modules.append(pv_module) # 添加8个负载模块 for i in range(8): load_capacity = capacity_data[f"Load{i}"].tolist() # 创建负载模块并加入模块列表 load_module = pymgrid.modules.Load(data=load_capacity) modules.append(load_module) # 用所有模块初始化微电网 microgrid = pymgrid.Microgrid(modules=modules) # 计算每小时总发电量和总需求 total_generation = np.sum([module.production for module in microgrid.modules if isinstance(module, pymgrid.modules.PV)], axis=0) total_demand = np.sum([module.consumption for module in microgrid.modules if isinstance(module, pymgrid.modules.Load)], axis=0) # 存储当年每小时的自洽效率 efficiency[:, year] = total_generation / total_demand # 存储当年每小时的能量流(发电量-需求量) energy_flows[:, year] = total_generation - total_demand # 绘制自洽效率曲线 plt.figure(figsize=(12, 6)) plt.plot(efficiency[:, year], label="自洽效率") plt.axhline(1, color="red", linestyle="--") plt.fill_between(range(8760), efficiency[:, year], 1, where=efficiency[:, year] < 1, color="gray", alpha=0.5) plt.xlabel("小时") plt.ylabel("效率") plt.legend() plt.show() # 绘制能量流曲线 plt.figure(figsize=(12, 6)) plt.plot(energy_flows[:, year], label="能量流") plt.xlabel("小时") plt.ylabel("能量 (kWh)") plt.legend() plt.show()
关键修改说明
- 模块初始化方式调整:先创建所有PV和负载模块,将它们存入列表后,再传入
Microgrid构造函数,替代原本不存在的动态添加方法。 - 修复缩进错误:原代码中
efficiency[:, year] = ...语句缩进错误(位于for循环外),修正后放入循环内,确保每年数据正确存储。 - 修正绘图参数:原代码中
plt.fill_between使用efficiency[:, year].index(numpy数组无index属性),改为range(8760)匹配小时维度。 - 正确获取发电量/需求量:通过遍历微电网模块列表,筛选PV模块求和
production、负载模块求和consumption,得到总发电量和总需求。
内容的提问来源于stack exchange,提问作者brandon soberon
相关产品推荐
相关产品推荐

