您的位置:首页 > 健康 > 养生 > 大连网站设计九必选仟亿科技_广联达工程造价软件_seo排名官网_上海网站推广系统

大连网站设计九必选仟亿科技_广联达工程造价软件_seo排名官网_上海网站推广系统

2025/5/15 10:31:36 来源:https://blog.csdn.net/qq_40964267/article/details/143592353  浏览:    关键词:大连网站设计九必选仟亿科技_广联达工程造价软件_seo排名官网_上海网站推广系统
大连网站设计九必选仟亿科技_广联达工程造价软件_seo排名官网_上海网站推广系统

【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
    

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com