一、一阶系统
1.1目标
设计合理的输入
u
u
u,是的下面的系统能够跟踪目标
x
1
d
x_{1d}
x1d 。
x
˙
1
=
x
1
2
−
x
1
3
+
u
(1.1)
\dot x_1 = x_1^2 - x_1^3 + u \tag{1.1}
x˙1=x12−x13+u(1.1)
1.2 设计
观察式子,有非线性项 x 1 2 x_1^2 x12 和 − x 1 3 -x_1^3 −x13。 x 1 2 x_1^2 x12 会使得 x 1 > 0 x_1>0 x1>0 时,系统发散,应通过输入消除;但 − x 1 3 -x_1^3 −x13 这个非线性项有利于系统稳定,应保留。
设
e
1
=
x
1
d
−
x
1
(1.2)
e_1 = x_{1d} - x_1 \tag{1.2}
e1=x1d−x1(1.2)
目标是使得 e 1 → 0 e_1 \to 0 e1→0。设计 Lyapunov函数
V 1 ( e 1 ) = 1 2 e 1 2 (1.3) V_1(e_1) = \frac{1}{2} e_1^2 \tag{1.3} V1(e1)=21e12(1.3)
则:
V ˙ 1 ( e 1 ) = e 1 e ˙ 1 = e 1 ( x ˙ 1 d − x ˙ 1 ) = e 1 ( x ˙ 1 d − x 1 2 + x 1 3 − u ) (1.4) \begin{aligned} \dot V_1(e_1) &= e_1 \dot e_1 \\ &= e_1(\dot x_{1d} - \dot x_1) \\ &= e_1(\dot x_{1d} - x_1^2 + x_1^3 - u) \end{aligned} \tag{1.4} V˙1(e1)=e1e˙1=e1(x˙1d−x˙1)=e1(x˙1d−x12+x13−u)(1.4)
为了使得 V ˙ ( e 1 ) \dot V(e_1) V˙(e1) 负定,令
x ˙ 1 d − x 1 2 + x 1 3 − u = − e 1 (1.5) \dot x_{1d} - x_1^2 + x_1^3 - u = -e_1 \tag{1.5} x˙1d−x12+x13−u=−e1(1.5)
得
u = x ˙ 1 d − x 1 2 + x 1 3 + e 1 = x ˙ 1 d − x 1 2 + x 1 3 + x 1 d − x 1 (1.6) \begin{aligned} u &= \dot x_{1d} - x_1^2 + x_1^3 + e_1 \\ &= \dot x_{1d} - x_1^2 + x_1^3 + x_{1d} - x_1 \tag{1.6} \end{aligned} u=x˙1d−x12+x13+e1=x˙1d−x12+x13+x1d−x1(1.6)
1.3 仿真
设 x 1 d = cos ( t ) x_{1d} = \cos(t) x1d=cos(t),看看跟踪效果:
dt = 0.01; % 时间间隔
N = 1000; % 点数
t=0:dt:(N-1)*dt; % 时间
x1d = cos(t); % 跟踪目标
dx1d = -sin(t); % 目标一阶导数
x1 = zeros(size(x1d)); % 状态x1
k = 1;
for tt=0:dt:(N-2)*dt
u = dx1d(k) - x1(k)^2 + x1(k)^3 + x1d(k) - x1(k); % 设计的输入 u
dx1 = x1(k)^2 - x1(k)^3 + u; % dx1 / dt
x1(k+1) = x1(k) + dx1 * dt; % 更新 x1,注意是加上 dx1 * dt 而不是 dx1
k = k + 1; % 迭代次数
end
plot(t, x1d, 'LineWidth', 2); hold on % 绘制目标曲线
plot(t, x1, '-.', 'LineWidth', 2);hold off % 绘制实际输出曲线
legend('目标值', '输出值');xlabel('时间 t(s)'); % 添加标注
![](https://i-blog.csdnimg.cn/blog_migrate/5c3b8fd1df707d0333d7d684efef76c2.png)
可见,大概2s的时候误差就很小了,跟踪效果不错。
二、二阶系统
2.1 目标
设计合理的输入
u
u
u,是的下面的系统能够跟踪目标
x
1
d
x_{1d}
x1d 。
x
˙
1
=
x
1
2
−
x
1
3
+
x
2
x
˙
2
=
u
(2.1)
\begin{aligned} \dot x_1 &= x_1^2 - x_1^3 + x_2 \\ \dot x_2 &= u \tag{2.1} \end{aligned}
x˙1x˙2=x12−x13+x2=u(2.1)
2.2 设计
Step1: 以 x 2 x_2 x2 为虚拟输入,使得第一个式子趋近于 x 1 d x_{1d} x1d。
设
e 1 = x 1 d − x 1 (2.2) e_1 = x_{1d} - x_1 \tag{2.2} e1=x1d−x1(2.2)
V 1 = 1 2 e 1 2 V_1 = \frac{1}{2} e_1^2 V1=21e12
V ˙ 1 = e 1 e ˙ 1 = e 1 ( x ˙ 1 d − x ˙ 1 ) = e 1 ( x ˙ 1 d − x 1 2 + x 1 3 − x 2 ) \begin{aligned} \dot V_1 &= e_1\dot e_1 \\ &= e_1(\dot x_{1d} -\dot x_1) \\ &= e_1(\dot x_{1d} - x_1^2 + x_1^3 - x_2) \end{aligned} V˙1=e1e˙1=e1(x˙1d−x˙1)=e1(x˙1d−x12+x13−x2)
为使得 V ˙ 1 \dot V_1 V˙1 正定,期望能有一个虚拟输入 x 2 d x_{2d} x2d 使得:
x ˙ 1 d − x 1 2 + x 1 3 − x 2 d = − e 1 \dot x_{1d} - x_1^2 + x_1^3 - x_{2d} = -e_1 x˙1d−x12+x13−x2d=−e1
即:
x 2 d = x ˙ 1 d − x 1 2 + x 1 3 + e 1 (2.3) x_{2d} = \dot x_{1d} - x_1^2 + x_1^3 + e_1 \tag{2.3} x2d=x˙1d−x12+x13+e1(2.3)
Step 2: 现在新的目标是,找到的输入 u u u,使得 x 2 → x 2 d x_2 \to x_{2d} x2→x2d。记:
e 2 = x 2 d − x 2 (2.4) e_2 = x_{2d} - x_2 \tag{2.4} e2=x2d−x2(2.4)
选取 Lyapunov 函数
V 2 = 1 2 e 1 2 + 1 2 e 2 2 V_2= \frac{1}{2} e_1^2 + \frac{1}{2} e_2^2 V2=21e12+21e22
则:
V ˙ 2 = e 1 e ˙ 1 + e 2 e ˙ 2 = e 1 ( x ˙ 1 d − x ˙ 1 ) + e 2 e ˙ 2 = e 1 ( x ˙ 1 d − x 1 2 + x 1 3 − x 2 ) + e 2 e ˙ 2 = e 1 [ x ˙ 1 d − x 1 2 + x 1 3 − ( x 2 d − e 2 ) ] + e 2 e ˙ 2 = e 1 [ x ˙ 1 d − x 1 2 + x 1 3 − ( x ˙ 1 d − x 1 2 + x 1 3 + e 1 − e 2 ) ] + e 2 e ˙ 2 = − e 1 2 + e 2 ( e 1 + e ˙ 2 ) \begin{aligned} \dot V_2 &= e_1\dot e_1 + e_2\dot e_2 \\ &= e_1(\dot x_{1d} - \dot x_1) + e_2\dot e_2 \\ &= e_1(\dot x_{1d} - x_1^2 + x_1^3 - x_2) + e_2 \dot e_2 \\ &= e_1[\dot x_{1d} - x_1^2 + x_1^3 - (x_{2d}-e_2)] + e_2 \dot e_2 \\ &= e_1[\dot x_{1d} - x_1^2 + x_1^3 - (\dot x_{1d} - x_1^2 + x_1^3 + e_1 -e_2)] + e_2 \dot e_2 \\ &= -e_1^2 + e_2(e_1 + \dot e_2) \end{aligned} V˙2=e1e˙1+e2e˙2=e1(x˙1d−x˙1)+e2e˙2=e1(x˙1d−x12+x13−x2)+e2e˙2=e1[x˙1d−x12+x13−(x2d−e2)]+e2e˙2=e1[x˙1d−x12+x13−(x˙1d−x12+x13+e1−e2)]+e2e˙2=−e12+e2(e1+e˙2)
为了使得 V ˙ 2 \dot V_2 V˙2 负定,令:
e 1 + e ˙ 2 = − e 2 e_1 + \dot e_2 = -e_2 e1+e˙2=−e2
即:
e 1 + ( x ˙ 2 d − x ˙ 2 ) = − e 2 \begin{aligned} e_1 +( \dot x_{2d} - \dot x_2) = -e_2 \end{aligned} e1+(x˙2d−x˙2)=−e2
e 1 + ( x ˙ 2 d − u ) = − e 2 \begin{aligned} e_1 +( \dot x_{2d} - u) = -e_2 \end{aligned} e1+(x˙2d−u)=−e2
可得最终设计的输入:
u = e 1 + e 2 + x ˙ 2 d (2.5) u = e_1 + e_2 + \dot x_{2d} \tag{2.5} u=e1+e2+x˙2d(2.5)
将(2.1)~(2.4) 代入(2.5) 可得最终的 u u u。
2.3 仿真
dt = 0.01; % 时间间隔
N = 1000; % 点数
t=0:dt:N*dt; % 时间
x1d = cos(t); % 跟踪目标轨迹
dx1d = -sin(t); % 目标轨迹一阶导数
ddx1d = -cos(t); % 目标轨迹二阶导数
x1 = zeros(size(x1d)); % 状态 x1
x2 = zeros(size(x1d)); % 状态 x2
x2d = x2; % 期望的 x2
k = 1;
for tt=0:dt:(N-2)*dt
e1 = x1d(k) - x1(k); % 误差 e1
x2d(k) = dx1d(k) - x1(k)^2 + x1(k)^3 + e1; % 期望的 x2
e2 = x2d(k) - x2(k); % 误差 e2
dx1 = x1(k)^2 - x1(k)^3 + x2(k); % dx1/dt 状态方程1
dx2d = ddx1d(k) + dx1d(k) + dx1* (-2*x1(k)+3*x1(k)^2 -1); % x2d 的一阶导数
u = e1 + e2 + dx2d; % 最终的输入
dx2 = u; % dx2/dt 状态方程2
x1(k+1) = x1(k) + dx1 * dt; % 更新 x1,注意是加上 dx1 * dt 而不是 dx1
x2(k+1) = x2(k) + dx2 * dt; % 更新 x2,注意是加上 dx2 * dt 而不是 dx2
k = k + 1; % 迭代次数
end
subplot(211);plot(t, x1d, 'LineWidth', 2); hold on % 绘制目标曲线
plot(t, x1, '-.', 'LineWidth', 2);hold off % 绘制实际输出曲线
legend('目标值', '输出值');xlabel('时间 t(s)');ylabel('状态 x_1'); % 添加标注
subplot(212);plot(t, x2d, 'LineWidth', 2); hold on % 绘制目标曲线
plot(t, x2, '-.', 'LineWidth', 2);hold off % 绘制实际输出曲线
legend('目标值', '输出值');xlabel('时间 t(s)');ylabel('状态 x_2'); % 添加标注
![](https://i-blog.csdnimg.cn/blog_migrate/6f69f866f840fbcb9abde4c0ee468eb9.png)
可见,两个状态都逐渐趋近于目标状态,达到跟踪效果。
— 完 —