ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

反步法详解:递推李雅普诺夫设计与工程应用

反步法详解:递推李雅普诺夫设计与工程应用 做控制的人迟早会遇到一类“级联非线性系统”——状态方程里控制量 (u) 并不能直接作用到你想稳定的那个状态上中间隔着好几层积分和函数。比如一个机械臂的关节位置你只能控制电机力矩力矩影响角加速度角加速度积分成角速度角速度再积分成位置。反步法Backstepping就是专门对付这种“控制量够不着目标状态”问题的设计工具。我第一次接触反步法是在研究生做飞行器姿态控制的时候当时看教材里一堆递推公式觉得这东西玄乎。自己动手推了一遍二阶系统才发现它的核心思想特别朴素把高阶系统当成一连串“积分器”串起来每一步只设计一个虚拟控制量像爬楼梯一样一级一级往回推最后推到真实的控制输入。这篇文章我用最直白的语言、完整的推导和实际案例把反步法的设计思路、稳定性原理和工程坑位一次讲清楚适合刚学非线性控制的学生也适合想在实际项目里用反步法却总是调不通的工程师。1. 反步法到底解决什么问题从“控制量鞭长莫及”说起1.1 为什么反馈线性化不是万能钥匙先说说很多人的第一反应非线性系统不是可以反馈线性化吗把非线性项消掉然后按线性系统设计不就行了理论上确实如此但实际用起来有两个硬伤。第一个硬伤是要求系统满足相对阶条件即输出对控制输入求导若干次后控制量必须显式出现。很多物理系统是“欠驱动”的比如倒立摆、四旋翼的水平位置、自主水下航行器的横滚角控制输入往往作用在一个中间变量上导致相对阶不完整。第二个硬伤是要求非线性项的光滑性并且我们必须精确知道模型。反馈线性化本质上是“以精确模型换取线性结构”模型稍有偏差消不干净的非线性项会直接变成扰动。我曾经在一个气动实验平台上试过摩擦项辨识误差超过10%反馈线性化后的闭环系统就出现极限环振荡最后还是靠鲁棒控制兜底。反步法走的是另一条路不强求把系统变成线性而是沿着状态方程的级联结构一层层构造李雅普诺夫函数。好处是设计过程非常直观每一步都有明确的“虚拟控制目标”而且很容易结合自适应、滑模、扰动观测器等工具去处理不确定性。1.2 反步法最核心的直觉把高阶系统拆成一串积分链你看“Backstepping”这个英文词Back是“向后”Stepping是“一步步走”连起来就是“向后一步步走”。为什么是向后因为设计过程是从最靠近输出的那个状态开始的然后往控制输入端方向“倒退”。考虑一个最简单的严格反馈系统[ \dot{x}_1 x_2 f_1(x_1) ] [ \dot{x}_2 u f_2(x_1, x_2) ]这里的状态 (x_1) 是我们想控制的量(u) 是真实输入。你看 (u) 必须先经过第二个微分方程影响 (\dot{x}_2)再经过第一个微分方程影响 (\dot{x}_1)。控制输入对 (x_1) 来说是“间接的”“隔了一层的”。反步法的直觉是这样的如果我能把 (x_2) 当成一个“虚拟的控制量”那么我就可以先设计出 (x_2) 应该等于什么才能让 (x_1) 稳定然后我再设计 (u)让真实的 (x_2) 去逼近期望的 (x_2)。每一层都在干同一件事让当前状态跟踪一个“理想的轨迹”而这个理想轨迹是上一层给的。随着系统阶数增加这种“递推”自然展开每增加一个积分器就多设计一层整个过程像在爬楼梯。这也是为什么反步法特别适合高阶系统——它把“一个复杂的高阶镇定问题”拆解成“一串简单的一阶镇定问题”。1.3 严格反馈系统的定义长什么样反步法的适用对象是“严格反馈系统”Strict-Feedback Form它的标准形式如下[ \dot{x}1 f_1(x_1) g_1(x_1) x_2 ] [ \dot{x}2 f_2(x_1, x_2) g_2(x_1, x_2) x_3 ] [ \vdots ] [ \dot{x}{n-1} f{n-1}(x_1, \dots, x_{n-1}) g_{n-1}(x_1, \dots, x_{n-1}) x_n ] [ \dot{x}_n f_n(x_1, \dots, x_n) g_n(x_1, \dots, x_n) u ]关键特征是第 (i) 个方程只包含前 (i) 个状态并且下一个状态 (x_{i1}) 以仿射形式出现。这种“三角结构”是反步法天然能处理的对象。如果系统不是严格反馈形式比如出现 (\dot{x}_1 x_2^2) 这种与高阶状态复杂耦合的情况就需要先做变换把它化成标准型或者改用其他方法。注意严格反馈系统中的 (g_i(\cdot)) 一般要求有界且远离零。工程上常见的是 (g_i) 恒为正比如机械系统中的惯性矩阵、电机模型中的控制增益。如果 (g_i) 会过零系统会失去可控性这也是设计前必须检查的条件。2. 反步法基本设计套路以二阶系统为例走一遍全流程2.1 第一步把虚拟控制量当作“中间目标”现在我用一个最简单的二阶严格反馈系统演示完整过程[ \dot{x}_1 x_1^2 x_2 ] [ \dot{x}_2 u ]目标是让 (x_1) 收敛到0。这个系统里的非线性项 (x_1^2) 是开环不稳定的——当 (x_1) 为正时它只会越来越快地增长。控制量 (u) 直接控制的是 (x_2) 的导数而 (x_2) 又通过 (\dot{x}_1) 影响 (x_1)。所以问题的关键变成怎么选 (x_2) 的轨迹才能让 (x_1) 稳定。我们定义第一个误差变量[ z_1 x_1 ]这里直接让 (x_1) 本身作为误差因为它就是要收敛到0的量。对 (z_1) 求导[ \dot{z}_1 \dot{x}_1 x_1^2 x_2 ]此时可以把 (x_2) 看作虚拟控制量但我们不能直接指定 (x_2)只能设计它的期望值记作 (\alpha_1)通常叫虚拟控制律或镇定函数。选择[ \alpha_1 -c_1 z_1 - z_1^2 ]其中 (c_1 0)这个形式是故意的——先用线性项 (-c_1 z_1) 提供阻尼再用 (-z_1^2) 抵消掉系统里原本的 (x_1^2) 项。如果把 (x_2) 强行设置为 (\alpha_1)那么[ \dot{z}_1 z_1^2 \alpha_1 z_1^2 - c_1 z_1 - z_1^2 -c_1 z_1 ]误差就能指数衰减。但问题是(x_2) 是一个状态变量不是我们能直接控制的它有自己的动态。于是我们进入第二步定义第二个误差变量来描述“真实 (x_2) 与理想 (x_2) 之间的差距”。2.2 第二步引入误差变量与李雅普诺夫函数定义第二个误差变量[ z_2 x_2 - \alpha_1 ](z_2) 表示实际状态与虚拟控制量的偏差。如果能把这个偏差也压到0那么虚拟控制量就真正起作用了。对 (z_2) 求导[ \dot{z}_2 \dot{x}_2 - \dot{\alpha}_1 u - \dot{\alpha}_1 ]注意这里的 (\dot{\alpha}_1) 是对时间的全导数[ \dot{\alpha}_1 \frac{\partial \alpha_1}{\partial x_1} \dot{x}_1 (-c_1 - 2z_1)(x_1^2 x_2) ]也就是说虚拟控制量本身还在随时间变化真实输入 (u) 必须补偿掉这种“虚拟控制量自己也在动”的动态。然后用误差变量重写原系统[ \dot{z}_1 z_1^2 (z_2 \alpha_1) -c_1 z_1 z_2 ] [ \dot{z}_2 u - \dot{\alpha}_1 ]现在构造李雅普诺夫函数。第一层我们本来可以用 (V_1 \frac{1}{2} z_1^2)但为了分析加入 (z_2) 后的整体稳定性取[ V_2 \frac{1}{2} z_1^2 \frac{1}{2} z_2^2 ]对时间求导[ \dot{V}_2 z_1 \dot{z}_1 z_2 \dot{z}_2 z_1(-c_1 z_1 z_2) z_2(u - \dot{\alpha}_1) -c_1 z_1^2 z_1 z_2 z_2(u - \dot{\alpha}_1) ]注意到交叉项 (z_1 z_2)这就是要由真实控制 (u) 来“收拾”的部分。2.3 第三步反推回来写出真实控制律为了让 (\dot{V}_2) 成为负定函数我们选择[ u \dot{\alpha}_1 - z_1 - c_2 z_2 ]其中 (c_2 0)。代入上式[ \dot{V}_2 -c_1 z_1^2 z_1 z_2 z_2(-z_1 - c_2 z_2) -c_1 z_1^2 - c_2 z_2^2 ]这样就得到了一个严格负定的 (\dot{V}_2)。根据李雅普诺夫稳定性定理(z_1) 和 (z_2) 都会收敛到0从而 (x_1) 收敛到0(x_2) 收敛到 (\alpha_1)。这个设计过程的精华在于第一步设计的 (\alpha_1) 只保证 (z_1) 子系统的稳定但会留下一个新误差 (z_2)第二步用 (u) 来消除 (z_2)并且通过“(-z_1)”这一项处理掉交叉耦合项保证整个级联系统的稳定。这个过程可以一直延续到第 (n) 阶这就是为什么叫“反步”——每一层都在做一个“逆向递推”。2.4 一个完整的二阶数值算例我把上面的控制器用Python仿真一下。系统方程和控制律都按照上面推导来参数取 (c_1 2, c_2 3)初始状态 (x_1(0) 1.5, x_2(0) 0)。import numpy as np import matplotlib.pyplot as plt def alpha1(z1): # 虚拟控制律alpha1 -c1*z1 - z1^2 return -2.0 * z1 - z1**2 def dalpha1_dt(z1, x2): # d(alpha1)/dt (-c1 - 2*z1) * (x1^2 x2) # z1 x1 return (-2.0 - 2.0 * z1) * (z1**2 x2) def system(x, u): x1, x2 x return np.array([x1**2 x2, u]) # 仿真参数 dt 0.001 t_end 10.0 steps int(t_end / dt) x np.array([1.5, 0.0]) log np.zeros((steps 1, 3)) # t, x1, x2 log[0] [0.0, x[0], x[1]] c2 3.0 for i in range(steps): z1 x[0] z2 x[1] - alpha1(z1) u dalpha1_dt(z1, x[1]) - z1 - c2 * z2 x x dt * system(x, u) log[i1] [(i1) * dt, x[0], x[1]] # 绘图 plt.figure() plt.plot(log[:,0], log[:,1], labelx1) plt.plot(log[:,0], log[:,2], labelx2) plt.grid(True); plt.legend() plt.show()运行结果中(x_1) 在大概3秒内收敛到0没有超调(x_2) 先是迅速下降去追踪虚拟控制量然后跟随 (\alpha_1) 回到0。这个例子说明反步法设计并不需要复杂的数学技巧关键是抓住“级联结构”和“递推李雅普诺夫函数”两条主线。但真正到了高阶系统事情开始变得微妙下面来说最容易出问题的部分。3. 为什么反步法能保证稳定性李雅普诺夫递推的底层逻辑3.1 每一层都在构造“正定函数 负定导数”反步法让人困惑的地方经常是每次都在定义新的误差变量这个 (z) 和那个 (z) 到底有什么关系为什么这样叠起来就稳定其实每一层都是同一个套路。从第一层开始我们选一个状态作为误差构造局部李雅普诺夫函数 (V_i \sum_{j1}^{i} \frac{1}{2} z_j^2)设计虚拟控制量时使 (\dot{V}_i) 中包含负定项同时接受下一层的误差带来的耦合项。到了下一层再通过新控制量把耦合项抵消掉。这种递推保证了最终的李雅普诺夫函数是“全局正定”的导数“全局负定”因此闭环系统在原点渐近稳定。用一句话概括反步法是一台“李雅普诺夫函数生成器”每走一步就生成一个更大的能量函数而每一步的虚拟控制律都像是给系统增加一个阻尼项。这也是为什么用反步法设计的控制器天然自带稳定性证明不需要在设计完之后再费劲找李雅普诺夫函数。3.2 匹配条件与不确定性为什么叫“反步”“反步”还有一个更深的含义——它处理不确定性的方式也是“反着来的”。假设系统中带未知参数 (\theta)[ \dot{x}_1 x_1^2 \theta x_2 ] [ \dot{x}_2 u ]传统方法是先估计 (\theta)再设计控制器这叫“确定性等价”。反步法则可以把参数估计器直接嵌入到设计过程中。我们把 (\theta) 的估计值 (\hat{\theta}) 当作一个额外的动态变量定义参数估计误差 (\tilde{\theta} \theta - \hat{\theta})然后扩展李雅普诺夫函数把 (\hat{\theta}) 的更新律设计成保证 (\dot{V}) 负定的形式。这样参数自适应和控制器设计一气呵成不用分开做。这就是自适应反步法的基本思想。而“反步”对应的是另一种思路从后往前设计让不确定性“逐步暴露”在每一步的虚拟控制中每一步只处理局部不确定性不会出现“一次要处理全局非线性”的问题。3.3 与动态面控制的区别和联系反步法有个众所周知的“麻烦”——对虚拟控制量求导。随着阶数增加代数复杂度爆炸式增长。工程界的对策是“动态面控制”Dynamic Surface Control基本思路是让虚拟控制量通过一个低通滤波器用滤波后的信号代替虚拟控制量本身从而避免解析求导。这样做会牺牲一点精度但换来的是设计复杂度大幅降低。我在实际项目中用过动态面控制发现它对高频噪声更鲁棒因为虚拟控制量的导数不再直接放大噪声。对于四阶以上的系统我一般不会用纯反步法而是结合动态面或命令滤波反步法。命令滤波反步法还能额外补偿滤波误差理论性质更好。下表是我在选型时的参考设计方法适用阶数计算复杂度对噪声的敏感度稳定性证明标准反步法2~3中高严谨动态面控制3~6低中有界稳定命令滤波反步3~6中中严谨如果你的系统只有二阶三阶标准反步法完全够用如果系统阶数高、模型复杂建议用动态面或命令滤波。4. 实际工程中反步法设计的坑与经验4.1 虚拟控制量求导爆炸问题很多初学者推导三阶系统时就开始怀疑人生。以三阶系统为例第二个虚拟控制量需要对 (x_1, x_2) 求偏导每一项都包含之前的状态展开后能有几十项。公式推导容易错代码里如果直接复制公式也容易错。我的经验是不要手算 (\dot{\alpha})。在仿真和实时控制里可以用数值微分近似或者用“解析求导 符号计算工具”辅助验证。MATLAB的Symbolic Toolbox、Python的SymPy都很好用。我习惯先用符号工具生成 (\dot{\alpha}) 的完整表达式再转成C代码或Python函数。如果控制器运行在嵌入式环境里追求实时性我会用“一阶低通滤波”替代解析求导但一定要记得对滤波误差做补偿否则会有稳态误差。命令滤波反步法的补偿机制值得学习。4.2 参数选取与控制器增益怎么调反步法的控制器参数只有 (c_i)看起来简单但实际调参有几个门道。第一(c_i) 不能太大。虽然理论上 (c_i) 越大收敛越快但实际系统中状态测量有噪声、执行器有延迟过大增益会导致控制量高频抖动。在我的经验里(c_i) 按比例递增比较合理比如 (c_1) 小一些、(c_2) 大一些这样既保证第一层响应够快又不会让第二层控制量过于激进。第二注意虚拟控制量 (\alpha_i) 的幅值。反步法在设计过程中没有显式限制控制量幅值如果 (\alpha_1) 过大会导致 (x_2) 需要跟踪一个过大的目标真实控制 (u) 也会很大很容易触发执行器饱和。第三初始误差的处理。(z_1 x_1 - x_{1d})如果给定轨迹突变初始误差很大虚拟控制量会瞬间给一个很大的值系统容易出现超调。我一般会给参考轨迹加一个过渡过程比如用二阶滤波器平滑指令。下面是我常用的调参步骤先只保留线性阻尼项把非线性抵消项全部去掉仿真看系统是否稳定逐步增大 (c_1)使第一层响应满足要求再增大 (c_2)观察控制量的形态不要让它出现高频抖振加入非线性抵消项重新仿真重点看控制量峰值是否有异常加入扰动和测量噪声验证鲁棒性必要时降低增益或加滤波器。4.3 执行器饱和、未建模动态怎么办反步法基于精确模型和理想执行器假设。工程中最常见的两个“杀手”执行器饱和和未建模动态。执行器饱和会造成“积分饱和”类似的问题虚拟控制量设计得再好真实输入达不到误差就会积累。我的处理办法是把执行器饱和特性纳入设计采用“抗饱和反步法”或者简单地在控制器输出端加限幅同时把限幅造成的误差当作扰动处理。如果系统对稳态精度要求高可以结合扰动观测器补偿。未建模动态就更危险。反步法强大的地方在于它能把很多常见的不确定性演变成“匹配扰动”或“非匹配扰动”。匹配扰动是指扰动与 (u) 在同一通道这个直接用高增益或滑模就能压制非匹配扰动分布在不同的积分器之间就需要扩展状态观测器或者用自适应反步法逐层估计。我的项目经验是给反步法控制器配一个扩张状态观测器ESO非常实用。ESO把总扰动估计出来然后一路前馈补偿这样反步法只需要处理名义模型部分鲁棒性提升一个档次。4.4 我从仿真到实车实验的一些体会反步法在仿真里性能很漂亮但上实车前要过几道坎。第一道坎是状态可测性。虚拟控制量里经常需要用到的某些状态导数比如角加速度、电感电流变化率物理上很难直接测量。解决办法是用状态观测器或数值差分。但差分会放大噪声我建议用高阶滑模观测器或卡尔曼滤波器效果会好很多。第二道坎是离散化。反步法控制律是连续的在嵌入式里用固定步长离散化后必须保证采样频率足够高。特别是包含非线性抵消项的系统如果采样频率低于10倍闭环带宽很容易出现极限环。经验法则是仿真步长至少比控制周期小一个数量级实机采样频率尽量在1kHz以上如果做不到就需要把控制律做滤波。第三道坎是模型失配的方向。反步法对模型参数误差有一定的鲁棒性但前提是误差方向没有破坏控制增益的正定性。比如机械臂的惯性矩阵估计偏大控制增益估算偏高会导致实际控制量偏弱系统响应变慢估计偏小则可能引起振荡。第四道坎是调试的效率。反步法带自适应参数时调试参数会更多我建议先用固定参数跑通再逐步开启自适应。如果自适应增益调得太大参数估计会像疯了一样来回跳这时候先把自适应增益调小看看跟踪误差是否有改善。我有一个印象深刻的教训当年在一台伺服电机试验台上用反步法做位置控制仿真时 (c_110, c_220) 效果很好上机后电机啸叫、电流剧烈波动。后来发现编码器差分出来的速度噪声被虚拟控制量求导放大了我在控制器前加了低通滤波又把 (c_1) 降到3问题就消失了。所以记住反步法公式里的每一项都有实际物理意义噪声通道和参数增益是一对矛盾仿真里完美的参数在实机上往往要打个五折。5. 高阶反步法的一个具体推导三阶严格反馈系统5.1 三阶系统的递推结构与误差变量设计为了把反步法从二阶推广到三阶我写下标准三阶严格反馈系统[ \dot{x}_1 f_1(x_1) g_1(x_1) x_2 ] [ \dot{x}_2 f_2(x_1, x_2) g_2(x_1, x_2) x_3 ] [ \dot{x}_3 f_3(x_1, x_2, x_3) g_3(x_1, x_2, x_3) u ]为了方便说明设所有 (g_i 1)非线性项大杂烩。第一步照旧[ z_1 x_1, \quad \alpha_1 -c_1 z_1 - f_1(x_1) ]这样 (\dot{z}_1 -c_1 z_1 z_2)其中 (z_2 x_2 - \alpha_1)。第二步对 (z_2) 求导[ \dot{z}_2 \dot{x}_2 - \dot{\alpha}_1 f_2 x_3 - \dot{\alpha}_1 ]设计虚拟控制量 (\alpha_2)使得当 (x_3 \alpha_2) 时(\dot{z}_2) 等于 (-z_1 - c_2 z_2)。所以[ \alpha_2 -z_1 - c_2 z_2 - f_2 \dot{\alpha}_1 ]注意这里出现了两个“非本轮”的项(-z_1) 是为了抵消上一层李雅普诺夫函数交叉项(\dot{\alpha}_1) 是为了补偿虚拟控制量随时间的变化。第三步定义 (z_3 x_3 - \alpha_2)对 (z_3) 求导[ \dot{z}_3 f_3 u - \dot{\alpha}_2 ]最后真实控制律为[ u -z_2 - c_3 z_3 - f_3 \dot{\alpha}_2 ]这里 (c_3 0)。最终李雅普诺夫函数的导数为[ \dot{V}_3 -c_1 z_1^2 - c_2 z_2^2 - c_3 z_3^2 ]可以看到三阶和一阶、二阶的“零件”完全相同只是多了一层递推。5.2 (\dot{\alpha}_2) 的复杂性与计算技巧[\dot{\alpha}_2 - \dot{z}_1 - c_2 \dot{z}_2 - \frac{\partial f_2}{\partial x_1} \dot{x}_1 - \frac{\partial f_2}{\partial x_2} \dot{x}_2 \ddot{\alpha}_1]这个式子展开后会有大量项。为了减少错误我自己总结了一套“变量代换法”不要直接展开所有导数的偏导而是在推导过程中保留中间变量例如先用符号 (\dot{\alpha}_1) 表示已知量最后再递归展开。在代码里更推荐用自动微分工具省时省力。5.3 三阶反步法在机电系统中的应用场景三阶严格反馈系统最常见的物理对象是带柔性关节的机械臂位置、速度、电机转速、永磁同步电机的电流-速度-位置链路、双积分器加一个驱动动态的无人机高度模型。这些系统都可以列成上面那种三角形式。比如永磁同步电机的调速系统状态变量是位置、速度和电流。反步法可以一层层设计出期望的电流轨迹然后把电压控制量设计出来。相比于传统的“电流环速度环位置环”串级PID反步法的优势是每一步都考虑了非线性项和交叉耦合项调试好之后性能上限更高。但付出的代价是模型依赖更强参数变化时鲁棒性需要额外保障。6. 反步法的变种与选型建议6.1 自适应反步法、鲁棒反步法与模糊/神经网络反步法反步法真正强大的是它能够和其他控制理论自由组合形成各种变体。自适应反步法是把参数估计律嵌入李雅普诺夫递推中适合系统里存在缓变未知参数的情况比如飞行器的气动系数、机械臂的负载惯量。设计时把未知参数写成 (\theta)在每一步的李雅普诺夫函数中加入参数估计误差的二次型项就可以同时得到控制律和参数自适应律。鲁棒反步法主要结合 (H_\infty) 或滑模思想来处理有界扰动。比如滑模反步法就是每一层的虚拟控制量采用滑模结构让误差状态快速到达滑模面对匹配扰动有很强的抑制能力。代价是控制量存在抖振需要加边界层或高阶滑模来缓解。模糊和神经网络反步法则是用万能逼近器在线逼近未知非线性函数 (f_i)。这种方法的优点是几乎不需要模型知识缺点是可调参数太多、稳定性分析复杂我一般只在模型严重未知的项目中才用。6.2 怎么给自己的系统选设计路径做反步法设计前先列一个检查表系统能否写成严格反馈形式如果不能哪些状态可以变换非线性项是否光滑是否存在符号不确定的控制增益扰动是匹配的还是非匹配的能否建模成有界函数执行器是否有饱和约束需要特殊处理吗你追求的是渐近稳定、指数稳定还是最终一致有界如果系统阶数≤3、模型基本已知、扰动不大直接用标准反步法如果模型里有明显未知参数加自适应如果扰动大且不确定加扰动观测器或滑模鲁棒项如果阶数很高、解析求导困难果断转动态面控制或命令滤波反步法。6.3 一点关于“理解”的建议很多人学反步法时容易陷入公式推导忘记它本质上只是“递归地构造李雅普诺夫函数”这一件事。我自己经历过从“背公式”到“随手设计”的转变关键不是多做几遍推导而是亲手把二阶、三阶系统的控制律代入仿真观察误差变量 (z_i) 的变化过程。你会发现每一层的 (z_i) 都是在上一层的“引导”下收敛的虚拟控制量 ( \alpha_i) 就像是给误差系统规划了一条可行路径。一旦有了这种“可视化直觉”再复杂的反步法论文也能迅速抓住主线。我在给新入职工程师培训时经常用一个类比反步法就像操盘手培养新人先把难任务分解成一步步的小目标新人每完成一步操盘手就把小目标再往前推一步直到最终任务完成。每一层都在处理“当前能控制的部分”同时为下一层准备好接口。理解了这个思想反步法就不再是一堆吓人的偏微分方程而是一种“模块化”的控制设计艺术。
返回列表