Brightway2.5下时序已知排放与不确定排放联合建模咨询
实现方案
你完全可以通过dynamic_array实现CH₄的独立随机排放建模,也可以单独为CH₄新增动态向量接口,两种方式都能保证时序CO₂排放和随机CH₄排放的取值完全独立,具体实现如下:
方案1:单独添加CH₄动态向量接口(每个时间步单样本)
如果你每个时间段只需要1个CH₄随机值,和CO₂的时序测量值一一对应,直接给CH₄新增一个独立的动态向量即可,和你现有CO₂的实现逻辑完全兼容:
# 接你已有的代码,设置CH4的索引参数 ch4_indices = np.array([(ch4.id, a.id),], dtype=bwp.INDICES_DTYPE) ch4_flip = np.array([True]) # 生成和CO2时序长度匹配的独立随机CH4值,这里用对数正态分布做示例,可替换为你需要的任意分布 rng = np.random.default_rng(42) # 固定随机种子方便结果复现 ch4_random_vals = rng.lognormal(mean=np.log(1), sigma=0.3, size=len(co2_measurements)) # 构造CH4的动态接口 ch4_interface = (np.array([val]) for val in ch4_random_vals) # 把CH4的动态向量加到已有的数据包中 hp.add_dynamic_vector( matrix="biosphere_matrix", interface=ch4_interface, indices_array=ch4_indices, flip_array=ch4_flip, )
运行你原有迭代逻辑即可,每次调用next(lca)时,CO₂会按顺序取下一个时序测量值,CH₄会取下一个独立随机值,两类排放互不影响。
方案2:用dynamic_array实现单个时间步多样本随机
如果你需要同一个CO₂时序值下,对应多个CH₄随机采样值,用dynamic_array更高效:
# 每个CO2时间步对应5个CH4随机样本,可根据需要调整样本量 ch4_multi_sample = rng.lognormal(mean=np.log(1), sigma=0.3, size=(len(co2_measurements), 5)) # 构造数组接口,每次返回当前时间步的所有CH4样本值 ch4_array_interface = (row for row in ch4_multi_sample) # 添加dynamic_array到数据包 hp.add_dynamic_array( matrix="biosphere_matrix", interface=ch4_array_interface, indices_array=ch4_indices, flip_array=ch4_flip, )
初始化LCA时需要开启数组支持,就能一次性拿到单个时间步所有CH4样本的LCA结果:
lca = bw.LCA(fu, data_objs=data_objs + [hp], use_arrays=True) lca.lci() lca.lcia() # 输出为长度为5的数组,对应第一个时间步5个CH4样本的得分 print(lca.score) for _ in range(len(co2_measurements)-1): next(lca) # 每个输出都是当前时间步5个样本的LCA得分 print(lca.score)
注意事项
- 两类排放的动态接口长度必须匹配,比如你CO₂有10个时序测量值,CH₄的接口也要对应返回10次数据,不然会提前触发迭代终止报错
- 使用
dynamic_array时必须在LCA初始化参数中添加use_arrays=True,否则无法识别数组格式的返回值
内容的提问来源于stack exchange,提问作者mfastudillo
相关产品推荐
相关产品推荐

