如何在Python中生成电池SOC的右偏Weibull分布
修改左偏Weibull分布为右偏SOC分布
原代码使用形状参数k=1.5的Weibull分布生成左偏SOC(荷电状态)分布——概率峰值偏向高SOC区间,长尾集中在低SOC区间。要改为右偏分布(峰值偏向低SOC,长尾延伸至高SOC),可通过以下两种方式实现:
方案一:反转原分布(保持SOC范围一致)
通过反转原分布的计算逻辑,将高概率区间从高SOC转向低SOC,同时保证SOC不低于下限5:
def create_soc_distribution(self) -> np.array: multiplier = 25 np.random.seed(4) # 向量化生成,替代逐元素循环 weibull_vals = np.random.weibull(1.5, size=(1000, 1)) socs = 30 - weibull_vals * multiplier # 限制SOC下限为5并取整 socs = np.round(np.maximum(socs, 5)) return socs
说明:原代码逻辑是5 + Weibull值*25(生成从5开始向上延伸的左偏分布),改为30 - Weibull值*25后,生成的数值会从30开始向下分布,天然形成右偏形态,np.maximum确保SOC不会低于5。
方案二:使用k<1的Weibull分布(原生右偏特性)
Weibull分布的形状参数k<1时,本身具有右偏特性——大部分数值集中在左侧,少数数值延伸至右侧。调整参数后生成符合需求的SOC分布:
def create_soc_distribution(self) -> np.array: multiplier = 25 np.random.seed(4) # 使用形状参数k=0.6(k<1时为右偏分布) weibull_vals = np.random.weibull(0.6, size=(1000, 1)) socs = 5 + weibull_vals * multiplier # 限制SOC上限为30(可根据实际需求调整) socs = np.round(np.minimum(socs, 30)) return socs
说明:k=0.6的Weibull分布会生成大量靠近0的数值,对应SOC集中在5附近,少数大数值对应高SOC,自然形成右偏分布。np.minimum用于限制SOC不超过30,和原代码的范围保持一致。
优化点:替代逐元素循环
原代码的双重循环效率较低,使用numpy的向量化操作(如np.random.weibull直接指定size参数)可以大幅提升代码运行效率,同时保持逻辑清晰。
内容的提问来源于stack exchange,提问作者monikers
相关产品推荐
相关产品推荐

