You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多
文档控制台
免费开始使用

如何基于剩余续航矩阵计算电动汽车电池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

火山引擎 最新活动