brightway - 在 Brightway 中计算不同影响评估方法的蒙特卡洛结果的有效方法
问题描述
我正在尝试使用不同的影响评估方法与 brightway2 进行比较蒙特卡罗计算。我考虑过使用该switch_method
方法来提高效率,因为技术圈矩阵对于给定的迭代是相同的。但是,我收到一个断言错误。重现它的代码可能是这样的
import brighway as bw
bw.projects.set_current('ei35') # project with ecoinvent 3.5
db = bw.Database("ei_35cutoff")
# select two different transport activities to compare
activity_name = 'transport, freight, lorry >32 metric ton, EURO4'
for activity in bw.Database("ei_35cutoff"):
if activity['name'] == activity_name:
truckE4 = bw.Database("ei_35cutoff").get(activity['code'])
print(truckE4['name'])
break
activity_name = 'transport, freight, lorry >32 metric ton, EURO6'
for activity in bw.Database("ei_35cutoff"):
if activity['name'] == activity_name:
truckE6 = bw.Database("ei_35cutoff").get(activity['code'])
print(truckE6['name'])
break
demands = [{truckE4: 1}, {truckE6: 1}]
# impact assessment method:
recipe_midpoint=[method for method in bw.methods.keys()
if method[0]=="ReCiPe Midpoint (H)"]
mc_mm = bw.MonteCarloLCA(demands[0], recipe_midpoint[0])
next(mc_mm)
如果我尝试 switch 方法,我会得到断言错误。
mc_mm.switch_method(recipe_midpoint[1])
assert mc_mm.method==recipe_midpoint[1]
mc_mm.redo_lcia()
next(mc_mm)
我在这里做错了吗?
解决方案
我通常将特征因子矩阵存储在一个临时字典中,并将这些 cfs 与直接从 MonteCarloLCA 产生的 LCI 相乘。
import brightway2 as bw
import numpy as np
# Generate objects for analysis
bw.projects.set_current("my_mcs")
my_db = bw.Database('db')
my_act = my_db.random()
my_demand = {my_act:1}
my_methods = [bw.methods.random() for _ in range(2)]
我编写了这个简单的函数来获取我将在 MonteCarloLCA 中生成的产品系统的特征因子矩阵。它使用临时“牺牲 LCA”对象,该对象将具有与 MonteCarloLCA 相同的 A 和 B 矩阵。这似乎是在浪费时间,但它只进行一次,并且会使 MonteCarlo 更快、更简单。
def get_C_matrices(demand, list_of_methods):
""" Return a dict with {method tuple:cf_matrix} for a list of methods
Uses a "sacrificial LCA" with exactly the same demand as will be used
in the MonteCarloLCA
"""
C_matrices = {}
sacrificial_LCA = bw.LCA(demand)
sacrificial_LCA.lci()
for method in list_of_methods:
sacrificial_LCA.switch_method(method)
C_matrices[method] = sacrificial_LCA.characterization_matrix
return C_matrices
然后:
# Create array that will store mc results.
# Shape is (number of methods, number of iteration)
my_iterations = 10
mc_scores = np.empty(shape=[len(my_methods), my_iterations])
# Instantiate MonteCarloLCA object
my_mc = bw.MonteCarloLCA(my_demand)
# Get characterization factor matrices
my_C_matrices = get_C_matrices(my_demand, my_methods)
# Generate results
for iteration in range(my_iterations):
lci = next(my_mc)
for i, m in enumerate(my_methods):
mc_scores[i, iteration] = (my_C_matrices[m]*my_mc.inventory).sum()
您所有的结果都在 mc_scores 中。每一行对应一个方法,每一列对应一个 MC 迭代。
推荐阅读
- mysql - “MySQL 8”sql 语句的问题
- sas - 计算 SAS 中某事发生的次数
- webpack - 如何使用 react-app 和 webpack 进行 CORS 请求 - 没有 expressjs
- unity3d - Firebase 从数据库中读取最新数据
- jquery - 在更改的事件上向 Owl Carousel 项目添加类
- android - 图形 API 调试器错误 com.google.gapid.Server$GapisInitException
- oop - 业务规则领域建模
- r - 在 data.table 中矢量化 R for 循环
- c++ - 模板参数推导过程中会发生什么?
- vue.js - Vue.js 中的循环引用问题 - 但仅限于 CodeSandbox