新能源车的背景引入
众所周知,现在电动汽车是非常火爆的,已经有好几个月新能源渗透率大于百分之50,此外我还想提一句,在豪华新能源车型里面,比如说年度爆款问界M9,均价50W左右的豪华大型SUV,直接让国产新能源扬眉吐气了一把,值得点赞,附一张图
遥遥领先 遥遥领先 尤其是遥遥领先的智能驾驶水平
蒙特卡洛模拟在电动汽车领域的应用场景包括但不限于:
电动汽车的负荷预测,通过建立电动汽车的出行时间、行驶里程和充电时间的概率模型,并采用蒙特卡洛方法进行抽样,进而对电动汽车的充电负荷进行累加,得到负荷预测结果。
电动汽车充放电负荷计算,通过蒙特卡洛抽样方法生成电动汽车的充电功率、电池容量、充电时间以及每日行驶里程的概率密度分布,计算电动汽车的充放电负荷。
电动汽车的有序充放电优化调度,利用蒙特卡洛模拟来模拟不同的充电和放电策略,并评估它们在不同场景下的性能表现。
模拟的优势:
蒙特卡洛模拟的优势在于其能够模拟各种不确定因素,并通过大量的模拟次数得到稳定的结果。在电动汽车负荷预测中,这一特性非常重要,因为它可以捕捉到负荷的峰谷特性,并允许调节峰值时间、功率、仿真次数等参数,以满足不同的应用需求。
那么问题来了,我们如何知道这新能源车什么时候充电,每次充电能跑多久呢???
电动汽车起始充电时间概率分布
根据美国 NHTS的统计数据显示,家用汽车的行驶结束时间满足分段正态分布。一般而言,家用汽车普遍在一天的行驶结束后接受充电,故可以仿照家用车的行驶结束时间拟定电动汽车的充电开始时间。电动汽车行驶结束时间分段概率分布函数如下:
当然这些数据,只是举个例子,只是老美那边研究的他们的数据,我们当然可以拟合自己的数据,收藏加关注过50+我将更新怎么根据数据建立自己的概率密度函数!
随后进行编程出图如下:
根据图概率分布曲线我们可以看出,电动汽车每天开始充电的高峰时段处于晚上6点-7点左右,符合车主出行时间规律及下午下班后回家即充电的习惯。
图片代码在讲完出行密度后统一附上给主人们
电动汽车行驶里程概率分布
根据 NHTS 的数据,家用车日行驶里程近似服从对数正态分布。电动汽车一天中消耗的电能由车辆行驶里程所决定,消耗的电能也决定着电动汽车的充电时间和从电网中吸收的电能。电动汽车日行驶里程概率分布密度函数如式:
随后编程出图为:
分析图片我们可以得出以下结论:
分布特征:
最高点:在大约20公里左右,该点显示出行驶大约20公里的概率密度最大。这意味着行驶较短距离(如0到40公里)的概率密度较高,而行驶较长距离(超过100公里)的概率密度很低。分布可能是由于电动汽车的电池容量限制、用户的日常使用习惯等因素导致的。
最最最重要的全套代码如下:该代码就是原封不动的亲自编制的代码,引用论证加出图都非常齐全,可以说是复制粘贴一下就能出来。
import numpy as np
import matplotlib
matplotlib.use('TkAgg')
from matplotlib import pyplot as plt
from scipy.integrate import trapz
import matplotlib
matplotlib.rcParams['font.family'] = 'SimHei'
# 电动汽车起始充电时间概率密度函数
us = 17.6 # 均值
ds = 3.4 # 标准差
def fs1(x):
return 1 / (ds * (2 * np.pi) ** 0.5) * np.exp(-(x - us) ** 2 / (2 * ds ** 2))
def fs2(x):
return 1 / (ds * (2 * np.pi) ** 0.5) * np.exp(-(x + 24 - us) ** 2 / (2 * ds ** 2))
# 确定计算概率分布的区间和点数
x_range = [0, 24]
num_points = 1000
xs = np.linspace(x_range[0], x_range[1], num_points)
# 计算概率密度值
fs_values = np.zeros_like(xs)
for i in range(len(xs)):
if xs[i] <= us - 12:
fs_values[i] = fs2(xs[i])
else:
fs_values[i] = fs1(xs[i])
# 归一化概率密度值
s_st = np.trapz(fs_values, xs) # 计算整个区间概率密度的积分(面积)
fs_normalized = fs_values / s_st # 归一化概率密度
# 电动汽车行驶里程概率密度函数
ud = 3.2
dd = 0.88
u0 = 0.205
yt = 0.9 # 效率
cap = 30 # 容量
avg_v = 40 # 速度
avg_xh = 0.2 # 平均耗电量
pcd = 5 # 充放电功率
N = 200
def f1(x):
return 1 / (x * dd * (2 * np.pi) ** 0.5) * np.exp(-(np.log(x) - ud) ** 2 / (2 * dd ** 2))
x1 = np.linspace(0.1, 200, N)
ff = f1(x1)
s = np.trapz(ff, x1) # 计算整个区间概率密度的积分
ff = ff / s # 归一化概率密度
# 设置随机种子以便复现结果
np.random.seed(42)
# 定义舍选抽样函数
def rejection_sampling(pdf, x_values, max_value, num_samples):
samples = []
while len(samples) < num_samples:
x = np.random.uniform(low=min(x_values), high=max(x_values))
u = np.random.uniform(0, max_value)
if u < pdf(x):
samples.append(x)
return samples
# 使用舍选抽样法生成ff行驶距离的样本
ff_samples = rejection_sampling(f1, x1, np.max(ff), 1000)
# 使用舍选抽样法生成fs_normalized行驶时间的样本
fs_samples = rejection_sampling(lambda x: fs_normalized[np.argmin(np.abs(xs - x))], xs, np.max(fs_normalized), 1000)
# 电动汽车参数
cap_kWh = 30 # 电池容量 (kWh)
avg_xh_kWh_per_km = 0.2 # 平均耗电量 (kWh/km)
yt = 0.9 # 充电效率
# 绘制起始充电时间概率密度函数
plt.figure()
plt.plot(xs, fs_normalized, linewidth=2)
plt.title('电动汽车起始充电时间概率密度函数')
plt.xlabel('时间 (小时)')
plt.ylabel('概率密度')
plt.grid(True)
# 绘制电动汽车行驶里程概率密度函数
plt.figure()
plt.plot(x1, ff, linewidth=2)
plt.title('电动汽车行驶里程概率密度函数')
plt.xlabel('行驶里程 (km)')
plt.ylabel('概率密度')
plt.grid(True)
plt.show()
当然还有什么蒙特卡洛模拟充电负荷,这个代码非常难得,也是研究了很久,代码图片如下:
如果点赞收藏破200+我将免费提供给大家