如何在R中进行更高效的顺序分析

问题描述 投票:0回答:1

我想为一个为机器供电的可再生能源工厂实施一个电池系统。例如,机器需要 1000 kw/h 或最接近该数量的能量。如果产生的能量超过 1000 千瓦/小时,剩余的电量可用于为电池充电,假设为 100 千瓦。如果产生的能量小于 1000 kw/h 并且电池中有能量,则应使用电池的能量为机器供电。生成的能源数据集示例如下:

数据集Energia

路径 1 小时 2小时 3小时 4小时 5小时 6小时 ... 8760小时
1 950,0 947,1 982,4 1013,5 1003,0 1087,7 ...
2 1046,9 947,9 981,9 1031,9 984,8 931,8 ...
3 996,1 1031,0 978,8 972,7 826,8 952,0 ...
4 943,4 1015,2 1007,2 994,8 1017,4 979,8 ...

我应该在哪里获取新能源和电池充电水平数据集,如下:

数据集 Bateria

路径 1 小时 2小时 3小时 4小时 5小时 6小时
1 0,0 0,0 0,0 13,5 16,5 100,0
2 46,9 0,0 0,0 31,9 16,7 0,0
3 0,0 31,0 9,8 0,0 0,0 0,0
4 0,0 15,2 22,3 17,2 34,6 14,4

新数据集Energia

路径 1 小时 2小时 3小时 4小时 5小时 6小时
1 950,0 947,1 982,4 1013,5 1003,0 1087,7
2 1046,9 994,8 981,9 1031,9 1000,0 948,5
3 996,1 1031,0 1000,0 982,5 826,8 952,0
4 943,4 1015,2 1007,2 1000,0 1017,4 1000,0

我正在一年(8760)的每个小时进行模拟 for 循环,有一千种可能的能源发电值路径。我目前正在为每一列创建一个 for 来检查条件(还有更多条件),代码是下一个:

carga_bateria<- data.frame(matrix(0, nrow = 1040, ncol = 8760))
for (i in 2:8760) {  
cond1<-energia[,i]>pot_elec
carga_bateria[cond1,i]=carga_bateria[cond1,i-1]*(1-0.02/100)+pmin(n_bat*7.55-carga_bateria[cond1,i-1]*(1-0.02/100),(energia[cond1,i]-pot_elec)*0.85)
# si la energia generada es mayor a la necsitada entonces la bateria queda con la carga anterior con la perdida de 0.02% + el minimo entre
#la bateria que hace falta y el excedente generado incluyendo la perdida de eficiencia al cargar de 85%.

cond2<-(energia[,i]+pmax(carga_bateria[,i-1]*(1-0.02/100)-n_bat*7.55*0.2,0))<pot_elec*0.3#cuando ni incluyendo la bateria en t-1 llega al 30% de la capacidad del electrolizador, entonces tambien se carga bateria
carga_bateria[cond2,i]=carga_bateria[cond2,i-1]*(1-0.02/100)+pmin(n_bat*7.55-carga_bateria[cond2,i-1]*(1-0.02/100),(energia[cond2,i])*0.85)

cond3<- pot_elec>energia[,i]&(pot_elec-energia[,i])<(carga_bateria[,i-1]*(1-0.02/100)-n_bat*7.55*0.2)#Caso desacarga parcial bateria, si el faltante lo puede cubrir la bateria
carga_bateria[cond3,i]=carga_bateria[cond3,i-1]*(1-0.02/100)-(pot_elec-energia[cond3,i]) #la bateria se descargaga en ese faltante
energia[cond3,i]<- pot_elec #la energia llega a la capacidad

cond4<- (energia[,i]+pmax(carga_bateria[,i-1]*(1-0.02/100)-n_bat*7.55*0.2,0))>pot_elec*0.3&(energia[,i]+pmax(carga_bateria[,i-1]*(1-0.02/100)-n_bat*7.55*0.2,0))<pot_elec# caso de descarga total
carga_bateria[cond4,i]= n_bat*7.55*0.2#la bateria se descargaga totalmente
energia[cond4,i]<- energia[cond4,i]+(carga_bateria[cond4,i-1]*(1-0.02/100)-n_bat*7.55*0.2) #la energia llega a la capacidad


cond99<-!cond1&!cond2&!cond3&!cond4
carga_bateria[cond99,i]=carga_bateria[cond99,i-1]*(1-0.02/100)
validacion[1,i]<-sum(cond1);validacion[2,i]<-sum(cond2);validacion[3,i]<-sum(cond3);validacion[4,i]<-sum(cond4)
validacion[5,i]<- sum(cond1,cond2,cond3,cond4)

}

但我想让这个过程尽可能高效。我相信并行化不是一种选择,因为分析是顺序的和有条件的,尽管我不知道。

r performance for-loop sequence sequential
1个回答
0
投票

我无法运行你的代码,因为你没有包含 energia 和 bateria 的数据集,但我建议将你的数据从宽格式转换为长格式 - 每个路径每小时一行,例如:

路径 霍拉 能源 电池
1 1 950.0 0.0
1 2 947.1 0.0
2 1 1046.9 46.9

然后您可以使用

group_by
(来自 dplyr)包以及
lead
lag
(也来自
dplyr
)向下移动数据集。

这是您要找的吗?

© www.soinside.com 2019 - 2024. All rights reserved.