simucpp系列教程(3)例程解析(第二部分)

专栏目录

专栏所有文章见 simucpp系列教程


  (摘要)simucpp的第二部分例程解读,包含连续离散混合仿真、一些常用的控制器、矩阵微分方程等。引入了更复杂的矩阵模块。

demo1/2 连续离散混合仿真

  例题出自孙增圻《计算机控制理论与应用》第二版2.3.1节。
在这里插入图片描述
被控对象传递函数和微分方程分别为
G ( s ) = 1 s ( 10 s + 1 ) 10 d 2 y d t 2 + d y d t = u G(s)=\frac{1}{s(10s+1)} \\ 10\frac{\text{d}^2y}{\text{d}t^2}+\frac{\text{d}y}{\text{d}t}=u G(s)=s(10s+1)110dt2d2y+dtdy=u
在每个采样周期内离散控制器 D ( z ) D(z) D(z)输出的 u ( t ) u(t) u(t)为常数, G ( s ) G(s) G(s)输出为 y ( t ) y(t) y(t),解得 y ′ ( t ) = u − C 1 e − 0.1 t y'(t)=u-C_1\text{e}^{-0.1t} y(t)=uC1e0.1t y ( t ) = u t + 10 C 1 e − 0.1 t + C 2 y(t)=ut+10C_1\text{e}^{-0.1t}+C_2 y(t)=ut+10C1e0.1t+C2。若给定初值 y ( 0 ) = y 1 y(0)=y_1 y(0)=y1 y ′ ( 0 ) = y 2 y'(0)=y_2 y(0)=y2,则
y ( t ) = u t + y 1 + 10 ( u − y 2 ) ( e − 0.1 t − 1 ) y ′ ( t ) = ( 1 − e − 0.1 t ) u + e − 0.1 t y 2 y(t)=ut+y_1+10(u-y_2)(\text{e}^{-0.1t}-1) \\ y'(t)=(1-\text{e}^{-0.1t})u+\text{e}^{-0.1t}y_2 y(t)=ut+y1+10(uy2)(e0.1t1)y(t)=(1e0.1t)u+e0.1ty2
  这两个例子使用3种方法分别计算,最后得出相同的结果但有微小误差。第一种方法是demo1中直接按上图中的结构搭建;第二种方法的思路是,仿真器初始化完成后,根据给定初始值 y 1 , y 2 y_1,y_2 y1,y2,在每个采样周期内运行一次仿真,一次仿真后将仿真器内部时间清零,并将当前两个积分器的初始值设置为下一次仿真的初始值,更新离散控制器之后,在下一个采样周期内开始下一次仿真;第三种方法与第二种方法类似,但在每个采样周期内求微分方程的解析解。前两种方法分别对应demo1和demo2,第三种方法的python代码在下文给出。
  设计连续控制器为
D ( s ) = 10 s + 1 s + 1 D(s)=\frac{10s+1}{s+1} D(s)=s+110s+1
不同的采样周期下离散化得到不同的离散控制器,下面以 T = 1 T=1 T=1 T = 0.2 T=0.2 T=0.2分别介绍仿真和验证的具体思路方法,具体关于控制器设计和离散化的理论分析见书上的内容。

T = 1 T=1 T=1
T = 1 T=1 T=1时设计控制器的离散传递函数为
D ( z ) = 6.64 − 6.008 z − 1 1 − 0.3679 z − 1 D(z)=\frac{6.64-6.008z^{-1}}{1-0.3679z^{-1}} D(z)=10.3679z16.646.008z1
控制器的差分方程为
u ( k ) = 0.3679 u ( k − 1 ) + 6.64 e ( k ) − 6.008 e ( k − 1 ) u(k)=0.3679u(k-1)+6.64e(k)-6.008e(k-1) u(k)=0.3679u(k1)+6.64e(k)6.008e(k1)
对微分方程,一个周期后
y ( 1 ) = u + y 1 − 10 ( 1 − C ) ( u − y 2 ) y ′ ( 1 ) = ( 1 − C ) u + C y 2 y(1)=u+y_1-10(1-C)(u-y_2) \\ y'(1)=(1-C)u+Cy_2 y(1)=u+y110(1C)(uy2)y(1)=(1C)u+Cy2
其中 C = e − 0.1 C=\text{e}^{-0.1} C=e0.1

python的仿真结果为
u ( 20 ) = 0.12642514990385767 u(20)=0.12642514990385767 u(20)=0.12642514990385767 y ( 20 ) = 0.9972632123750569 y(20)=0.9972632123750569 y(20)=0.9972632123750569
demo2的仿真结果为
u ( 20 ) = 0.1264251499038471 u(20)=0.1264251499038471 u(20)=0.1264251499038471 y ( 20 ) = 0.9972632123750584 y(20)=0.9972632123750584 y(20)=0.9972632123750584
demo1的仿真结果为
u ( 20 ) = 0.1264251499038229 u(20)=0.1264251499038229 u(20)=0.1264251499038229 y ( 20 ) = 0.9972632123750599 y(20)=0.9972632123750599 y(20)=0.9972632123750599

T = 0.2 T=0.2 T=0.2
T = 0.2 T=0.2 T=0.2时,同样的方法设计控制器的离散传递函数为
D ( z ) = 9.1565 − 8.9752 z − 1 1 − 0.8187 z − 1 D(z)=\frac{9.1565-8.9752z^{-1}}{1-0.8187z^{-1}} D(z)=10.8187z19.15658.9752z1
控制器的差分方程为
u ( k ) = 0.8187 u ( k − 1 ) + 9.1565 e ( k ) − 8.9752 e ( k − 1 ) u(k)=0.8187u(k-1)+9.1565e(k)-8.9752e(k-1) u(k)=0.8187u(k1)+9.1565e(k)8.9752e(k1)
被控对象的微分方程中
y ( 0.2 ) = 0.2 u + y 1 − 10 ( 1 − C ) ( u − y 2 ) y ′ ( 0.2 ) = ( 1 − C ) u + C y 2 y(0.2)=0.2u+y_1-10(1-C)(u-y_2) \\ y'(0.2)=(1-C)u+Cy_2 y(0.2)=0.2u+y110(1C)(uy2)y(0.2)=(1C)u+Cy2
其中 C = e − 0.02 C=\text{e}^{-0.02} C=e0.02

python的仿真结果为
u ( 5 ) = 0.22111965473593398 u(5)=0.22111965473593398 u(5)=0.22111965473593398 y ( 5 ) = 1.0796760390310833 y(5)=1.0796760390310833 y(5)=1.0796760390310833
demo2的仿真结果为
u ( 5 ) = 0.2211196547359040 u(5)=0.2211196547359040 u(5)=0.2211196547359040 y ( 5 ) = 1.079676039031079 y(5)=1.079676039031079 y(5)=1.079676039031079
demo1的仿真结果为
u ( 5 ) = 0.2211196547359036 u(5)=0.2211196547359036 u(5)=0.2211196547359036 y ( 5 ) = 1.079676039031079 y(5)=1.079676039031079 y(5)=1.079676039031079

python代码
python代码如下:

import numpy as np
T = 1
C = np.exp(-0.1*T)
y1, y2 = 0, 0
u = 0
e, e1 = 0, 0
for n in range(21):
    e1 = e
    e = 1 - y1
    u = 0.3679*u + 6.64*e - 6.008*e1
    y1 = u*T + y1 - 10 * (1-C) * (u-y2)
    y2 = (1-C)*u + C*y2
    print(u, y1)
import numpy as np
T = 0.2
C = np.exp(-0.1*T)
y1, y2 = 0, 0
u = 0
e, e1 = 0, 0
for n in range(26):
    e1 = e
    e = 1 - y1
    u = 0.8187*u + 9.1565*e - 8.9752*e1
    y1 = u*T + y1 - 10 * (1-C) * (u-y2)
    y2 = (1-C)*u + C*y2
    print(u, y1)

demo3 连续离散混合仿真2

例题出自胡寿松《自动控制原理》第六版例7-26。令K=1.2。
在这里插入图片描述
与demo1/2类似,
y ′ ′ ( t ) + y ′ ( t ) = K u y ( t ) = K u t + y 1 − ( K u − y 2 ) ( 1 − e − t ) y ′ ( t ) = K ( 1 − e − t ) u + e − t y 2 y''(t)+y'(t)=Ku \\ y(t)=Kut+y_1-(Ku-y_2)(1-\text{e}^{-t}) \\ y'(t)=K(1-\text{e}^{-t})u+\text{e}^{-t}y_2 y′′(t)+y(t)=Kuy(t)=Kut+y1(Kuy2)(1et)y(t)=K(1et)u+ety2

import numpy as np
T = 0.5
K = 1.2
C = np.exp(-T)
y1, y2 = 0, 0
for n in range(21):
    u = 1 - y1
    y1 = K*u*T + y1 - (K*u-y2)*(1-C)
    y2 = K*(1-C)*u + C*y2
    print(u, y1)
t = 10 t=10 t=10时刻的值u(10)y(10)
python(T=1)-0.5156644997261003-0.32340702935035215
demo3(T=1,step= 1 1024 \frac{1}{1024} 10241)-0.5156644997260939-0.3234070293503586
demo3(T=1,step=0.001)-0.5156644997272863-0.323407029348769
python(T=0.5)-0.03453280518366397-0.8045387238927885
demo3(T=0.5,step=0.001)-0.03453280518450663-0.8045387238915487

demo4 PID控制

demo7 状态空间

例题出自郑大钟《线性系统理论》第二版课后题2.12。
x ˙ = [ − 5 − 1 3 − 1 ] x + [ 2 5 ] u y = [ 1 2 ] x + 4 u \dot{\boldsymbol{x}}=\left[\begin{matrix} -5 & -1 \\ 3 & -1 \end{matrix}\right]\boldsymbol{x}+\left[\begin{matrix} 2 \\ 5 \end{matrix}\right]u \\ y=\left[\begin{matrix} 1 & 2 \end{matrix}\right]\boldsymbol{x}+4u x˙=[5311]x+[25]uy=[12]x+4u
等价的传递函数
G ( s ) = 4 s 2 + 36 s + 91 s 2 + 6 s + 8 G(s)=\frac{4s^2+36s+91}{s^2+6s+8} G(s)=s2+6s+84s2+36s+91

demo8 线性微分方程组

这是第一部分例程的线性微分方程组对应的使用矩阵模块重新搭建模型的例程。

demo12/13 直流电机

(详细公式推导见 中学知识推导直流电机数学模型
在这里插入图片描述

输入电压 u u u400
线圈电感 L L L0.0189
线圈内阻 R R R1.309
转子和负载的转动惯量 J J J0.32
黏性摩擦系数 f f f0
转矩系数 C m C_m Cm2.589
反电动势系数 C e C_e Ce2

左图为电流曲线,右图为转速曲线。
在这里插入图片描述

demoadrc 自抗扰控制

跟踪微分器

左图为 x 1 x_1 x1,右图为 x 2 x_2 x2
在这里插入图片描述

扩张状态观测器

在这里插入图片描述
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值