连续离散混合系统控制与仿真

摘要 以二阶积分器串联型系统为例,分析了混杂系统的控制器参数设计方法,比较了控制器周期对控制效果的影响,仿真展示了简单混杂系统的良好控制效果,并与纯连续系统与纯离散系统对比,得出的结论是混杂系统的设计方法与纯连续/离散系统区别非常大。

简单二阶系统

先研究最简单的二阶积分器串联型系统
x ˙ 1 = x 2 x ˙ 2 = u \begin{aligned} & \dot x_1 = x_2 \\ & \dot x_2 = u \\ \end{aligned} x˙1=x2x˙2=u
使用零阶保持法离散化(见附录),
A = [ 0 1 0 0 ] , B = [ 0 1 ] A=\begin{bmatrix} 0 & 1 \\ 0 & 0 \end{bmatrix},\quad B=\begin{bmatrix} 0 \\ 1 \end{bmatrix} A=[0010],B=[01]
设控制器周期(即离散化周期)为 T T T 已知,则矩阵指数
( s I − A ) − 1 = [ s − 1 0 s ] − 1 = 1 s 2 [ s 1 0 s ] e A t = L − 1 ( s I − A ) − 1 = L − 1 [ 1 s 1 s 2 0 1 s ] = [ 1 t 0 1 ] F = e A T = [ 1 T 0 1 ] G = ∫ 0 T e A t d t B = [ T T 2 2 0 T ] [ 0 1 ] = [ T 2 2 T ] \begin{aligned} & (sI-A)^{-1}=\begin{bmatrix} s & -1 \\ 0 & s \end{bmatrix}^{-1} =\frac 1{s^2}\begin{bmatrix} s & 1 \\ 0 & s \end{bmatrix} \\ & \text{e}^{At}=\mathcal L^{-1}(sI-A)^{-1}=\mathcal L^{-1} \begin{bmatrix} \frac 1s & \frac 1{s^2} \\ 0 & \frac 1s \end{bmatrix} =\begin{bmatrix} 1 & t \\ 0 & 1 \end{bmatrix} \\ & F=\text{e}^{AT}=\begin{bmatrix} 1 & T \\ 0 & 1 \end{bmatrix} \\ & G=\int_0^T\text{e}^{At}\text{d}tB =\begin{bmatrix} T & \frac{T^2}2 \\ 0 & T \end{bmatrix} \begin{bmatrix} 0 \\ 1 \end{bmatrix} =\begin{bmatrix} \frac{T^2}2 \\ T \end{bmatrix} \end{aligned} (sIA)1=[s01s]1=s21[s01s]eAt=L1(sIA)1=L1[s10s21s1]=[10t1]F=eAT=[10T1]G=0TeAtdtB=[T02T2T][01]=[2T2T]
于是
x ⃗ ( n + 1 ) = F x ⃗ ( n ) + G u ( n ) = [ 1 T 0 1 ] x ⃗ ( n ) + [ T 2 2 T ] u ( n ) \begin{aligned} \vec x(n+1) =& F\vec x(n) + Gu(n) \\ =& \begin{bmatrix} 1 & T \\ 0 & 1 \end{bmatrix}\vec x(n) +\begin{bmatrix} \frac{T^2}2 \\ T \end{bmatrix}u(n) \\ \end{aligned} x (n+1)==Fx (n)+Gu(n)[10T1]x (n)+[2T2T]u(n)

u ( n ) = − K x ⃗ ( n ) = − [ k 1 k 2 ] [ x 1 x 2 ] u(n) = -K\vec x(n) = -\begin{bmatrix} k_1 & k_2 \end{bmatrix} \begin{bmatrix} x_1 \\ x_2 \end{bmatrix} u(n)=Kx (n)=[k1k2][x1x2]
代入得
x ⃗ ( n + 1 ) = ( F − G K ) x ⃗ ( n ) = ( [ 1 T 0 1 ] + [ T 2 2 k 1 T 2 2 k 2 T k 1 T k 2 ] ) x ⃗ ( n ) \begin{aligned} \vec x(n+1) =& (F-GK)\vec x(n) \\ =& \left(\begin{bmatrix} 1 & T \\ 0 & 1 \end{bmatrix} +\begin{bmatrix} \frac{T^2}2k_1 & \frac{T^2}2k_2 \\ Tk_1 & Tk_2 \end{bmatrix} \right)\vec x(n) \\ \end{aligned} x (n+1)==(FGK)x (n)([10T1]+[2T2k1Tk12T2k2Tk2])x (n)
给定两个极点就可以使用比较系数法计算出 k 1 , k 2 k_1,k_2 k1,k2。除此以外还有一种便于使用计算机求解的方法
K = [ 0 ⋯ 0 1 ] [ G F G F n − 1 G ] − 1 α ( F ) K= \begin{bmatrix} 0 & \cdots & 0 & 1 \end{bmatrix} \begin{bmatrix} G & FG & F^{n-1}G \end{bmatrix}^{-1}\alpha(F) K=[001][GFGFn1G]1α(F)
其中 α ( x ) \alpha(x) α(x) 为给定极点的特征多项式,例如给定两个极点为 λ 1 , λ 2 \lambda_1,\lambda_2 λ1,λ2,则 α ( x ) = ( x − λ 1 ) ( x − λ 2 ) \alpha(x)=(x-\lambda_1)(x-\lambda_2) α(x)=(xλ1)(xλ2)。设给定重极点 λ 1 = λ 2 = − 5 \lambda_1=\lambda_2=-5 λ1=λ2=5,变换到离散域 z = e s T = e − 0.5 ≈ 0.6 z=\text e^{sT}=\text e^{-0.5}\approx 0.6 z=esT=e0.50.6,计算出 K = [ 16 ,   7.2 ] K=[16,\ 7.2] K=[16, 7.2]。仿真结果如图所示,图中 u u u 为控制量, y = x 1 y=x_1 y=x1 为状态量。
在这里插入图片描述

与纯连续系统比较

  还是这个二阶系统,当闭环传递函数的极点取到左半平面无穷远时系统响应性能最好,也就是在离散域中两个极点都取到原点时,过渡时间最短而且没有超调,在这个例子中 T = 0.1 T=0.1 T=0.1 K = [ 100 ,   15 ] K=[100,\ 15] K=[100, 15]。但是观察系数 K K K 的取值可以注意到跟纯连续系统有很大区别。对二阶积分器串联型系统
G ( s ) = 1 s 2 ,   x ¨ = u G(s)=\frac 1{s^2},\ \ddot x=u G(s)=s21, x¨=u
设计控制律 u = − k p x − k d x ˙ u=-k_px-k_d\dot x u=kpxkdx˙,闭环传递函数为
1 s 2 + k d s + k p \frac 1{s^2+k_ds+k_p} s2+kds+kp1
k d = 2 k p k_d=2k_p kd=2kp 且两个系数无穷大时就可以使系统响应时间无限短而且没有超调,但是当控制器离散化以后,这个例子中 k p = 100 , k d = 15 k_p=100,k_d=15 kp=100,kd=15,与纯连续系统完全对不上。
  那么当 T → 0 T\rightarrow 0 T0 的时候混杂系统是否跟纯连续系统等价?实际上也不是。不妨算一下 K K K 的表达式
K = [ 0 1 ] [ G F G ] − 1 F 2 = [ 0 1 ] [ T 2 2 3 T 2 2 T T ] − 1 [ 1 2 T 0 1 ] = [ 0 1 ] [ − 1 T 2 3 2 T 1 T 2 − 1 2 T ] [ 1 2 T 0 1 ] = [ 1 T 2 3 2 T ] \begin{aligned} K =& [0 \quad 1][G \quad FG]^{-1}F^2 \\ =& [0 \quad 1]\begin{bmatrix} \frac{T^2}2 & \frac{3T^2}2 \\ T & T \end{bmatrix}^{-1}\begin{bmatrix} 1 & 2T \\ 0 & 1 \end{bmatrix} \\ =& [0 \quad 1]\begin{bmatrix} -\frac{1}{T^2} & \frac{3}{2T} \\ \frac 1{T^2} & -\frac 1{2T} \end{bmatrix}\begin{bmatrix} 1 & 2T \\ 0 & 1 \end{bmatrix} \\ =& \begin{bmatrix}\frac 1{T^2} & \frac 3{2T}\end{bmatrix} \end{aligned} K====[01][GFG]1F2[01][2T2T23T2T]1[102T1][01][T21T212T32T1][102T1][T212T3]
T → 0 T\rightarrow 0 T0 时, k d / k p → 0 k_d/k_p\rightarrow 0 kd/kp0 而不是 2 2 2
  但采样周期 T T T 小了是有好处的。同样取最优的参数 K K K,当 T T T 分别取 0.1 0.1 0.1 1 1 1 时的仿真结果如图所示。
在这里插入图片描述
在这里插入图片描述
可以看出两条曲线完全相同,只是时间尺度差了10倍。

与纯离散系统比较

  作为参考,下面再算一下纯离散系统,用最简单的欧拉离散法
x 1 ( n ) = x 1 ( n − 1 ) + T x 2 ( n ) x 2 ( n ) = x 2 ( n − 1 ) + T u ( n ) (1) \begin{aligned} & x_1(n)=x_1(n-1)+Tx_2(n) \\ & x_2(n)=x_2(n-1)+Tu(n) \\ \end{aligned} \tag{1} x1(n)=x1(n1)+Tx2(n)x2(n)=x2(n1)+Tu(n)(1)
被控对象传递函数为
G ( z ) = ( T 1 − z − 1 ) 2 = T 2 1 − 2 z − 1 + z − 2 G(z)=\left(\frac T{1-z^{-1}}\right)^2=\frac{T^2}{1-2z^{-1}+z^{-2}} G(z)=(1z1T)2=12z1+z2T2
设计控制律
u ( n ) = k 1 [ r ( n − 1 ) − x ( n − 1 ) ] + k 2 [ r ( n − 2 ) − x ( n − 2 ) ] u(n) = k_1[r(n-1)-x(n-1)]+k_2[r(n-2)-x(n-2)] u(n)=k1[r(n1)x(n1)]+k2[r(n2)x(n2)]

( 1 − 2 z − 1 + z − 2 ) x ( z ) = T 2 u ( z ) = T 2 [ ( k 1 z − 1 + k 2 z − 2 ) r ( z ) − ( k 1 z − 1 + k 2 z − 2 ) x ( z ) ] (1-2z^{-1}+z^{-2})x(z)=T^2u(z) =T^2\Big[(k_1z^{-1}+k_2z^{-2})r(z)-(k_1z^{-1}+k_2z^{-2})x(z)\Big] (12z1+z2)x(z)=T2u(z)=T2[(k1z1+k2z2)r(z)(k1z1+k2z2)x(z)]
闭环传递函数为
T 2 ( k 1 z − 1 + k 2 z − 2 ) 1 + ( T 2 k 1 − 2 ) z − 1 + ( T 2 k 2 + 1 ) z − 2 \frac {T^2(k_1z^{-1}+k_2z^{-2})}{1+(T^2k_1-2)z^{-1}+(T^2k_2+1)z^{-2}} 1+(T2k12)z1+(T2k2+1)z2T2(k1z1+k2z2)
设给定闭环极点为 z 1 = z 2 = 0.1 z_1=z_2=0.1 z1=z2=0.1,则 T 2 k 1 = 1.8 T^2k_1=1.8 T2k1=1.8 T 2 k 2 = − 0.99 T^2k_2=-0.99 T2k2=0.99
代码和仿真结果如下
在这里插入图片描述

import matplotlib.pyplot as plt
x1, x2 = 2, 5
T = 0.1
xn1 = xn2 = 0
plotx1 = []
for n in range(10):
    u = (3-xn1) * (1.8/T**2) + (3-xn2) * (-0.99/T**2)
    x2 += T*u
    x1 += T*x2
    xn2 = xn1
    xn1 = x1
    plotx1.append(x1)
plt.plot(plotx1)
plt.show()

可以看出 k 1 k_1 k1 k 2 k_2 k2 里甚至会有负数。我见过很多人仿真的时候要么用纯连续系统要么用纯离散系统,这两种做法都不对。除非实际的控制器和被控对象就是纯连续或纯离散,否则用纯连续或纯离散的理论研究混杂系统会严重影响控制效果。

离散系统的一个坑

  前一节离散系统中用于描述被控对象式(1)的代码中的第8,9行代码

x2 += T*u
x1 += T*x2

没有写反,如果写反的话就错了,变成了对下面系统的描述
x 1 ( n ) = x 1 ( n − 1 ) + T x 2 ( n − 1 ) x 2 ( n ) = x 2 ( n − 1 ) + T u ( n ) \begin{aligned} & x_1(n)=x_1(n-1)+Tx_2(n-1) \\ & x_2(n)=x_2(n-1)+Tu(n) \\ \end{aligned} x1(n)=x1(n1)+Tx2(n1)x2(n)=x2(n1)+Tu(n)
这个问题困扰了我一个多小时。

参考

教材[1]里有更完整的推导过程,链接[2]里有另一个混合系统控制的例子。[3]和[4]是两本书专门讲这个,等有空看看在补充。

  1. 孙增圻. 计算机控制理论与应用. 清华大学出版社.
  2. simucpp系列教程(3)例程解析(第二部分)
  3. Hybrid Dynamical Systems: Fundamentals and Methods
  4. Hybrid Dynamical Systems: Modeling, Stability, and Robustness

附录:零阶保持器离散化

对使用状态空间描述的线性系统
x ⃗ ′ = A x ⃗ + B u y = C x ⃗ + D u \begin{array}{l} \vec x'=A\vec x+Bu \\ y=C\vec x+Du \end{array} x =Ax +Buy=Cx +Du
使用零阶保持法可以离散化成
x ⃗ ( k + 1 ) = F x ⃗ ( k ) + G u ( k ) y ( k ) = C x ⃗ ( k ) + D u ( k ) \begin{array}{l} \vec x(k+1)=F\vec x(k)+Gu(k) \\ y(k)=C\vec x(k)+Du(k) \end{array} x (k+1)=Fx (k)+Gu(k)y(k)=Cx (k)+Du(k)
其中
F = e A T , G = ∫ 0 T e A t d t B F=\text{e}^{AT},G=\int_0^T\text{e}^{At}\text{d}tB F=eAT,G=0TeAtdtB
e A T \text{e}^{AT} eAT 是矩阵指数。
推导
x ′ ( t ) = A x ( t ) + B u ( t ) x ( t ) = e A ( t − t 0 ) x ( t 0 ) + ∫ t 0 t e A ( t − τ ) B u ( τ ) d τ \begin{aligned} & x'(t)=Ax(t)+Bu(t) \\ & x(t)=\text{e}^{A(t-t_0)}x(t_0)+\int_{t_0}^t\text{e}^{A(t-\tau)}Bu(\tau)\text{d}\tau \\ \end{aligned} x(t)=Ax(t)+Bu(t)x(t)=eA(tt0)x(t0)+t0teA(tτ)Bu(τ)dτ
t 0 = k T t_0=kT t0=kT t = ( k + 1 ) T t=(k+1)T t=(k+1)T,则
x ( ( k + 1 ) T ) = e A T x ( k T ) + ∫ k T ( k + 1 ) T e A ( k T + T − τ ) B u ( τ ) d τ ∫ k T ( k + 1 ) T e A ( k T + T − τ ) B u ( τ ) d τ = t = k T + T − τ ∫ 0 T e A t B u ( k T + T − t ) d t x ( k + 1 ) = e A T x ( k ) + ∫ 0 T e A t B d t u ( k ) \begin{aligned} & x((k+1)T)=\text{e}^{AT}x(kT)+\int_{kT}^{(k+1)T}\text{e}^{A(kT+T-\tau)}Bu(\tau)\text{d}\tau \\ & \int_{kT}^{(k+1)T}\text{e}^{A(kT+T-\tau)}Bu(\tau)\text{d}\tau \xlongequal{t=kT+T-\tau}\int_0^T\text{e}^{At}Bu(kT+T-t)\text{d}t \\ & x(k+1)=\text{e}^{AT}x(k)+\int_0^T\text{e}^{At}B\text{d}tu(k) \\ \end{aligned} x((k+1)T)=eATx(kT)+kT(k+1)TeA(kT+Tτ)Bu(τ)dτkT(k+1)TeA(kT+Tτ)Bu(τ)dτt=kT+Tτ 0TeAtBu(kT+Tt)dtx(k+1)=eATx(k)+0TeAtBdtu(k)

附录:代码

计算反馈控制系数 K K K 的代码

#include <iostream>
#include "zhnmat.hpp"
using namespace zhnmat;
using namespace std;
typedef std::vector<double>  vecdble;
Mat polynomial(Mat x, vecdble lambda) {
    double order = x.row();
    if (order != x.col()) return Mat();
    Mat ans = eye(order);
    for (uint32_t i = 0; i < order; i++)
        ans *= x - lambda[i]*eye(order);
    return ans;
}
int main(void) {
    double T = 0.1;
    Mat F(2, 2, vecdble{1, T, 0, 1});
    Mat G(2, 1, vecdble{T*T*0.5, T});
    Mat K = HConcat(G, F*G).inv().atr(1);
    K *= polynomial(F, vecdble{0.6, 0.6});
    cout << K << endl;
}

二阶积分器串联型系统仿真代码

#include "simucpp.hpp"
using namespace simucpp;
int main() {
    Simulator sim1;
    FUIntegrator(uint1, &sim1);
    FUIntegrator(uint2, &sim1);
    FUConstant(cnst1, &sim1);
    FUOutput(uout1, &sim1);
    sim1.connectU(cnst1, uint1);
    sim1.connectU(uint1, uint2);
    sim1.connectU(uint2, uout1);
    sim1.Initialize();
    double ctrl;
    for (uint32_t n1 = 0; n1 < 20; n1++) {
        ctrl = (3-uint2->Get_OutValue()) * 15.24;
        ctrl -= uint1->Get_OutValue() * 7.04;
        for (uint32_t i = 0; i < 100; i++) {
            cnst1->Set_OutValue(ctrl);
            sim1.Simulate_OneStep();
        }
    }
    sim1.Plot();
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值