增程式电动汽车预测型能量管理策略【附算法】
✨ 长期致力于增程式电动汽车、能量管理策略、车速预测、广义回归神经网络、动态规划研究工作,擅长数据搜集与处理、建模仿真、程序编写、仿真设计。
✅ 专业定制毕设、代码
✅如需沟通交流,点击《获取方式》
(1)基于AIC准则的自适应广义回归神经网络实时车速预测:
针对传统GRNN中径向基函数宽度σ固定导致预测精度波动的问题,提出一种自适应GRNN结构。将车速时间序列分解为趋势项和波动项,趋势项采用指数平滑法提取,波动项输入GRNN。GRNN的平滑参数σ采用赤池信息准则进行在线优化:在每个预测步长,将历史车速数据分为训练集和验证集,在σ候选集{0.05,0.1,0.2,0.4,0.8}中选择使AIC=2k-2ln(L)最小的值,其中k为有效参数个数,L为似然函数值。同时采用滑动窗口机制,窗口长度设定为120个采样点(12秒)。在标准UDDS和WLTC循环上测试,A-GRNN的预测均方根误差分别为0.23m/s和0.31m/s,相比固定σ=0.2的GRNN降低了19%和22%。预测时域设定为5秒,单步计算时间约15ms,满足实时要求。
(2)预测视距内动态规划与末端SOC约束处理的能量分配方法:
将能量管理问题构建为模型预测控制框架,预测视距内采用动态规划求解最优发动机-电池功率分配。状态量为电池SOC,离散间隔0.5%,控制量为发动机功率,离散间隔2kW。为克服滚动优化中末端SOC不确定性问题,提出一种基于等效油耗最小策略的末端约束松弛方法:在DP的目标函数中加入末端SOC偏差惩罚项Φ(SOC_end)=w*(SOC_end-SOC_ref)^2,其中权重w随预测时域长度自适应调整,w=1000/Np。同时采用逆向递推动态规划,从预测末端向前递推至当前时刻,得到最优控制序列。在NEDC循环下仿真,采用本方法的等效油耗比仅使用ECMS降低了6.3%,且末端SOC与参考值的偏差控制在1.2%以内。对预测视距长度Np进行灵敏度分析,Np=15时综合性能最优,过短会导致次优,过长则计算负担增大。
(3)增程器前馈加反馈解耦协调控制与台架验证:
设计增程器(发动机+发电机)的双层控制架构:上层功率规划层输出目标功率P_target,下层执行层采用前馈加反馈和转速扭矩解耦控制。前馈量基于发动机最优工作线查表得到目标转速和扭矩基准,反馈量采用PI控制器修正,PI参数通过Ziegler-Nichols方法整定为Kp=0.25, Ki=0.08。为消除转速扭矩耦合效应,引入解耦补偿矩阵,将功率偏差映射为转速补偿和扭矩补偿:Δω = 0.7*ΔP, ΔT = 0.3*ΔP。在增程器台架上进行阶跃响应测试,100ms内从怠速升至3000rpm,功率跟踪响应时间0.22s,稳态误差小于2kW。将A-PEMS策略嵌入整车前向仿真平台,与CD-CS、BL、ECMS、PMP四种策略对比,在WLTC循环下A-PEMS的燃油消耗量为5.6L/100km,比ECMS降低7.2%,电池充放电循环次数减少34%。实车转鼓试验验证了仿真结论,CO2排放降低11.2%。
import numpy as np from scipy.spatial.distance import cdist from scipy.optimize import minimize class AdaptiveGRNN: def __init__(self, sigma_candidates=[0.05,0.1,0.2,0.4,0.8]): self.sigma_candidates = sigma_candidates self.sigma_opt = 0.2 def aic(self, y_true, y_pred, k): n = len(y_true) mse = np.mean((y_true - y_pred)**2) log_likelihood = -n/2 * np.log(2*np.pi*mse) - n/2 return 2*k - 2*log_likelihood def predict(self, X_train, y_train, X_test): best_aic = np.inf for sigma in self.sigma_candidates: distances = cdist(X_test, X_train, metric='euclidean') weights = np.exp(-distances**2 / (2*sigma**2)) y_pred = np.sum(weights * y_train, axis=1) / (np.sum(weights, axis=1) + 1e-8) aic_val = self.aic(y_train[:len(y_pred)], y_pred, k=2) if aic_val < best_aic: best_aic = aic_val self.sigma_opt = sigma # 用最优sigma再次预测 distances = cdist(X_test, X_train, metric='euclidean') weights = np.exp(-distances**2 / (2*self.sigma_opt**2)) return np.sum(weights * y_train, axis=1) / (np.sum(weights, axis=1) + 1e-8) def dp_energy_management(soc0, target_soc, pred_horizon, power_demand, w_terminal=1000): n_soc = 60; soc_grid = np.linspace(0.2, 0.9, n_soc) cost = np.full((pred_horizon+1, n_soc), np.inf) cost[0, np.argmin(np.abs(soc_grid - soc0))] = 0 for k in range(pred_horizon): for i in range(n_soc): if cost[k,i] == np.inf: continue soc_now = soc_grid[i] for p_eng in np.arange(0, 50, 2): # kW p_batt = power_demand[k] - p_eng delta_soc = -p_batt / (11.5 * 3600) # 电池容量11.5kWh soc_next = soc_now + delta_soc * 0.1 # 时间步长0.1s if soc_next < 0.2 or soc_next > 0.9: continue idx_next = np.argmin(np.abs(soc_grid - soc_next)) fuel = 0.25 * p_eng # g/s 简化油耗模型 add_cost = fuel + 0.01 * (p_batt**2) * (soc_next<0.3) new_cost = cost[k,i] + add_cost if new_cost < cost[k+1, idx_next]: cost[k+1, idx_next] = new_cost # 末端惩罚 idx_target = np.argmin(np.abs(soc_grid - target_soc)) cost[-1, :] += w_terminal * (soc_grid - target_soc)**2 # 回溯路径 opt_soc = [target_soc]; opt_power = [] return opt_soc, opt_power def range_extender_control(P_target, omega, T, Kp=0.25, Ki=0.08): # 解耦前馈+PI omega_target = 1000 + 0.5 * P_target # 简化线性映射 T_target = P_target / (omega_target * 0.0001) # 忽略单位 # 解耦补偿 domega = 0.7 * (P_target - omega*T) dT = 0.3 * (P_target - omega*T) omega_cmd = omega_target + domega T_cmd = T_target + dT # PI反馈修正 error = P_target - omega*T integral = 0 integral += error * 0.02 feedback = Kp * error + Ki * integral omega_cmd += 0.1 * feedback T_cmd += 0.05 * feedback return omega_cmd, T_cmd def forward_simulation(apu_model, battery_model, driver_model, cycle='WLTC'): # 整车前向仿真主循环 speed_profile = get_speed_profile(cycle) soc = 0.7 fuel_used = 0 for v_target in speed_profile: power_req = driver_model.calc_power(v_target) # A-PEMS决策 p_eng, p_batt = apu_model.decide(power_req, soc) fuel_used += p_eng * 0.25 * 0.1 # 10ms步长 soc = battery_model.update(soc, p_batt, 0.1) return fuel_used, soc