反步法设计非线性控制器


一、一阶系统


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=x12x13+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=x1dx1(1.2)

目标是使得 e 1 → 0 e_1 \to 0 e10。设计 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˙1dx˙1)=e1(x˙1dx12+x13u)(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˙1dx12+x13u=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˙1dx12+x13+e1=x˙1dx12+x13+x1dx1(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)');    % 添加标注

可见,大概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=x12x13+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=x1dx1(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˙1dx˙1)=e1(x˙1dx12+x13x2)

为使得 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˙1dx12+x13x2d=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˙1dx12+x13+e1(2.3)

Step 2: 现在新的目标是,找到的输入 u u u,使得 x 2 → x 2 d x_2 \to x_{2d} x2x2d。记:

e 2 = x 2 d − x 2 (2.4) e_2 = x_{2d} - x_2 \tag{2.4} e2=x2dx2(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˙1dx˙1)+e2e˙2=e1(x˙1dx12+x13x2)+e2e˙2=e1[x˙1dx12+x13(x2de2)]+e2e˙2=e1[x˙1dx12+x13(x˙1dx12+x13+e1e2)]+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˙2dx˙2)=e2

e 1 + ( x ˙ 2 d − u ) = − e 2 \begin{aligned} e_1 +( \dot x_{2d} - u) = -e_2 \end{aligned} e1+(x˙2du)=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');    % 添加标注

可见,两个状态都逐渐趋近于目标状态,达到跟踪效果。

— 完 —

  • 15
    点赞
  • 130
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 7
    评论
反步法(Backpropagation)是一种常用的神经网络训练算法,用于计算神经网络中各个参数的梯度,并通过梯度下降法来更新参数。下面是一个简单的MATLAB代码示例,用于实现反步法算法: ```matlab % 定义神经网络结构和参数 inputSize = 2; % 输入层大小 hiddenSize = 3; % 隐含层大小 outputSize = 1; % 输出层大小 learningRate = 0.1; % 学习率 % 初始化权重和偏置 W1 = randn(hiddenSize, inputSize); % 输入层到隐含层的权重 b1 = randn(hiddenSize, 1); % 隐含层的偏置 W2 = randn(outputSize, hiddenSize); % 隐含层到输出层的权重 b2 = randn(outputSize, 1); % 输出层的偏置 % 定义反步法算法 for epoch = 1:numEpochs % 前向传播 z1 = W1 * input + b1; a1 = sigmoid(z1); z2 = W2 * a1 + b2; output = sigmoid(z2); % 计算损失函数的梯度 delta2 = (output - target) .* sigmoidGradient(z2); delta1 = (W2' * delta2) .* sigmoidGradient(z1); % 更新权重和偏置 W2 = W2 - learningRate * delta2 * a1'; b2 = b2 - learningRate * delta2; W1 = W1 - learningRate * delta1 * input'; b1 = b1 - learningRate * delta1; end ``` 上述代码中,我们首先定义了神经网络的结构和参数,包括输入层大小、隐含层大小、输出层大小和学习率。然后,我们初始化了权重和偏置。接下来,使用反步法算法进行训练,其中包括前向传播和反向传播两个步骤。在前向传播中,我们计算了神经网络的输出。在反向传播中,我们计算了损失函数对各个参数的梯度,并使用梯度下降法来更新参数。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

大强强小强强

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值