首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使用brightway建立不确定排放和已知排放量随时间变化的模型

使用brightway建立不确定排放和已知排放量随时间变化的模型
EN

Stack Overflow用户
提问于 2021-09-09 19:00:54
回答 1查看 39关注 0票数 0

我想了解如何建立交易所的模型,这些交易所的价值(随着时间的推移)会发生顺序的变化,而交易所的价值是不确定的。因此,对于每一个时期,有些人将有已知的价值观,而另一些人则不确定(但独立)。我认为使用Brightway2.5中的接口是可能的。但我还没想出该怎么做。

一个简单的例子,一个发出CO2和CH4的活动。假设我们对CO2排放量进行了一段时间的测量,但是CH4排放遵循某种不依赖于CH4的随机状态。因此,对于每一个时期,CH4的排放量可能会有几个值。

我想我知道如何使用一个CO2 (参见下面的示例)来建模dynamic_vector排放,但我不知道如何在这个示例中建模CH4排放。也许是用dynamic_array?

代码语言:javascript
运行
复制
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排放,因为我有一个传感器测量它们

代码语言:javascript
运行
复制
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
EN

回答 1

Stack Overflow用户

发布于 2022-03-11 08:44:30

我找到了一种方法,但它让我觉得很尴尬,而且可能不是人们认为使用动态计算的方式,因为每次都实例化数据包。在这个解决方案中,CH4是具有时间序列的,而CO2是随机的,但这并不重要。

代码语言:javascript
运行
复制
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)

对如何做得更好的建议敞开心扉

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69123482

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档