模型预测控制(MPC)中考虑约束中的不确定性(Matlab代码实现)

news/2024/11/25 12:52:56/

 💥💥💞💞欢迎来到本博客❤️❤️💥💥

🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。

⛳️座右铭:行百里者,半于九十。

📋📋📋本文目录如下:🎁🎁🎁

目录

💥1 概述

📚2 运行结果

🎉3 参考文献

🌈4 Matlab代码实现及文献


💥1 概述

​模型预测控制(model predictive control)顾名思义有三个主要部分构成,1模型;2预测;3控制(做决策),我们只要理解这三个部分和它们之间的关系即可。

1 模型,模型可以是机理模型,也可以是一个基于数据的模型(例如用神经网络training 一个model出来)

2 预测,建立模型的目的是什么呢?建立一个模型并不是放在那里拿来看的,多半是用来做预测用的。我们每天的生活中就在不停地做建模和预测的事情,例如你过马路的时候,会预测一下是否有车能撞到你,例如我们周末想出去旅游了,可能就会去看一下天气预报。在实际生产中也有很多类似的例子,淘宝会预测每件商品未来7天的购买量,物理学家会用牛顿三大定律预测小行星的运动轨迹。

3 控制(做出决策),控制就是我需要做出动作了,在前面的例子中对应起来就是,例如你过马路的时候,会预测一下是否有车能撞到你,如果没有你就赶快过马路(控制动作)。例如淘宝会预测商品未来7天的购买量,就要看如果说有一些商品缺货了的话就赶紧去调货或者生产(控制动作),例如物理学家用牛顿三大定律预测小行星运动轨迹,如果预测到小行星会撞击到地球的话,那就提前需要采取措施来避免小行星的撞击(控制动作)。

在上面的三个例子中,第一个例子你用的是你的大脑根据以往经验学到的模型来做预测,第二个例子中可能你会用神经网络,决策树啊等等机器学习学习到的模型(说到这里可能很多童鞋会比较激动,模型预测控制可以和现在很火的人工智能 深度学习结合在一起),第三个例子中物理学家们用到的是机理模型。总之各种各样的模型都可以做预测,我们身边天天都在做预测,而预测不单单是预测的准就完事了,预测的目的是为了让我们更好的去决策。​

📚2 运行结果

主函数部分代码:

% plot inputs and states 
​
%% run smpc (runs new MPC simulation)
[x,u, x1_limit, sig, beta, s, comp_time]= run_mpc;
​
​
​
%% plot input and states
​
% set up figure for input and states
figure(2)
clf
​
plot_noise = 1;         % plot noise? 0: no; 1: yes (if yes: computation time will also be plotted)
% if noise was not saved, automatically swich to 0
if exist('s','var') == 0plot_noise = 0;
end
​
​
steps = 0:length(x)-1;  % get steps (last input is computed but not applied) 
​
​
% state x1
if plot_noise == 0subplot(3,1,1)
elsesubplot(3,2,1)
end
hold on
title('state - x1')
grid on
plot(steps,x(:,1), 'b', 'Linewidth',0.8)
% plot constraint only if close enough
if x1_limit < 40yline(x1_limit, 'r', 'Linewidth',0.8)ylim([-0.5 x1_limit+0.5]);gamma1 = sqrt(2*[1;0]'*[sig^2 0; 0 sig^2]*[1;0])*erfinv(2*beta-1); % chance constraint addition for first predicted stepyline(x1_limit-gamma1, '
r--
', '
Linewidth
',0.8)
end
xlim([steps(1) steps(end)]);
hold off
​
​
% state x2
if plot_noise == 0subplot(3,1,2)
elsesubplot(3,2,3)
end
hold on
title('
state- x2
')
plot(steps,x(:,2), '
b
', '
Linewidth
',0.8)
grid on
ylim([-0.5 5.5]);
xlim([steps(1) steps(end)]);
hold off
​
​
% input u
if plot_noise == 0subplot(3,1,3)
elsesubplot(3,2,5)
end
K = [0.2858 -0.4910];
u_applied = [];
for i = 1:length(u)u_applied(i,1) = u(i,1) - K*[x(i,1); x(i,2)];
end
hold on
title('
input - u
')
grid on
plot(steps,u_applied(:,1), '
b
', '
Linewidth
',0.8)
yline(0.2,'
r
', '
Linewidth
',0.8)
yline(-0.2,'
r
', '
Linewidth
',0.8)
ylim([-0.25 0.25]);
xlim([steps(1) steps(end)]);
hold off
​
​
% plot noise (given seeding)
% rng(30,'
twister
'); % hardcoded seeding
rng(s);             % retrieve seeding from run_mpc
​
w = [];
​
for i = 1: length(x)w(i,1) = normrnd(0,sig);w(i,2) = normrnd(0,sig);
end

🎉3 参考文献

[1]Lorenz J S,Congcong S,Gabriela C, et al. Chance-constrained stochastic MPC of Astlingen urban drainage benchmark network[J]. Control Engineering Practice,2021,115.

部分理论引用网络文献,若有侵权联系博主删除。

🌈4 Matlab代码实现及文献


http://www.ppmy.cn/news/1155374.html

相关文章

基于Springboot宠物医院管理系统

项目环境&#xff1a; mysql5.7 jdk1.8

理解位运算,左移、右移、与、或、非

位运算是对二进制数的操作&#xff0c;包括左移、右移、&&#xff08;与&#xff09;、|&#xff08;或&#xff09;、^(异或)等操作。 左移 左移就是将当前的二进制数&#xff0c;整体向左移动N个单位&#xff0c;例如整数32的二级制表达为100000&#xff0c;将这个二进制…

Android AMS——停止和结束Activity清理(十三)

上一篇文章,在单个活动内存回收的 activityIdleInternal 函数中主要调用了下面三个方法: scheduleAppGcsLocked:通知所有需要内存回收的进程进行内存回收。processStoppingAndFinishingActivities:获取所有 stop 和 finish 的 activity 列表并清理。trimApplications:全局…

【LeetCode】18. 四数之和

1 问题 给你一个由 n 个整数组成的数组 nums &#xff0c;和一个目标值 target 。请你找出并返回满足下述全部条件且不重复的四元组 [nums[a], nums[b], nums[c], nums[d]] &#xff08;若两个四元组元素一一对应&#xff0c;则认为两个四元组重复&#xff09;&#xff1a; 0…

Spring framework Day15:@lmport注解使用

前言 在编程中&#xff0c;import注解通常用于导入外部的类、接口或其他资源&#xff0c;以便在当前代码文件中使用。它可以提供一种简洁、方便的方式来引入外部依赖&#xff0c;并且有以下几个主要的应用场景和好处&#xff1a; 引入外部类/接口&#xff1a;使用import注解可…

P34~36第八章相量法

8.1复数 复数可表示平面矢量、也可表示正弦量。特别是: 当复数表示正弦量的时候&#xff0c;此时复数称为相量。 8.2复数运算 复数除法也可看做乘法&#xff0c;乘法的几何意义是旋转&#xff08;辐角相加&#xff09;( e^x e^y e^xy)&#xff0c;同时伸缩&#xff08;模变…

【C++】string

string相关 这些构造函数其中常用的有&#xff1a;第一个无参构造&#xff0c;第二个拷贝构造&#xff0c;第四个字符串初始化&#xff0c;第六个使用n个字符c初始化。 其他几个构造可以了解&#xff0c;比如第三个&#xff1a;拷贝某个字符串&#xff0c;从pos位置开始拷贝&am…

XML外部实体注入攻击XXE

xml是扩展性标记语言&#xff0c;来标记数据、定义数据类型&#xff0c;是一种允许用户对自己的标记语言进行定义的源语言。XML文档结构包括XML声明、DTD文档类型定义&#xff08;可选&#xff09;、文档元素&#xff0c;一般无法直接打开&#xff0c;可以选择用excl或记事本打…