当前位置: 首页 > article >正文

【MPC-Simulink】EX03 基于非线性系统线性化模型MPC仿真(MIMO)

【MPC-Simulink】EX03 基于非线性系统线性化模型MPC仿真(MIMO)

参考 Matlab 官网提供的 Model Predictive Control Toolbox - Getting Started Guide,以零初始状态条件下的非线性系统在线性化后得到的多输入多输出(MIMO)预测模型为例,使用 Simulink 闭环仿真模型预测控制(MPC)。

1. 线性化非线性系统

  1. 非线性模型使用 Matlab 自带的模型,

    直接使用 open 打开。注意这是一个三输入两输出的非线性系统,三个传递函数模块的初始状态均为0。

    open('mpc_nonlinmodel')
    

    请添加图片描述

  2. 使用 Simulink Control Design 的 linearize 命令,在默认工作点下(传递函数模块的初始状态均为零)对系统进行线性化。得到的线性化模型作为 MPC 控制器中的被控对象模型,用来预测。

    plant = linearize('mpc_nonlinmodel')
    

    请添加图片描述

  3. 为输入和输出变量分配名称:

    plant.InputName = {'Mass Flow'; 'Heat Flow'; 'Pressure'};
    plant.OutputName = {'Temperature'; 'Level'};
    plant.InputUnit = {'kg/s', 'J/s', 'Pa'};
    plant.OutputUnit = {'K', 'm'};
    

2. 设计 MPC 控制器

创建 MPC 控制,可参考

【MPC-Simulink】EX02 高阶线性系统MPC仿真与调试(LTI-MISO)-CSDN博客

  1. 实例化 MPC 控制器对象

    由于未定义任何可测或不可测量的干扰信号,也未定义任何不可测量的输出,因此基于 plant 创建MPC控制器时,默认情况下所有系统输入均被视为可控输入(MV),所有系统输出均被视为可测量输出(MO)。

    mpcobj = mpc(plant, 0.2, 5, 2);
    
    • 采样时间 0.2 秒
    • prediction horizon 5 步
    • control horizon 2 步
  2. 为控制变量指定硬约束。

    mpcobj.MV = struct('Min',{-3; -2; -2}, 'Max',{3; 2; 2}, 'RateMin',{-1000; -1000; -1000});
    
  3. 定义控制变量和输出信号的权重。

    mpcobj.Weights = struct('MV', [0 0 0], 'MVRate', [0.1 0.1 0.1], 'OV', [1 1]);
    

    代价函数定义参考

    [Optimization Problem

    • MATLAB & Simulink
    • MathWorks 中国](https://ww2.mathworks.cn/help/mpc/ug/optimization-problem.html)
  4. 显示 MPC 控制器属性

    mpcobj
    

    请添加图片描述

3. 跟踪阶跃信号

  1. 打开示例的 Simulink 模型进行闭环仿真。

    该系统模型与线性化时使用的模型相同,MPC 控制器将基本工作区中的 MPC 对象 mpcobj 作为参数。输出1的参考信号为阶跃信号,仿真开始时从0上升到1。输出2的参考信号也使用阶跃信号。注意仿真被控对象使用的是非线性模型。

    mdl1 = 'mpc_nonlinear';
    open_system(mdl1)
    

    请添加图片描述

  2. 运行仿真

    sim(mdl2,12)
    

    可测量输出与参考信号

    请添加图片描述

    三个可控输入

    请添加图片描述

4. 跟踪斜坡信号

  1. 为了在补偿非线性因素的同时跟踪斜坡信号,需要在两个输出上定义一个三阶积分的干扰模型(如果没有非线性,用二阶积分就足够了)。

    outdistmodel = tf({1 0; 0 1}, {[1 0 0 0], 1; 1, [1 0 0 0]})
    setoutdist(mpcobj, 'model', outdistmodel);
    getoutdist(mpcobj)
    

    请添加图片描述

  2. 打开预设的Simulink模型进行闭环仿真。该模型与先前的闭环模型相同,但第一输出的参考信号不再是阶跃信号,而是在3秒后以0.2的斜率上升的斜坡信号。

    mdl2 = 'mpc_nonlinear_setoutdist';
    open_system(mdl2);
    
  3. 仿真

    sim(mdl2,12)
    

    请添加图片描述

    请添加图片描述

5. 无约束条件下的仿真

当约束不激活时,MPC 控制器的行为类似于线性控制器。为了说明这一点,可以在闭环中仿真两个无约束MPC控制器的版本。

  1. 移除可控输入约束

    mpcobj.MV
    

    请添加图片描述

    mpcobj.MV = [];
    
  2. 然后将输出干扰模型重置为默认值(仅在下一步中获取更简化的线性 MPC 控制器版本时使用):

    setoutdist(mpcobj, 'integrators');
    
  3. 将无约束的MPC控制器转换为线性时不变 (LTI) 状态空间动态系统,输入向量为 [ym; r],其中 ym 是测量的输出信号向量(在给定时间步),r 是输出参考信号向量(在相同时间步)。

    LTI = ss(mpcobj,'r'); % use reference as additional input signal
    
  4. 打开预设的Simulink模型以进行闭环仿真。

    • “references” 块包含两个阶跃信号(分别在4秒和0秒后生效),作为参考信号。
    • “MPC control loop” 块等效于第一个闭环,不同之处在于该参考信号作为输入提供。
    • “Linear control loop” 块等效于 “MPC control loop” 块,不同的是控制器为LTI块,其参数为工作区中的状态空间对象 LTI
    refs = [1;1]; % set values for step signal references 
    mdl3 = 'mpc_nonlinear_ss'; 
    open_system(mdl3)
    

    请添加图片描述

    MPC 控制器的闭环系统和之前的类似,线性化控制器如下

    请添加图片描述

    sim(mdl3)
    

    可测量输出

    请添加图片描述

    请添加图片描述

    可控输入

    请添加图片描述

    请添加图片描述

    输入和输出信号在两个闭环系统中看起来是相同的。此外,注意可控输入不再受先前约束的限制(为了对比线性化控制器,之前将 MPC 控制器的约束移除了)。

  5. 比较

    fprintf('Compare output trajectories: ||ympc-ylin|| = %g\n',norm(ympc-ylin)); 
    

    控制性能接近

    Compare output trajectories: ||ympc-ylin|| = 1.53023e-14
    

http://www.kler.cn/a/390191.html

相关文章:

  • 爱普生SG-8200CJ可编程晶振在通信设备中的应用
  • LLMs 如何处理相互矛盾的指令?指令遵循优先级实验
  • Unity3D实现视频和模型融合效果
  • 操作系统离散存储练习题
  • Rust 建造者模式
  • 论文阅读《机器人状态估计中的李群》
  • 光流法(Optical Flow)
  • 云岚到家 秒杀抢购
  • VCSVerdi:KDB文件的生成和导入
  • QT Unknown module(s) in QT 以及maintenance tool的更详细用法(qt6.6.0)
  • P1打卡-使用Pytorch实现mnist手写数字识别
  • 解锁高效直播新体验:第三代 AI 手机自动直播工具,开启直播高效运作新时代!
  • 网页web无插件播放器EasyPlayer.js点播播放器遇到视频地址播放不了的现象及措施
  • 设计模式(主要的五种)
  • 软件设计师 - 层次化存储
  • 大数据-216 数据挖掘 机器学习理论 - KMeans 基于轮廓系数来选择 n_clusters
  • 鸿蒙UI开发——小图标的使用
  • 使用API有效率地管理Dynadot域名,列表形式查看账户whois联系人信息
  • Dubbo负载均衡
  • Baget 私有化nuget
  • SpringBoot助力企业资产优化
  • Matlab实现鹈鹕优化算法(POA)求解路径规划问题
  • [Docker#4] 镜像仓库 | 部分常用命令
  • AI生活之我用AI处理Excel表格
  • go函数传值是值传递?还是引用传递?slice案例加图解
  • 数据分析-44-时间序列预测之深度学习方法TCN