Smith Predictor是针对时滞系统的。

原理:看Matlab help中的"Control of Processes with Long Dead Time: The Smith Predictor"足矣,写的非常好。

假设有一个有时滞的一阶模型,其传递函数如下:

s = tf('s');
P = exp(-93.9*s) * 5.6/(40.2*s+1);
P.InputName = 'u';
P.OutputName = 'y';
P

得到:

P =From input "u" to output "y":5.6exp(-93.9*s) * ----------40.2 s + 1

注意到时滞常数93.9是系统时间常数的两倍还多,

其阶跃响应如下:

step(P), grid on

我们常使用PI控制器来控制被控对象P:

C为PI控制器:

Cpi =1      1 Kp * (1 + ---- * ---)Ti     s 

这里,我们用PIDTUNE指令来tune一个PI控制器,包括用pidstd创建一个标准的PID控制器(Kp=1,Ti=1),设定开环带宽为0.006rad/s:

Cpi = pidtune(P,pidstd(1,1),0.006);
Cpi

得到:

Cpi =1      1 Kp * (1 + ---- * ---)Ti     s with Kp = 0.0501, Ti = 47.3Continuous-time PI controller in standard form

闭环系统的阶跃响应如下(feedback的第一个参数为PI控制器开环传函,第二个参数为测量单元传函):

Tpi = feedback([P*Cpi,1],1,1,1);  % closed-loop model [ysp;d]->y
Tpi.InputName = {'ysp' 'd'};step(Tpi), grid on

可以看出,闭环阶跃响应的超调幅度勉强可以接收,但是稳定的时间有点太长了(差不多600s)。为了提高响应速度,是否可以增加Kp呢?下面测试3种Kp:

Kp3 = [0.06;0.08;0.1];      % try three increasing values of Kp
Ti3 = repmat(Cpi.Ti,3,1);   % Ti remains the same
C3 = pidstd(Kp3,Ti3);       % corresponding three PI controllers
T3 = feedback(P*C3,1);
T3.InputName = 'ysp';step(T3)
title('Loss of stability when increasing Kp')

超调最大的就是Kp=0.1的情况。可以看出,在pidtune的情况下,增大Kp就增加了超调、引入了不稳定。

PI控制器对于时滞系统而言,其性能受限于long dead time,此时PI显得“缺乏耐心”。一个例子就是在我们用淋浴洗澡。因为水管比较长,因此它是一个时滞系统。如果我们“缺乏耐心”的调整水温,会频繁的冷热交替、让人非常烦恼。一个比较好的策略就是在进一步调整之前,等待当前setting的水温先发生变化。如果我们学习到了哪个setting可以得到我们想要的水温,我们就可以如尝所愿。这个就是“Smith compensator”的思想。

Smith预估器(或者称‘补偿器’)的框图如下:

假设P是水管,那么在Smith预估器中,我们就用一个Gp(系统内模)来预测没有时滞的系统输出(即上图中的yp)。在我们水管的例子中,Gp就是最佳水温对应的setting,yp就是水管长度为0时输出的水温。

然后将这个yp和ysp(水温设定值)进行比较,经过控制器C后得到控制量u。为了防止drift并抑制外部干扰,还需要将预测部分经过时滞环节的输出y1和实际被控对象的输出y进行比较,得到差值dy;dy经过滤波器F后会贡献给e。

综上可以看出,使用Smith预估器的前提是:

  • 准确估计系统的内模Gp(越接近实际的P越好)。
  • 准确估计系统的时滞环节τ
  • 设置控制器C

对于前述系统,

P =From input "u" to output "y":5.6exp(-93.9*s) * ----------40.2 s + 1

我们设置Gp和P一样(这里假设“百分百准确”的内模估计):

F使用一个20s的一阶滤波器:

F = 1/(20*s+1);
F.InputName = 'dy';
F.OutputName = 'dp';

对于C,我们使用PI控制器。这样,我们便构建了一个Smith预估器。通过它,我们可以增加系统的开环带宽、减少超调。如下所示,在用connet构建了总的plant后,我们用pidtuneIptions设计了一个90°的相位裕度、带宽为0.08rad/s的系统:

% Prediction model
Gp = 5.6/(40.2*s+1);
Gp.InputName = 'u';
Gp.OutputName = 'yp';Dp = exp(-93.9*s);
Dp.InputName = 'yp'; Dp.OutputName = 'y1';% Overall plant
S1 = sumblk('ym = yp + dp');
S2 = sumblk('dy = y0 - y1');
Plant = connect(P,Gp,Dp,F,S1,S2,'u','ym');% Design PI controller with 0.08 rad/s bandwidth and 90 degrees phase margin
Options = pidtuneOptions('PhaseMargin',90);
C = pidtune(Plant,pidstd(1,1),0.08,Options);
C.InputName = 'e';
C.OutputName = 'u';
C

下面比较一下有Smith预估器的闭环系统和只有PI控制器的系统的阶跃响应,前者的代码为:

% Assemble closed-loop model from [y_sp,d] to y
Sum1 = sumblk('e = ysp - yp - dp');
Sum2 = sumblk('y = y0 + d');
Sum3 = sumblk('dy = y - y1');
T = connect(P,Gp,Dp,C,F,Sum1,Sum2,Sum3,{'ysp','d'},'y');

比较:

step(T,'b',Tpi,'r--')
grid on
legend('Smith Predictor','PI Controller')

可以看出,Smith预估器没有超调、响应极快(当然,前提是估计的内模是完全准确的)。

对应的Bode图也印证了这一点,看下图中的带宽和相位裕度:

----------------------------------------------------Simulink分割线-----------------------------------------------------

上面的例子是用脚本写的。而在Simulink中,已经有了现成的Smith Predictor Controller模块,可以直接用。如果想用这个模块复现"Control of Processes with Long Dead Time: The Smith Predictor"的例子,需要注意:Smith Predictor Controller是离散的,因此在写传函时不能和连续的传函形式一样,而应该用Matlab的c2d函数先将例子中的TF进行转换:

>> h = tf(5.6,[40.2 1]);
>> hd = c2d(h,0.1)hd =0.01391----------z - 0.9975Sample time: 0.1 seconds
Discrete-time transfer function.

再设置Smith Predictor Controller中的Numerator和Denominator:

框图如下:

仿真结果如下(红色的y为Smith预估器的仿真输出,其他的y为PI控制器的仿真输出):

可以看出,在模型无误差的情况下,Smith预估器可以允许有更大的Kp、响应快速、且没有超调。

Matlab中的Smith 预估器相关推荐

  1. smith预估 matlab,毕业论文】大滞后系统Smith预估器的控制仿真

    <毕业论文]大滞后系统Smith预估器的控制仿真>由会员分享,可在线阅读,更多相关<毕业论文]大滞后系统Smith预估器的控制仿真(6页珍藏版)>请在人人文库网上搜索. 1.毕 ...

  2. 基于Smith预估器的PID控制在房间湿度控制

    摘要:本文首先对空调进行相关数据采集,通过MATLAB软件,用最小二乘法,建立冷水阀门开度与厂房房间内温度间的数学模型,为系统仿真提供模型依据. 本文第3章先介绍了SMITH预估原理,并将其改进.在预 ...

  3. matlab中离散数值求解器在哪,matlab - 在ode MATLAB求解器上使用中间值 - SO中文参考 - www.soinside.com...

    我正在使用刚性求解器(ode15s)对ODE系统进行时间积分.它工作正常,但我想加快速度. 方程组以状态空间形式给出: function [dx] = fun(t,x,M,C,K,other_para ...

  4. matlab中矩阵方程的求解器,矩阵方程的计算求解(Matlab实现)

    一.Lyapunov方程的计算求解 1.连续Lyapunov方程 连续Lyapunov方程可以表示为: AX + XA* = -C % 其中A*是A的转置 Lyapunov方程源于微分方程稳定性理论, ...

  5. 史密斯预估器matlab仿真,(毕业论文)史密斯预估器设计.doc

    (毕业论文)史密斯预估器设计 摘 要 大迟延对象的控制一直是控制领域研究的焦点问题.加热炉温度控制便属于这类复杂的控制对象.传统的加热炉温度控制系统采用的是原料油出口温度同燃料油流量或同炉膛温度的串级 ...

  6. 模糊神经网络-PID Smith预估集成控制系统

    我们在matlab2021a中建立如下的simulink模型: 对模糊神经网络PID-Smith预估控制(图中简称RBF-FUZZY-PID)和传统的PID控制方法进行比较.被控对象模型中.和=10, ...

  7. Smith预估控制器

    Smith预估器主要针对存在大滞后的系统,作用延迟和反馈延迟环节的控制,Smith预估器的另一篇文章,请参看下面的博客文章: 博途1200/1500PLC Smith预估器(补偿器)算法实现(FB)_ ...

  8. 基于matlab介绍传感器融合和跟踪工具箱中用于评估跟踪器性能的不同定量分析工具(附源码)

    目录 一.分配和错误指标 1.1 轨道和真相定义 1.2 计算和分析指标 1.3 分析分配指标 ​编辑 1.4 分析错误指标 ​编辑二.将指标汇总为分数 2.1 欧斯帕公制 2.2 分析 OSPA 指 ...

  9. matlab figure函数_如何在Matlab中使用GUI做一个简易音乐播放器? ---- (六)控件间的数据传递...

    我纠结了两个星期是否要写这一章-最后决定还是要写一章收尾,来解释其中的控件间的数据传递问题. 在前五篇中,如果有童鞋跟上了我的思路或者做完了这样一个gui,会发现还有一个一直避开的遗留问题,就是将歌曲 ...

最新文章

  1. 设计模式之享元模式学习笔记
  2. Two ways to assign values to member variables
  3. 数据库设计与查询语句的优化
  4. 浅拷贝 python_python中什么是浅拷贝
  5. 两个操作字符串的方法:读取指定位置的字符和找出某个字符串的位置
  6. iometer-2006_07_27.common-src编译
  7. 从服务器检索时出错dfdferh01_大数据实战项目之海量人脸特征检索解决方案演进...
  8. .net framework摘抄与理解
  9. 腾讯 AI“绝悟”升级至王者荣耀电竞职业水平 测试胜率达99.8%
  10. java object 判断null_java判断object为null
  11. Java 调用gc语句_java GC机制(转)
  12. python爬虫58同城租房
  13. 21世纪 直销势不可挡
  14. D2D与其他短距离通信技术
  15. [深入研究4G/5G/6G专题-45]: 5G Link Adaption链路自适应-1-总体架构
  16. SpringBoot redis GEO 实战应用
  17. 用Python做一个猜数游戏(入门)
  18. Linux查看/设置服务器时间
  19. linux——目录说明
  20. Mac磁盘读写神器Tuxera NTFS for Mac2023功能介绍

热门文章

  1. java微信分享demo
  2. 计算机操作上机考试题目,计算机系统操作工上机操作考试题.pdf
  3. 大数据面试3分钟自我介绍_通用面试两分钟自我介绍范文5篇
  4. 算法实践:数独的基本解法
  5. 路由器NAT 类型检测实现
  6. 字体图标在服务器上显示不出来,fontawesome图标字体库组件在服务器上显示不出来图标的解决...
  7. 2022 SMUCTF 永远都对-rui WriteUp
  8. 01 创建一个二维地图
  9. 使用pg_repack实现在线vacuum
  10. 一些蓝桥杯的简单模拟题目