目录
- 前沿
- 一、案例1
- 1. 系统模型
- 二、案例2
- 1. 系统模型
- 2. 稳定性分析
- 3. 仿真(包含代码)
- 1. 仿真效果
- 2. 仿真结果
- 3. 仿真剖析
- 4. 仿真图与代码
前沿
定义一个系统
x
˙
=
f
(
x
,
u
)
\dot{x} = f(x,u)
x˙=f(x,u), 其中
x
x
x 为状态变量,
u
u
u 为系统输入,其系统框图如下。
此时若假设
u
u
u 是
x
x
x 的函数,即
u
=
ϕ
(
x
)
u = \phi (x)
u=ϕ(x) ,则
x
˙
=
f
(
x
,
ϕ
(
x
)
)
\dot{x} = f(x,\phi(x))
x˙=f(x,ϕ(x))为新的研究对象, 系统框图为
一、案例1
1. 系统模型
{ x ˙ = f ( x , u ) = a x 2 + u u = ϕ ( x ) \begin{cases} \dot{x} = f(x,u) = ax^2+u \\ u= \phi(x) \end{cases} {x˙=f(x,u)=ax2+uu=ϕ(x)
可知, f ( 0 , 0 ) = 0 f(0,0) = 0 f(0,0)=0, 说明 平衡点为原点 ( 0 , 0 ) (0,0) (0,0)。若希望该点为系统渐进稳定的平衡点,则该问题就转化成了原点附近的平衡问题 (stability of origin ) \text{(stability of origin}) (stability of origin),由此易得,只要令 u = − a x 2 − x u = -ax^2-x u=−ax2−x,把其代回系统中,不难发现 x ˙ = − x \dot{x} = -x x˙=−x是一个简单的微分方程,解得 x ( t ) = C e − t x(t) = Ce^{-t} x(t)=Ce−t,当 t → ∞ t \rightarrow \infty t→∞ 时, x → 0 x \rightarrow 0 x→0。
- u u u 包含两部分,“ − a x 2 -ax^2 −ax2” 消除了原系统中的非线性部分,而 “ − x -x −x” 为系统提供稳定。
从该系统可以观察得出,把一个非线性系统,通过我们的输入将其线性话,这种方法叫反馈系统线性化,简单粗暴,只是单纯地消除原系统非线性部分,再添加一个稳定项,看似简单,但这种方法不一定是最佳的。
二、案例2
1. 系统模型
x ˙ = x 2 − x 3 + u \dot{x} = x^2-x^3+u x˙=x2−x3+u
2. 稳定性分析
同理,使用上述反馈线性化的方法,可以令 u = − x 2 + x 3 − x u = -x^2+x^3-x u=−x2+x3−x,一样可得 x ˙ = − x \dot{x} = -x x˙=−x使系统稳定。除了这种粗暴的方法,还有没有更好的呢?当然,对于系统稳定性问题,一定不要忘了李雅普诺夫(Lyapunov)稳定性方法。先来回顾一下李雅普诺夫稳定性:
- 如果对于一个系统
x
˙
=
f
(
x
)
\dot{x} = f(x)
x˙=f(x),
x
˙
=
0
\dot{x} = 0
x˙=0时,
x
=
0
x = 0
x=0,即
x
=
0
x = 0
x=0 为该系统平衡点,如果我们能找到一个Lypunov函数
V
V
V, 使得
{ V ( 0 ) = 0 V ( x ) 正定 V ˙ ( x ) 负定 ⇒ 可推出 x = 0 是渐进稳定的平衡点 \begin{cases} \begin{aligned} V(0) = 0\\ V(x) 正定\\ \dot{V}(x) 负定 \end{aligned} \quad \begin{aligned} \Rightarrow \text{可推出 }x = 0\,\text{是渐进稳定的平衡点} \end{aligned} \end{cases} ⎩ ⎨ ⎧V(0)=0V(x)正定V˙(x)负定⇒可推出 x=0是渐进稳定的平衡点
对于 x ˙ = x 2 − x 3 + u \dot{x} = x^2-x^3+u x˙=x2−x3+u,我们可以取 V = 1 2 x 2 V = \frac{1}{2}x^2 V=21x2, 显然 V V V 正定且 V ( 0 ) = 0 V(0) = 0 V(0)=0。求得
V ˙ = x x ˙ = x ( x 2 − x 3 + u ) = x 3 − x 4 + x u \dot{V} = x\dot{x} = x(x^2-x^3+u) = x^3-x^4+xu V˙=xx˙=x(x2−x3+u)=x3−x4+xu,若要使系统稳定,则需满足负定条件,
即要令 V ˙ < 0 \dot{V} < 0 V˙<0, 显然,第二项 − x 4 -x^4 −x4 本身是负定项,第一项 x 3 x^3 x3 不是负定项, 因此设计 u u u 时,
要考虑将第一项消除,固不难得出
- 设 u = − x 2 − x u = -x^2-x u=−x2−x。 此时 V ˙ = − x 4 − x 2 \dot{V} = -x^4-x^2 V˙=−x4−x2 负定。
- 设 u = − x 2 u = -x^2 u=−x2。 此时, V ˙ = − x 4 \dot{V} = -x^4 V˙=−x4 同样满足负定条件。
所以,综合以上两种方法,针对系统
x
˙
=
x
2
−
x
3
+
u
\dot{x} = x^2-x^3+u
x˙=x2−x3+u, 要使系统稳定
u
u
u 可以被设计为
{
u
1
=
−
x
2
+
x
3
−
x
u
2
=
−
x
2
−
x
u
3
=
−
x
2
\begin{cases} u_1 = -x^2+x^3-x \\ u_2 = -x^2-x \\ u_3 = -x^2 \end{cases}
⎩
⎨
⎧u1=−x2+x3−xu2=−x2−xu3=−x2
均可使系统稳定。
接下来,针对例二,我们通过对该系统进行仿真,研究所设计的 u u u的三种形式 u 1 , u 2 , u 3 u_1, u_2, u_3 u1,u2,u3对系统稳定性的影响。
系统模型如下:
x
˙
=
x
2
−
x
3
+
u
,
{
u
1
=
−
x
2
+
x
3
−
x
u
2
=
−
x
2
−
x
u
3
=
−
x
2
\dot{x} = x^2-x^3+u ,\qquad \begin{cases} u_1 = -x^2+x^3-x \\ u_2 = -x^2-x \\ u_3 = -x^2 \end{cases}
x˙=x2−x3+u,⎩
⎨
⎧u1=−x2+x3−xu2=−x2−xu3=−x2
3. 仿真(包含代码)
1. 仿真效果
如图所示, x u 1 , x u 2 , x u 3 x_{u1}, x_{u2}, x_{u3} xu1,xu2,xu3 分别独立对应系统选择不同的输入 u 1 , u 2 , u 3 u_1, u_2, u_3 u1,u2,u3所呈现的效果。
局部放大后 ⇒ \Rightarrow ⇒
2. 仿真结果
显然
- u 1 u_1 u1(黄色) 虽能在 t → 6 s t \rightarrow 6s t→6s 左右稳定到 0 0 0,但前期响应速度过慢,显然不如 u 2 u_2 u2。
- u 2 u_2 u2(蓝色) 可以实现在最短的时间内(如图3s左右),使 x → 0 x \rightarrow 0 x→0,响应速度最快。
- u 3 u_3 u3(红色) 响应速度略逊 u 2 u_2 u2,且使系统稳定所需时间最长,当 t → 10 s t \rightarrow 10s t→10s时,与 0 0 0 仍有一定误差。
综上,三种输入 u u u 中都可以使系统稳定,但选择 u 2 u_2 u2(蓝色) 作为输入最佳。
3. 仿真剖析
现在来分析一下,为什么会出现不同的效果。
将所设计的 u 1 , u 2 , u 3 u_1, u_2, u_3 u1,u2,u3分被代入原方程 x ˙ = x 2 − x 3 + u \dot{x} = x^2-x^3+u x˙=x2−x3+u,可得三个不同的方程
{
x
˙
=
−
x
,
⇒
x
u
1
=
c
1
e
−
t
x
˙
=
−
x
3
−
x
,
⇒
x
u
2
=
1
e
c
1
+
2
t
−
1
x
˙
=
−
x
3
,
⇒
x
u
3
=
1
c
1
+
2
t
\begin{cases} \begin{align} \dot{x} =& -x, \qquad &\Rightarrow x_{u1} =& c_1e^{-t}\\ \dot{x} = &-x^3-x, \qquad &\Rightarrow x_{u2} =& \frac{1}{\sqrt{e^{c_1+2t}-1}} \\ \dot{x} =& -x^3, \qquad &\Rightarrow x_{u3} =& \frac{1}{\sqrt{c_1+2t}} \end{align} \quad \end{cases}
⎩
⎨
⎧x˙=x˙=x˙=−x,−x3−x,−x3,⇒xu1=⇒xu2=⇒xu3=c1e−tec1+2t−11c1+2t1
从收敛速度来看,由于存在指数项
(
1
)
(1)
(1) 式和
(
2
)
(2)
(2) 式要比
(
3
)
(3)
(3) 式快得多。这也验证了当我们在设计系统
u
2
u_2
u2 时,引入的"
−
x
-x
−x"项,可以对系统的收敛速度有一个很积极的作用。同时,使用反馈线性化这种简单粗暴的方法设计所设计的
u
1
u_1
u1(黄色),虽能使系统稳定,但其效果明显不如李雅普诺夫法设计的
u
2
(
蓝色
)
,
u
3
(
红色
)
u_2(蓝色), u_3(红色)
u2(蓝色),u3(红色)。
4. 仿真图与代码
Mode_system.m
注释:其中 x 1 , x 2 , x 3 x_1,x_2,x_3 x1,x2,x3 为3个独立的状态变量,分被对应代入 u 1 , u 2 , u 3 u_1, u_2, u_3 u1,u2,u3所得的方程 ( 1 ) , ( 2 ) , ( 3 ) (1),(2),(3) (1),(2),(3)的 x x x 解,为避免与代码模板中的 u 冲突,代码中使用 "uc1、uc2、uc3"表示输入不同的输入 u u u。
function [sys,x0,str,ts,simStateCompliance]=mdlInitializeSizes
sizes = simsizes;
sizes.NumContStates = 3;
sizes.NumDiscStates = 0;
sizes.NumOutputs = 6; %x_u1,x_u2,x_u3,uc1,uc2,uc3
sizes.NumInputs = 0;
sizes.DirFeedthrough = 1;
sizes.NumSampleTimes = 1; % at least one sample time is needed
sys = simsizes(sizes);
x0 = [10;10;10];
str = [];
ts = [0 0];
function sys=mdlDerivatives(t,x,u)
x1 = x(1);
x2 = x(2);
x3 = x(3);
uc1 = - x1^2 + x1^3 - x1;
uc2 = - x2^2 - x2;
uc3 = - x3^2;
dx1 = x1^2 - x1^3 + uc1;
dx2 = x2^2 - x2^3 + uc2;
dx3 = x3^2 - x3^3 + uc3;
sys = [dx1;dx2;dx3];
function sys=mdlOutputs(t,x,u)
x1 = x(1);
x2 = x(2);
x3 = x(3);
uc1 = - x1^2 + x1^3 - x1;
uc2 = - x2^2 - x2;
uc3 = - x3^2;
sys = [x1;x2;x3;uc1;uc2;uc3];
相信看完后,你会对非线性系统的基础反馈稳定控制器设计有一个更为清晰的了解,所谓实践出真知,建议初学者跟着这篇文章自己仿真跑一遍,我使用的是s-function函数,你也可以使用Matlab function模块代替。
总算写完了,今天周六,花了一下午的时间尽可能详细地捋清了这篇博客,照顾一下刚入门的初学者,也为记录自己的学历过程,以便日后重温复习,如果本文对你有帮助的话,点个赞再走呗 🫶~
水平有限,若有不足支持,还望广大网友们指正~
参考内容:B站 DR_CAN