
每次到笔试季“控制算法”相关岗位的讨论热度都会明显上升。很多人准备这类笔试时有个共同的困惑公式背了一堆PID、LQR、状态观测器都看过但拿到题目还是不知道怎么下手。更难受的是有些题看起来像数学题有些像编程题有些又像硬件题完全找不到统一的复习主线。如果你正在准备大疆这类无人机、机器人公司的控制算法岗位这篇文章想先给你一个判断控制算法笔试真正筛选的不是“你会不会背公式”而是三件事——物理直觉、工程取舍、数学功底。会背PID公式的人很多但能在给定场景里说清楚“为什么用P就能消除稳态误差为什么D加太大系统会抖”的人才是这类岗位想要的人。这篇文章会从岗位笔试的筛选逻辑出发把控制算法笔试涉及的知识版图拆开经典控制、现代控制、电机控制、机械臂控制、路径跟踪、代码仿真然后结合典型题型、可运行的仿真示例和复习路线帮你建立一条清晰的备考主线。文中的题目不是某家公司的原题而是把同类岗位笔试中反复出现的能力点提炼出来方向对了复习才不会跑偏。1. 控制算法笔试到底在筛什么人1.1 笔试环节的设计逻辑企业招控制算法工程师笔试通常放在简历筛选之后、面试之前。它要完成的不是“考倒你”而是用有限的时间快速判断这个人的控制理论底子够不够扎实能不能直接进入业务面试去讨论具体项目。和刷 LeetCode 不同控制算法笔试很少只考纯数学题。题目通常会包装在一个物理系统里比如一个电机、一个倒立摆、一辆小车、一个机械臂。表面上看是让你求传递函数、判断稳定性、设计控制器实际上是在模拟“给你一个被控对象你能不能把它控制住”这件事。这里的关键是笔试题目往往会刻意去掉一些工程细节保留一个相对理想化的模型。你需要做的就是从题目描述中提取出系统方程选择合适的分析方法然后给出控制方案。这个过程非常像真实工作中的第一步——拿到一个被控对象先建模再设计。1.2 三类核心能力结合这类岗位的笔试特点我认为核心能力可以归纳为三类第一物理直觉。看到“质量-弹簧-阻尼系统”要能快速写出运动方程看到“直流电机”要能想到电压方程和力矩方程的耦合关系。物理直觉决定了你能不能把一个文字描述的场景翻译成数学模型。第二数学功底。传递函数、状态空间、拉普拉斯变换、线性代数、微分方程稳定性分析这些是控制算法的通用语言。数学功底不够即使物理模型建出来了后续分析也走不下去。笔试中最容易拉开差距的往往是数学推导的严谨性和速度。第三工程取舍。一个系统用 PID 还是 LQR用状态反馈还是输出反馈用连续域设计还是直接离散化不同方案的实现成本、调试难度、抗扰动能力都不同。笔试不会直接问你“选哪个”但会在题目里埋下信号这个系统有噪声、有延迟、有不确定性你怎么处理。1.3 什么样的人会被误判淘汰有些候选人理论书看了很多但一遇到“给一个实际系统请你设计控制器”这种题就发懵。原因通常不是能力不够而是复习方式出了问题把大量时间花在证明定理、推数学细节上却很少动手建模仿真。反过来另一类候选人很会用 MATLAB 工具箱pidtune、lqr、c2d用得很熟练但笔试手推题一多就露馅。企业笔试通常不让你打开 MATLAB顶多允许你用 Python 写个小脚本。这意味着你必须在纸面上完成关键推导比如把二阶系统化成标准形式、写出特征方程、判断稳定性条件。所以真正需要的能力是“理论推导 工程直觉 工具验证”的三角配合。缺了任何一角笔试都可能出现“平时都会考场全忘”的情况。2. 控制算法笔试的知识版图从 PID 到 LQR、ADRC、MPC控制算法这个方向名字听起来很宽泛但笔试知识版图其实有比较清晰的层次。我习惯把控制算法分为三层经典控制、现代控制、工程专题控制。经典控制以传递函数和频域分析为核心对应单输入单输出系统。典型内容是稳定性判据、稳态误差、根轨迹、Bode 图、PID 控制器设计。它解决的问题是“这个系统稳不稳、响应快不快、误差大不大”。现代控制以状态空间为核心对应多输入多输出系统。典型内容是状态方程建模、能控能观性、极点配置、状态观测器、LQR 最优控制。它解决的是“能不能把系统内部状态也管起来”适合无人机、机械臂这类强耦合、多变量的系统。工程专题控制则是结合实际被控对象延伸出来的内容包括电机控制算法FOC、SVPWM、机械臂控制算法逆运动学、力矩控制、阻抗控制、无人车路径跟踪Stanley、LQR、MPC。这些内容不一定在每场笔试中都是主菜但如果你投的是机器人、无人驾驶相关方向出现的概率非常高。算法数学基础典型用途笔试难度PID 控制微分方程、拉普拉斯变换电机转速、温度、简单飞行控制低到中LQR 控制线性代数、Riccati 方程无人机姿态、倒立摆、路径跟踪中预测控制MPC优化理论、约束求解轨迹跟踪、带约束系统高ADRC 控制状态观测器、扰动估计强扰动、非线性系统中高Stanley 控制几何关系、车辆运动学无人车路径跟踪低到中模糊 PID模糊逻辑、规则表非线性、难建模对象中神经网络控制机器学习、逼近理论复杂非线性系统建模控制高多为概念题从表格里可以看出来越接近“能直接用于工程”的算法笔试越可能以“概念 定性分析”为主越接近“数学基础扎实”的算法笔试越可能要求手推或计算。所以复习的时候不要平均用力先看清楚目标岗位偏向哪种业务。3. 高频题型一系统建模与数学基础3.1 机理建模从物理场景到数学方程控制算法笔试的第一大类高频题是给一个物理系统要求建立数学模型。这类题几乎必考因为建不出来模型后面的一切分析都无从谈起。常见的几类模型机械平移系统比如质量-弹簧-阻尼系统根据牛顿第二定律有m * d²x/dt² b * dx/dt k * x F这是一个标准的二阶系统可以写成传递函数形式X(s) / F(s) 1 / (m*s² b*s k)对应的无阻尼自然频率和阻尼比分别是ωn sqrt(k / m) ξ b / (2 * sqrt(m * k))这两个参数在后续时域分析中反复出现。笔试经常让你直接写出它们或者根据超调量和调节时间反推参数。电机系统直流电机的电枢回路方程和力矩平衡方程耦合在一起会得到一阶或二阶模型。这里要特别注意“电机的时间常数”和“反电动势系数、力矩系数”之间的关系。有些题会故意省略机械阻尼让模型简化成更容易分析的形式。倒立摆系统小车倒立摆几乎是控制笔试的“亲儿子”。一阶线性化后系统的状态矩阵会同时出现正实部特征值也就是开环不稳定这是考察稳定性和控制器设计的好素材。笔试中常见做法是让写出线性化后的状态方程然后判断系统是否稳定再设计状态反馈控制器。3.2 状态空间与传递函数的转换建模题型里还有一类是给状态方程要求转成传递函数或者反过来。单输入单输出系统的转换公式是G(s) C * (sI - A)^(-1) * B D笔试不会要求你把大系统手算到底但 2 阶系统必须熟练。另外还经常考从传递函数写出能控标准型或能观标准型。这一步考的是你对状态空间表达是否真正理解而不只是会套公式。从笔试试卷的判分角度“建模型”和“写状态方程”往往只占前几步真正的分值在后面让你用这个模型去做稳定性分析或者控制器设计。所以建模这步一定要快、要准写错了后面全错。3.3 典型计算要求数学基础部分还会涉及拉普拉斯变换常用表、微分方程求解、特征根与稳定性关系。比如一阶系统的时间常数和阶跃响应关系二阶系统的超调量公式σ% exp(-ξ*π / sqrt(1-ξ²)) * 100%以及调节时间近似公式2% 误差带ts ≈ 4 / (ξ * ωn)这些公式不需要证明但必须能快速写出来。建议把常用公式整理成一页纸笔试前反复默写直到形成肌肉记忆。4. 高频题型二时域分析与频域分析4.1 稳定性判别稳定性是控制算法笔试的核心考点没有之一。给定一个闭环传递函数或状态矩阵第一反应就是判断系统是否稳定。时域里最直接的方法是看极点对于连续系统闭环极点全部位于 s 平面左半平面系统稳定如果存在虚轴上的极点则系统临界稳定。对于离散系统所有极点必须位于 z 平面单位圆内。这个判定逻辑几乎每年都会出现。劳斯判据也是高频考点。给定特征方程a_n * s^n a_{n-1} * s^(n-1) ... a_0 0列出劳斯表看第一列符号变化次数。笔试中常见的是三阶或四阶系统只要细心列表示范即可不需要高深技巧。但要特别注意特征方程缺项时系统可能不稳定这是很多人的易错点。现代控制里还会用李雅普诺夫方法判断稳定性。如果状态矩阵 A 的所有特征值实部为负系统渐进稳定也可以用求解李雅普诺夫方程A^T P P A -Q的方式判断。这类题通常与 LQR 设计结合出现。4.2 稳态误差稳态误差题目的关键在于理解“系统类型”和“输入类型”的对应关系。对于单位反馈系统开环传递函数可以写成G(s)H(s) K * ∏(sz_i) / (s^N * ∏(sp_j))其中 N 是系统包含的积分环节个数。N0 叫 0 型系统N1 叫 I 型系统N2 叫 II 型系统。稳态误差与输入的关系系统类型阶跃输入斜坡输入抛物线输入0 型1/(1Kp)有限值无穷大无穷大I 型01/Kv有限值无穷大II 型001/Ka有限值这里的 Kp、Kv、Ka 分别是位置误差系数、速度误差系数和加速度误差系数。笔试中特别喜欢考“为什么加了积分环节阶跃稳态误差就变成 0”这背后的物理直觉是积分项会不断累积误差直到误差被完全消除然后积分值保持不变。能解释清楚这一点比背公式更重要。4.3 频域指标频域分析在笔试中出现的形式通常包括根据开环 Bode 图判断闭环稳定性幅值裕度、相位裕度、计算穿越频率、分析带宽对响应速度的影响。比较常见的描述是相位裕度 PM 越大系统相对越稳定但响应速度可能变慢穿越频率 ωc 越高系统带宽越大响应越快但对噪声越敏感。笔试中会问你“增大 Kp 对相位裕度有什么影响”“为什么说频域分析和时域分析是互补的”这类问题。频域分析的核心价值在于很多系统没法写出精确的传递函数但可以通过扫频实验得到 Bode 图然后直接在频域上进行控制器设计。这种“工程化”的思维方式在笔试大题里经常作为加分项出现。5. 高频题型三控制器设计5.1 PID 控制算法从参数整定到工程陷阱PID 是控制算法笔试中的“基础题”几乎必考。但基础不代表简单笔试中关于 PID 的题目往往集中在以下几个角度第一给定被控对象要求设计 PID 参数或者分析参数对系统性能的影响。比如一阶惯性系统G(s) 1/(s1)问只用 P 控制时Kp 增大对稳态误差、响应速度和超调量有什么影响。这类题需要你从闭环传递函数出发而不是凭感觉答题。第二PID 离散化实现。笔试会给出采样周期和离散化方式要求写差分方程。这里要区分位置式 PID 和增量式 PID后者在电机控制、执行器限幅场景中更常用。第三工程陷阱题。例如微分项为什么不能太大因为微分对噪声敏感噪声会通过差分放大导致控制量剧烈抖动。为什么实际工程里很少直接用纯微分项因为理想的微分不可实现通常要加一阶低通滤波。这些问题看起来简单但恰恰是区分“背过书”和“真正用过”的试金石。5.2 LQR 控制算法状态反馈的最优设计LQR 是状态空间方法中最常考的控制器设计手段。题目通常给一个状态方程要求设计状态反馈增益矩阵使性能指标J ∫ (x^T Q x u^T R u) dt最小化。LQR 的求解步骤如下写出系统的状态方程dx/dt Ax Bu。选择合适的权重矩阵 Q 和 R。求解代数 Riccati 方程A^T P P A - P B R^(-1) B^T P Q 0。计算反馈增益K R^(-1) B^T P。得到控制律u -K x。在 Python 中可以直接用 SciPy 求解连续时间 Riccati 方程import numpy as np from scipy.linalg import solve_continuous_are # 质量-弹簧-阻尼系统 m 1.0 b 0.5 k 2.0 A np.array([[0, 1], [-k / m, -b / m]]) B np.array([[0], [1 / m]]) # 权重矩阵状态偏差更重视位置控制量代价适中 Q np.diag([10.0, 1.0]) R np.array([[0.1]]) # 求解 Riccati 方程 P solve_continuous_are(A, B, Q, R) # 计算状态反馈增益 K_lqr np.linalg.inv(R) B.T P print(LQR 增益 K , K_lqr)如果笔试环境允许用 MATLAB可以直接调用lqr(A, B, Q, R)但面试官通常更希望看到你理解背后的含义Q 越大说明你越在意状态偏差收敛得快R 越大说明你越在意控制量不要太大。实际应用中Q 和 R 的选取往往需要多轮仿真调参这也是工程和理论的差距所在。5.3 状态观测器设计笔试中还有一类典型题系统状态不可全测要求设计状态观测器。最经典的是全维观测器也称龙伯格观测器。设计思路和极点配置类似给定期望的观测器极点反推观测器增益 L。这里需要特别注意分离原理状态反馈和观测器可以分开设计观测器的引入不会改变闭环系统的极点只会在响应中附加观测器动态。这个结论经常作为简答题出现描述时要能说明“分离原理成立的前提是系统满足能观性”。实际工程里状态观测器是 ADRC 的核心组成部分。ADRC 把系统未建模动态和外扰统一视为“总扰动”用扩张状态观测器 ESO 估计出来再进行补偿。这类先进控制算法的笔试题目通常不会让你完整推导更可能考“ESO 的输入输出是什么”“为什么可以实时估计扰动”这类概念题。5.4 ADRC 与先进控制算法的定位ADRC、MPC、模糊 PID、神经网络控制算法这几类在笔试中的位置要分清。ADRC 适合强扰动、模型不确定系统笔试重点在扩张状态观测器的思想。MPC 适合带约束的多变量系统笔试重点在预测模型、滚动优化和反馈校正三个要素一般会问“MPC 相比 LQR 的优势是什么”答案核心是“能显式处理约束”。模糊 PID 适合非线性、难建模对象笔试通常考规则表设计。神经网络控制算法则更多是概念层面的考察比如“神经网络在控制中最常用的角色是什么”答案通常是“模型逼近器或控制器自学习模块”。6. 容易被忽视的工程题电机、机械臂与无人车6.1 电机控制算法如果你的目标岗位涉及无人机、机器人底盘或伺服系统电机控制算法几乎是必考模块。转速闭环常用 PID电流环常用 PI高性能场景下会用 FOC 加 SVPWM 的矢量控制框架。笔试常见问题包括直流电机传递函数怎么推导为什么电流环带宽要高于转速环为什么 FOC 要经过 Clarke 变换和 Park 变换最后这个问题可以从“把交流量变成直流量方便用 PI 控制器消除稳态误差”这个角度回答。这类题不需要你手推 FOC 全部公式但一定要理解坐标变换的动机和整个控制链路的数据流向。6.2 机械臂控制算法机械臂控制算法笔试容易出现两个维度的问题。运动学维度已知各关节角度求末端位姿这是正运动学已知末端位姿求关节角度这是逆运动学。后者通常更难笔试可能只考二连杆或平面机械臂的逆解推导或者考察雅可比矩阵的概念和奇异性。动力学与控制维度机械臂动力学模型是强耦合、非线性的笔试常考计算力矩法、PD 控制加重力补偿、阻抗控制等。如果题目出现“为什么机械臂直接用 PID 效果不好”可以从“耦合项和重力项随构型变化简单线性控制器难以全覆盖”来回答。6.3 路径跟踪Stanley、LQR 与 MPC如果你投无人车方向路径跟踪是高频考点。这里最常出现的是 Stanley 控制算法。Stanley 算法是一种基于车辆前轮位置的几何跟踪方法核心思想是用横向偏差和航向偏差共同决定前轮转角。近似公式可以表达为δ θ_e arctan(k * e / v)其中θ_e是航向偏差e是横向偏差v是车速k是增益。它的优点是公式简洁、参数少、在低速场景效果好缺点是高速或大曲率场景下需要结合动力学模型。LQR 也常用于路径跟踪尤其是横向控制。它把车辆-道路偏差模型写成状态方程再通过 LQR 设计前轮转角反馈。相比 StanleyLQR 能处理更复杂的动力学模型但对模型精度要求更高。MPC 则可以显式加入前轮转角约束和加速度约束是带约束轨迹跟踪的主流方案但计算量更大。7. 代码与仿真题的正确打开方式7.1 仿真题的常见格式控制算法笔试的代码题通常不会让你写一个完整的工程而是给一个被控对象模型让你写控制律并仿真若干步。常见格式有三种一是补全 PID 控制律。给出被控对象的差分方程或状态方程让你实现 PID 递推并回答“增大 Kp/Ki/Kd 分别有什么影响”。二是离散化对比。给一个连续传递函数要求用不同离散化方法写出差分方程并比较稳定性差异。三是状态反馈或观测器计算。给定 A、B、Q、R要求计算 LQR 增益或观测器增益。这三种格式都要求你能快速把控制理论转成可运行代码同时代码本身要干净可读。下面给出两个可以直接运行的最小示例。7.2 一个最小 PID 递推示例import numpy as np # 被控对象一阶惯性系统G(s) K / (T*s 1) # 使用隐式欧拉离散化 T 1.0 K 2.0 dt 0.01 def plant_step(y, u): return (T * y dt * K * u) / (T dt) # PID 参数 Kp 2.0 Ki 1.0 Kd 0.1 y 0.0 ref 1.0 integral 0.0 err_prev 0.0 N int(5.0 / dt) for i in range(N): err ref - y integral err * dt derivative (err - err_prev) / dt u Kp * err Ki * integral Kd * derivative y plant_step(y, u) err_prev err if i % 100 0: print(ft{i * dt:.2f}s y{y:.4f} u{u:.4f})这段代码模拟了 P 控制、PI 控制和 PID 控制的效果。你可以分别把 Kd 设为 0、0.1、1.0观察系统响应差异。如果 Kd 偏大你会看到控制量出现明显抖动这正是“微分项放大噪声”的直接体现。7.3 离散化对比示例连续域设计完控制器必须离散化后才能上单片机。笔试里最常讨论的是前向欧拉、后向欧拉和双线性变换Tustin。下面用一阶惯性环节对比前向欧拉和 Tustin 的离散结果# 一阶系统 G(s) K / (T*s 1) T 1.0 K 1.0 dt 0.1 # 前向欧拉y[k1] y[k] dt * (K*u[k] - y[k]) / T def forward_euler_step(y, u): return y dt * ((K * u - y) / T) # Tustin 变换s (2/dt) * (z-1)/(z1) def tustin_step(y_prev, u_cur, u_prev): a1 1 - 2 * T / dt b0 K a0 2 * T / dt 1 return (b0 * (u_cur u_prev) - a1 * y_prev) / a0 # 验证两组差分方程在阶跃输入下的稳态 y_fe 0.0 y_tu 0.0 u_prev 0.0 for k in range(50): u_cur 1.0 y_fe forward_euler_step(y_fe, u_cur) y_tu tustin_step(y_tu, u_cur, u_prev) u_prev u_cur print(f前向欧拉稳态值: {y_fe:.4f}) print(fTustin 稳态值: {y_tu:.4f})运行结果会发现在采样周期较大的时候前向欧拉可能不稳定或误差明显偏大而 Tustin 变换的稳定性更好。这是因为前向欧拉是一种显式方法稳定域受限Tustin 把 s 平面左半平面映射到 z 平面单位圆内稳定性保持得更好。笔试中如果问“采样周期变大应该用哪种离散化方式”答案通常要围绕稳定性展开。7.4 笔试中写代码要注意什么笔试题的判卷通常不是跑分而是看逻辑。代码要关注几点变量命名要清晰控制律更新顺序要正确积分项要不要限幅要说明微分项要不要滤波要说明。此外代码里最好加上注释解释每一行的物理含义这样即使结果不完美阅卷人也知道你每一步在想什么。仿真题不会只考“能跑”更看重你写完代码之后能不能解释现象。8. 常见误区与“送命题”自查清单控制算法笔试里有一些题目看起来简单但错误率极高。我把它们整理成自查清单问题现象可能原因排查方式解决方案系统阶跃响应超调大误以为 Kp 不够实际是系统阻尼不足观察响应曲线和相位裕度先加微分项或增大阻尼再调整 Kp加了积分项后系统开始震荡积分饱和或 Ki 过大观察控制量是否长期饱和加入积分限幅或抗积分饱和算法LQR 设计了半天效果不理想Q、R 权重与性能要求不匹配对比状态收敛速度和控制量峰值用带宽法或归一化方法重新选 Q、R仿真稳定但实物抖动严重微分项放大了高频噪声观察控制量高频分量微分前加低通滤波或用测速反馈代替纯微分离散化后系统失稳采样周期过大或用了不稳定的离散方法对比不同离散化方法减小采样周期或改用 Tustin 变换Stanley 跟踪大曲率路径偏差大仅用几何方法忽略动力学查看横向偏差变化趋势切换到 LQR 或 MPC 做横向控制机械臂 PID 跟不准重力项和耦合项随构型变化分析不同姿态下稳态误差加入重力补偿或前馈项除了这些具体问题还有一个“送命题”经常出现被问到“频率 10Hz 的振动控制带宽应该设计多少合适”很多人会只回答“高于 10Hz”实际上需要考虑传感器噪声、执行器响应延迟和系统共振频率通常不会无限提高带宽。这类开放性问题的关键是展示权衡思维而不是给出一个绝对数值。9. 复习路线与考前冲刺建议9.1 知识体系自查复习到后期建议你按下面列表自查每个知识点都能用自己的话解释清楚能不能从实际物理场景写出微分方程并转成状态方程和传递函数能不能在一分钟内判断一个三阶特征方程是否稳定能不能说出 PID、LQR、ADRC、MPC 各自的适用场景和局限性能不能画出一个 FOC 电机控制链路的完整数据流能不能用 Python 或 MATLAB 把一个二阶系统仿真并设计控制器能不能解释离散化方法的选择对稳定性的影响如果有一项答不上来优先补短板。笔试的大题往往把多个知识点串联起来一个环节卡住整个题目都很难推进。9.2 时间节奏如果你的时间比较充裕建议按“经典控制 → 现代控制 → 工程专题 → 代码仿真”的顺序推进每个阶段都用仿真验证。经典控制至少要亲手调一次 PID现代控制至少要完成一次 LQR 设计和观测器设计工程专题要结合目标岗位做重点突破。如果只剩两周建议把重心放在高频题型上建模、稳定性判断、PID 整定、LQR 设计、离散化。这些内容出现频率高复习性价比也高。代码方面至少要有一个能跑通的最小仿真框架笔试时直接复用思路。如果只剩两三天不要再大量刷新题把做过的推导和代码重新跑一遍然后重点复习概念简答题和工程陷阱题。这类题分值不高但往往是区分“会做”和“真正理解”的关键。9.3 最后提醒控制算法岗位的笔试本质上是看你能否在有限时间内完成“建模—分析—设计—验证”的闭环。公式和代码都很重要但更重要的是形成一条完整的问题解决路径。如果你现在有点慌可以先找一个最简单的系统比如一阶惯性环节分别用 PD、PI、PID 去控制亲手调一次参数观察曲线变化。这个过程比刷十套题都更能建立直观感知。控制方向的知识体系很深但笔试考察的往往是其中最核心、最常用的部分。把高频题型练熟把概念背后的物理意义想清楚你就能在众多候选人里建立明显优势。希望这份解析能帮你在接下来的笔试中少走弯路。