非线性模型预测控(NLMPC)在混合动力汽车能量管理策略开发上的运用。
非线性模型预测控(NLMPC)在混合动力汽车能量管理策略开发上的运用。
利用非线性MPC解决多约束问题,只要在mpc-costfunction中更改相应的代价函数就行。也能与相应的速度预测相结合使用。
基于非线性模型预(NLMPC)的能量管理策略的预测时预内的局部最优近似全局最优的优化效果,实现混动车辆的燃油经济性最优t49
图表分析
Figure 5 (左上角):
类型: stem plot (火柴杆图/离散序列图)。
特征: 显示离散数据点,通常用于信号处理中的频谱分析或离散时间序列。
MATLAB 函数: stem()。
Figure 3 (右上角):
类型: 多子图 (Subplots) 的折线图。
特征: 包含两个垂直排列的图表,上方图表似乎展示了某种随时间变化的信号(可能是原始信号),下方图表展示了两条曲线的对比(可能是原始信号与滤波后的信号,或预测值与真实值)。
MATLAB 函数: subplot(), plot()。
Figure 4 (左下角):
类型: 折线图,包含多条曲线。
特征: 看起来像是某种误差分析或不同分量的对比(例如:真实值 vs 预测值,或者不同算法的对比)。
MATLAB 函数: plot()。
Figure 1 (中下):
类型: 多子图。
特征: 上下两个图表,可能是对同一数据的不同视角展示,或者是分解后的分量(如趋势项和周期项)。
MATLAB 函数: subplot(), plot()。
Figure 2 (右下角):
类型: 折线图。
特征: 曲线随时间单调递减或收敛,可能展示了误差收敛过程、目标函数值的变化或某种累积量。
MATLAB 函数: plot()。
MATLAB 代码框架示例
%% 初始化环境
clc; clear; close all;
% — 模拟生成一些示例数据 (请替换为您自己的数据) —
t = 0:0.1:600; % 时间轴
y_stem = abs(sin(t/20)) .* exp(-t/500) + 0.1*randn(size(t)); % Figure 5 数据
y_signal1 = randn(size(t)); % Figure 3 上图数据
y_signal2 = y_signal1 + 50; % Figure 3 下图数据1
y_signal3 = y_signal1 + 45; % Figure 3 下图数据2
y_error = randn(size(t)) * 10;% Figure 4 数据
y_decomp1 = sin(t/50); % Figure 1 上图数据
y_decomp2 = cos(t/50); % Figure 1 下图数据
y_converge = 1./(1:100); % Figure 2 数据
%% 绘制 Figure 5 (左上角 - 火柴杆图)
figure(‘Name’, ‘Figure 5’);
stem(t, y_stem, ‘filled’, ‘MarkerSize’, 4, ‘Color’, [0 0.4470 0.7410]);
title(‘离散序列图示例’);
xlabel(‘时间 (s)’);
ylabel(‘幅值’);
grid on;
%% 绘制 Figure 3 (右上角 - 多子图)
figure(‘Name’, ‘Figure 3’);
% 子图 1
subplot(2, 1, 1);
plot(t, y_signal1, ‘Color’, [0.85 0.325 0.098]);
title(‘信号波形 1’);
xlabel(‘时间 (s)’);
ylabel(‘幅值 (A)’);
legend(‘原始信号’);
grid on;
% 子图 2
subplot(2, 1, 2);
plot(t, y_signal2, ‘b’, ‘LineWidth’, 1); hold on;
plot(t, y_signal3, ‘r’, ‘LineWidth’, 1);
title(‘信号对比’);
xlabel(‘时间 (s)’);
ylabel(‘幅值 (A)’);
legend(‘信号 A’, ‘信号 B’);
grid on;
%% 绘制 Figure 4 (左下角 - 多曲线对比)
figure(‘Name’, ‘Figure 4’);
plot(t, y_error, ‘LineWidth’, 1);
title(‘误差/分量分析’);
xlabel(‘时间 (s)’);
ylabel(‘幅值’);
legend(‘分量 1’, ‘分量 2’, ‘分量 3’); % 根据实际曲线数量修改
grid on;
%% 绘制 Figure 1 (中下 - 分解图)
figure(‘Name’, ‘Figure 1’);
% 子图 1
subplot(2, 1, 1);
plot(t, y_decomp1, ‘LineWidth’, 1.5);
title(‘分量分解 - 趋势项’);
xlabel(‘时间 (s)’);
ylabel(‘幅值’);
grid on;
% 子图 2
subplot(2, 1, 2);
plot(t, y_decomp2, ‘LineWidth’, 1.5, ‘Color’, [0.4660 0.6740 0.1880]);
title(‘分量分解 - 周期项’);
xlabel(‘时间 (s)’);
ylabel(‘幅值’);
grid on;
%% 绘制 Figure 2 (右下角 - 收敛曲线)
figure(‘Name’, ‘Figure 2’);
plot(y_converge, ‘LineWidth’, 2, ‘Color’, [0.4940 0.1840 0.5560]);
title(‘收敛过程 / 目标函数值’);
xlabel(‘迭代次数 / 时间’);
ylabel(‘数值’);
grid on;
如何使用
准备数据: 确保您的数据已经加载到 MATLAB 工作区中(例如从 .mat 文件或 .csv 文件读取)。
替换变量: 将代码中的 t (横坐标) 和 y_… (纵坐标) 替换为您实际的变量名。
调整样式: 您可以根据图片中的颜色和线型,修改 plot 或 stem 函数中的 ‘Color’, ‘LineWidth’, ‘LineStyle’ 等属性。
MATLAB 代码实现
% — 1. 准备模拟数据 (请替换为您自己的数据) —
% 假设 x 轴是实验次数 (1 到 600)
x = 1:600;
% 模拟 y 轴数据:生成一些类似图中的随机稀疏脉冲数据
% 这里用 randn 生成正态分布随机数,取绝对值,并加入一些随机的大峰值
rng(42); % 固定随机种子以保证结果可复现
y = abs(0.05 * randn(1, 600));
% 随机制造一些像图中那样的“高峰”
num_peaks = 20;
peak_indices = randi(600, 1, num_peaks);
y(peak_indices) = y(peak_indices) + 0.2 * rand(1, num_peaks) + 0.1;
% — 2. 绘图 —
figure(‘Color’, ‘w’); % 创建一个白色背景的窗口
% 使用 stem 函数绘制火柴杆图
% ‘Marker’, ‘o’ 设置标记为圆圈
% ‘LineStyle’, ‘-’ 设置连线为实线
% ‘Color’, [0, 0.4470, 0.7410] 设置颜色为 MATLAB 默认蓝色
h = stem(x, y, ‘Marker’, ‘o’, ‘LineStyle’, ‘-’, ‘Color’, [0, 0.4470, 0.7410], ‘LineWidth’, 1, ‘MarkerSize’, 6);
% — 3. 调整外观以匹配原图 —
% 设置坐标轴范围
ylim([0 0.4]); % 根据原图设置 Y 轴范围
xlim([0 600]); % 根据原图设置 X 轴范围
% 添加标签 (可选)
ylabel(‘时间 (s)’); % 或者具体的单位
xlabel(‘迭代次数’);
% 添加图中的注释文本 (模拟截图中的悬浮提示,虽然 MATLAB 中通常用 text 或 annotation)
% 这里演示如何在特定位置加文字
text(350, 0.15, ‘#每次求解时间’, ‘FontSize’, 12, ‘Color’, ‘k’, ‘HorizontalAlignment’, ‘center’);
% 开启网格 (原图看起来没有明显的网格,如果需要可以开启)
% grid on;
代码关键点解析
stem(x, y) 函数:这是核心函数,专门用于绘制离散序列数据。它会画出从 x 轴到数据点 (x, y) 的垂线,并在顶端画上标记。
数据模拟:由于我无法获取您的真实数据,代码中使用了 randn 和随机峰值生成来模拟图中那种“大部分数值较小,偶尔出现尖峰”的分布特征。
样式调整:
‘Marker’, ‘o’:设置顶端的点为圆形。
‘LineWidth’ 和 ‘MarkerSize’:调整线条粗细和圆点大小,使其看起来清晰。
‘Color’:使用了 MATLAB 经典的默认蓝色。


上图:展示了“实际负载电流”,这通常是车辆行驶过程中电机需求的总电流,波动剧烈,包含高频尖峰。
下图:展示了能量源的分配策略。
红色曲线(超级电容电流):响应速度快,承担了大部分高频、剧烈的波动(尖峰)。
蓝色曲线(电池电流):响应相对平缓,主要提供低频的平均功率,以保护电池寿命。
MATLAB 代码实现
%% 1. 初始化环境
clc; clear; close all;
%% 2. 生成模拟数据 (模拟实际工况)
% 创建时间轴:0 到 600秒
dt = 1; % 采样时间 1s
t = 0:dt:600;
time = t’; % 转置为列向量
% 模拟 “实际负载电流” (上图)
% 构造一个包含低频趋势和高频噪声的信号
rng(123); % 固定随机种子
base_load = 10 * sin(pitime/150) + 5 * sin(pitime/50); % 基础波动
noise_load = 20 * randn(size(time)); % 高频随机噪声
% 叠加几个大的脉冲(模拟加速或制动)
pulse_load = zeros(size(time));
pulse_load(60:70) = 50;
pulse_load(200:210) = 80;
pulse_load(500:510) = 60;
actual_load_current = base_load + noise_load + pulse_load’;
%% 3. 模拟能量管理策略 (下图)
% 原理:电池响应慢(低通滤波),超级电容响应快(高频分量)
% 使用移动平均滤波器模拟电池的“惰性”
windowSize = 15; % 窗口大小,越大电池越平缓
b = (1/windowSize)*ones(1,windowSize);
a = 1;
battery_current = filter(b, a, actual_load_current);
% 超级电容电流 = 总负载 - 电池电流 (功率平衡)
supercap_current = actual_load_current - battery_current;
%% 4. 绘图 (复刻截图风格)
figure(‘Color’, ‘w’, ‘Position’, [100, 100, 600, 800]); % 设置白色背景,拉长窗口
% — 绘制上图:实际负载电流 —
subplot(2, 1, 1);
plot(time, actual_load_current, ‘Color’, [0.2, 0.2, 0.2], ‘LineWidth’, 1);
grid on;
ylabel(‘实际负载电流(A)’);
title(‘电流曲线’); % 图中显示的大标题
ylim([-50 100]); % 调整Y轴范围以匹配截图
xlim([0 600]);
box on;
% 添加图例
legend(‘实际负载电流’, ‘Location’, ‘NorthEast’);
% — 绘制下图:电源分配 —
subplot(2, 1, 2);
hold on;
% 绘制超级电容电流 (红色)
plot(time, supercap_current, ‘Color’, [0.8, 0, 0], ‘LineWidth’, 1);
% 绘制电池电流 (蓝色)
plot(time, battery_current, ‘Color’, [0, 0, 0.8], ‘LineWidth’, 1.2);
hold off;
grid on;
xlabel(‘时间(s)’);
ylabel(‘电流(A)’);
xlim([0 600]);
ylim([-100 150]); % 根据数据动态调整,或固定以匹配截图
box on;
% 添加图例 (位置调整以匹配截图)
legend({‘超级电容电流’, ‘电池电流’}, ‘Location’, ‘NorthEast’);
%% 5. (可选) 保存图像
% print(‘current_curves’, ‘-dpng’, ‘-r300’);
代码关键点解析
subplot(2, 1, n):
这个命令将画布分为 2 行 1 列,分别在第 1 和第 2 个位置绘图,完美复刻了上下结构的布局。
数据模拟逻辑:
实际负载 = 基础波形 + 随机噪声 + 脉冲。
电池电流 = filter 函数(低通滤波),这模拟了电池化学特性导致的响应滞后。
超级电容电流 = 差值,这体现了超级电容“削峰填谷”的作用。
颜色匹配:
上图使用了深灰色/黑色 [0.2, 0.2, 0.2]。
下图使用了红色 [0.8, 0, 0] 和蓝色 [0, 0, 0.8],与您提供的截图一致。
box on:
AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。
更多推荐
所有评论(0)