我想了解如何建立交易所的模型,这些交易所的价值(随着时间的推移)会发生顺序的变化,而交易所的价值是不确定的。因此,对于每一个时期,有些人将有已知的价值观,而另一些人则不确定(但独立)。我认为使用Brightway2.5中的接口是可能的。但我还没想出该怎么做。
一个简单的例子,一个发出CO2和CH4的活动。假设我们对CO2排放量进行了一段时间的测量,但是CH4排放遵循某种不依赖于CH4的随机状态。因此,对于每一个时期,CH4的排放量可能会有几个值。
我想我知道如何使用一个CO2 (参见下面的示例)来建模dynamic_vector排放,但我不知道如何在这个示例中建模CH4排放。也许是用dynamic_array?
import brightway2 as bw
import numpy as np
import bw_processing as bwp
import bw2data as bd
import bw2calc
bw.projects.set_current('testing_things')
co2 = next(x for x in bd.Database("biosphere3")
if x['name'] == 'Carbon dioxide, fossil'
and x['categories'] == ('air',))
ch4 = next(x for x in bd.Database("biosphere3")
if x['name'] == 'Methane, fossil'
and x['categories'] == ('air',))
a_key = ("testdb", "a")
act_a_def = {
'name': 'a',
'unit': 'kilogram',
'exchanges': [{"input": co2.key, "type": "biosphere", "amount": 10},
{"input": a_key, "output":a_key,'type':'production','amount':1},
{"input": ch4.key, "type": "biosphere", "amount": 1},
],
}
db = bd.Database("testdb")
db.write(
{
a_key : act_a_def,
}
)
ipcc2013 = ('IPCC 2013', 'climate change', 'GWP 100a')
a = bw.get_activity(('testdb','a'))
lca = bw.LCA({a:1},ipcc2013)
lca.lci()
lca.lcia()
lca.score让我们假设我知道CO2排放,因为我有一个传感器测量它们
co2_measurements = [10,11,9,10,8,11,12,13,8,12]
co2_interface = (np.array([c]) for c in co2_measurements)
indices_array=np.array([(co2.id, a.id),],
dtype=bwp.INDICES_DTYPE
)
flip_array=np.array([True])
hp = bwp.create_datapackage()
hp.add_dynamic_vector(
matrix="biosphere_matrix",
interface=co2_interface,
indices_array=indices_array,
flip_array=flip_array,
)
fu, data_objs, _ = bd.prepare_lca_inputs({a: 1}, method=ipcc2013)
lca = bw.LCA(fu, data_objs=data_objs + [hp])
lca.lci()
lca.lcia()
print(lca.score)
for _ in range(5):
next(lca)
print(lca.score)
18.700000762939453
20.700000762939453
19.700000762939453
21.700000762939453
18.700000762939453
17.700000762939453发布于 2022-03-11 08:44:30
我找到了一种方法,但它让我觉得很尴尬,而且可能不是人们认为使用动态计算的方式,因为每次都实例化数据包。在这个解决方案中,CH4是具有时间序列的,而CO2是随机的,但这并不重要。
co2 = next(x for x in bwd.Database("biosphere3")
if x['name'] == 'Carbon dioxide, fossil'
and x['categories'] == ('air',))
ch4 = next(x for x in bwd.Database("biosphere3")
if x['name'] == 'Methane, fossil'
and x['categories'] == ('air',))
indices_co2 = np.array([(co2.id,act.id)],dtype=bwp.INDICES_DTYPE)
flip_array_co2 = np.array([False] * len(indices_co2))
indices_ch4 = np.array([(ch4.id,act.id)],dtype=bwp.INDICES_DTYPE)
flip_array_ch4 = np.array([False] * len(indices_ch4))
ch4_measurements = [np.array([r/10]) for r in range(5,100,1)]
class Interface_timeseries:
def __init__ (self, ts_data):
self.ts = ts_data
self.idx = 0
def __iter__ (self):
return self
def __next__ (self):
try:
item = self.ts[self.idx]
except IndexError:
raise StopIteration()
self.idx += 1
return item
def init_dynamic(act,lcia_method,co2_vector,ch4_vector):
dynamic_ghg = bwp.create_datapackage(combinatorial=False,sequential=False)
# CO2 random emissions
dynamic_ghg.add_dynamic_vector(
matrix = co2_vector['matrix'],
indices_array = co2_vector['indices_array'],
flip_array = co2_vector['flip_array'],
interface = co2_vector['interface'])
# CH4 measurements
dynamic_ghg.add_dynamic_vector(
matrix = ch4_vector['matrix'],
indices_array = ch4_vector['indices_array'],
flip_array = ch4_vector['flip_array'],
interface = ch4_vector['interface'],)
fu, data_objs , _ = bwd.prepare_lca_inputs({act:1},method=lcia_method)
lca_dynamic = bwc.LCA(fu, data_objs= data_objs +[dynamic_ghg])
lca_dynamic.lci()
lca_dynamic.lcia()
return(lca_dynamic)
iteration_results = []
for it in range(10):
co2_vector = {}
co2_vector['matrix'] = 'biosphere_matrix'
co2_vector['indices_array'] = indices_co2
co2_vector['flip_array'] = flip_array_co2
co2_vector['interface'] = (np.array([row]) for row in np.random.normal(size=100))
ch4_vector = {}
ch4_vector['matrix'] = 'biosphere_matrix'
ch4_vector['indices_array'] = indices_ch4
ch4_vector['flip_array'] = flip_array_ch4
ch4_vector['interface'] = Interface_timeseries(ch4_measurements)
dlca = init_dynamic(act,ipcc2013,co2_vector,ch4_vector)
scores = []
for _ in range(len(ch4_measurements)):
try:
next(dlca)
scores.append(dlca.score)
except StopIteration as si:
print('sequence completed')
break
iteration_results.append(scores)对如何做得更好的建议敞开心扉
https://stackoverflow.com/questions/69123482
复制相似问题