如何基于剩余续航矩阵计算电动汽车电池SOC(状态百分比)?
问题:计算电动车剩余电池状态百分比(SoC)
首先得给你点个赞,你的思路完全正确!SoC(State of Charge,电池剩余电量百分比)的核心计算逻辑就是剩余续航 ÷ 总续航 × 100,和你想的公式完全一致。
不过你的原始代码用了嵌套循环,不仅效率低,还容易出错,而且numpy本身就支持强大的广播运算,能帮你一行搞定矩阵计算,下面给你修正并优化后的代码:
import numpy as np # 修正车型数组:用有序列表替代集合,保证车型和续航数值一一对应 Electric_car = np.array([ 'Nissan Leaf 24 kWh pack', 'Nissan Leaf 30 kWh pack', 'Volkswagen e-Golf', 'Tesla Model S 90(D)', 'BMW i3 22kWh', 'BMW i3 33 kWh', 'KIA SOUL', 'Volkswagen e-Up(2016)', 'Renault ZOE R90 Z.E 40', 'Hyundai IONIQ', 'Mercedes-Benz B250E', 'Tesla model X 90D' ]) RangeInKM_By_Manufacturer = np.array([199, 250, 300, 557, 190, 300, 250, 160, 403, 280, 200, 489]) City = [ 'city1', 'city2', 'city3', 'city4', 'city5', 'city6', 'city7', 'city8' , 'city9', 'city10', 'city11','city12', 'city13', 'city14', 'city15', 'city16', 'city17', 'city18', 'city19', 'city20' ] # 将distances转换为numpy数组,方便后续广播运算 distances = np.array([ [0, 3.4, 4.5, 4, 5, 12.2, 5.4, 6.1, 5.7, 10.6, 12.8, 7.7, 7.4, 5, 12.4, 12.6, 8.7, 4.2, 3.8, 1.9], [3.4, 0, 2.2, 2.4, 4.3, 10.1, 2.8, 4.7, 4.5, 9.4, 11.6, 9.4, 9.4, 7.6, 14.6, 11.9, 8.7, 4.3, 4.5, 1.7], [4.5, 2.1, 0, 1.6, 4.5, 6.8, 1.6, 3.1, 3.8, 8.7, 11, 8.5, 9, 9.4, 17.2, 10.9, 8.1, 3.8, 4.8, 3.4], [4.1, 2, 1.6, 0, 2.7, 6.3, 1.6, 4.6, 5, 9.9, 12.1, 9.2, 9.4, 8.3, 15.9, 8.8, 9.3, 4.9, 5.2, 2.3], [5.1, 4.2, 4.5, 2.7, 0, 5.5, 3.5, 9.3, 7.5, 12.4, 14.7, 14.8, 12, 9.6, 15.8, 6.3, 11.8, 7.5, 7.8, 3.3], [12.2, 10.1, 6.8, 6.3, 5.5, 0, 5.7, 10.7, 12, 17, 19.2, 17, 17.2, 14.5, 21.9, 4.1, 16.3, 12, 14.3, 8.1], [5.4, 3.4, 1.6, 1.6, 3.5, 5.7, 0, 5.5, 5.8, 10.7, 12.9, 10.8, 10.2, 9.6, 17.2, 9, 10, 5.7, 6, 3.8], [6.1, 4.7, 3.1, 4.6, 9.3, 10.7, 5.5, 0, 4.1, 9.1, 11.3, 8.8, 10.9, 11.3, 20.8, 13.9, 8.4, 4.1, 6.4, 5.9], [5.7, 4.5, 3.8, 5, 7.5, 12, 5.8, 4.1, 0, 5.4, 7.7, 5.8, 9.4, 10.3, 17.2, 15.3, 4.8, 2.5, 5.3, 5.9], [10.6, 9.4, 8.7, 9.9, 12.4, 17, 10.7, 9.1, 5.4, 0, 2.6, 5.2, 10.2, 14.2, 20.5, 19.8, 4.1, 7.3, 9.1, 10.4], [12.8, 11.6, 11, 12.1, 14.7, 19.2, 12.9, 11.3, 7.7, 2.6, 0, 8.6, 13.6, 17.2, 23.6, 22.4, 6.7, 10.7, 11.9, 13], [7.7, 9., 8.5, 9.2, 14.8, 17, 10.8, 8.8, 5.8, 5.2, 8.6, 0, 6.6, 9.9, 17.4, 19.8, 2.3, 5, 6, 9], [7.4, 9.4, 9, 9.4, 12, 17.2, 10.2, 10.9, 9.4, 10.2, 13.6, 6.6, 0, 5.1, 9.8, 17.8, 7.9, 6.6, 5.3, 9.5], [5, 7.6, 9.4, 8.3, 9.6, 14.5, 9.6, 11.3, 10.3, 14.2, 17.2, 9.9, 5.1, 0, 8.3, 13.9, 12.1, 8.2, 7.1, 5.7], [12.4, 14.6, 17.2, 15.9, 15.8, 21.9, 17.2, 20.8, 17.2, 20.5, 23.6, 17.4, 9.8, 8.3, 0, 22.5, 18.2, 14.4, 13.2, 13.1], [12.6, 11.9, 10.9, 8.8, 6.3, 4.1, 9, 13.9, 15.3, 19.8, 22.4, 19.8, 17.8, 13.9, 22.5, 0, 19.3, 15.1, 17, 9.6], [8.7, 8.7, 8.1, 9.3, 11.8, 16.3, 10, 8.4, 4.8, 4.1, 6.7, 2.3, 7.9, 12.1, 18.2, 19.3, 0, 6.3, 6.8, 9.9], [4.2, 4.3, 3.8, 4.9, 7.5, 12, 5.7, 4.1, 2.5, 7.3, 10.7, 5, 6.6, 8.2, 14.4, 15.1, 6.3, 0, 3.2, 5], [3.8, 4.5, 4.8, 5.2, 7.8, 14.3, 6, 6.4, 5.3, 9.1, 11.9, 6, 5.3, 7.1, 13.2, 17, 6.8, 3.2, 0, 4.8], [1.9, 1.7, 3.4, 2.3, 3.3, 8.1, 3.8, 5.9, 5.9, 10.4, 13, 9, 9.5, 5.7, 13.1, 9.6, 9.9, 5, 4.8, 0] ]) # 计算剩余续航矩阵:利用numpy广播,每个车型的总续航减去所有城市间距离 # 把RangeInKM_By_Manufacturer从(12,)转为(12,1,1),和(20,20)的distances广播后得到(12,20,20)的矩阵 Remaining_Range = RangeInKM_By_Manufacturer[:, np.newaxis, np.newaxis] - distances # 计算SoC矩阵:完全按照你提出的公式实现 SoC = (Remaining_Range / RangeInKM_By_Manufacturer[:, np.newaxis, np.newaxis]) * 100 # 示例:打印第一个车型的SoC矩阵 print(f"{Electric_car[0]} 的剩余电池百分比矩阵:") print(SoC[0])
几个关键说明:
- 修正了
Electric_car的定义:你原来用了set(集合),但集合是无序的,会打乱车型和续航数值的对应关系,改成有序列表转numpy数组就能保证一一对应。 - 用numpy广播替代嵌套循环:这是numpy的核心优势之一,不需要手动写循环,就能高效完成多维度矩阵运算,生成的
SoC是一个(12,20,20)的三维数组——每个车型对应一个20×20的城市间SoC矩阵。 - 你的公式完全正确:
(剩余续航 / 总续航) × 100就是行业标准的SoC计算方式,逻辑没有任何问题。
内容的提问来源于stack exchange,提问作者Giroud2




