
上篇讲了系统建模——怎么把物理系统变成微分方程。但微分方程有个问题解起来太麻烦了。你要分析系统的稳定性、响应速度直接解微分方程是很痛苦的事。传递函数就是来解决这个问题的。它的核心思想特别巧妙——用拉普拉斯变换把微分方程变成代数方程。微分方程在时域里解起来头疼变成代数方程后加减乘除就能搞定分析。很多人一听到拉普拉斯变换就头大觉得这是数学系的玩意儿搞工程的用不着。讲真你不需要会推导拉普拉斯变换的积分公式但你必须理解它的物理意义和传递函数的用法。面试中这部分考得非常多。拉普拉斯变换到底在干嘛说白了拉普拉斯变换就是把时间域的信号变换到复数域s域。时域里你看到的是信号随时间变化的波形s域里你看到的是信号在不同频率和衰减率下的分量。变换的定义是F(s) ∫₀^∞ f(t) * e^(-st) dt你不需要记住这个积分。你需要记住的是几个关键性质时域的导数在s域变成了乘以s。时域的积分在s域变成了除以s。这就是拉普拉斯变换最牛的地方——微分和积分变成了简单的乘除运算。打个比方。你在时域里分析系统就像用算盘做乘法——能做但费劲。拉普拉斯变换把你送到s域就像给你一台计算器——同样的问题运算量小了一个数量级。而且s域里有很多直观的图形化工具伯德图、根轨迹、奈奎斯特图让你一眼就能看出系统的特性。另外s域分析还有一个巨大的好处多个系统串联的时候总传递函数就是各个传递函数直接相乘。在时域里这意味着卷积运算——非常复杂。在s域里变成了简单的乘法。这也是为什么传递函数在工程上这么受欢迎。# 拉普拉斯变换的核心性质演示 # 时域: m*x b*x k*x F(t) # s域: m*s²*X(s) b*s*X(s) k*X(s) F(s) # 其中X(s)是x(t)的拉普拉斯变换F(s)是F(t)的拉普拉斯变换 # 传递函数 输出/输入 X(s)/F(s) # G(s) 1 / (m*s² b*s k) # 用Python的control库验证 import numpy as np m, b, k 1.0, 0.5, 2.0 # 传递函数的分子和分母系数 numerator [1] # 分子: 1 denominator [m, b, k] # 分母: m*s² b*s k print(f传递函数: G(s) {numerator[0]} / ({denominator[0]}s² {denominator[1]}s {denominator[2]})) print(f即: G(s) 1 / (s² 0.5s 2))传递函数的定义和物理意义传递函数的定义零初始条件下系统输出的拉普拉斯变换与输入的拉普拉斯变换之比。用公式写就是G(s) Y(s) / U(s)传递函数的物理意义是什么它描述了系统对不同频率信号的处理方式。你给系统输入一个正弦信号传递函数告诉你这个正弦信号经过系统后幅度会变多少、相位会偏移多少。传递函数有几个关键特性第一它只跟系统本身有关质量、阻尼、刚度这些参数跟输入信号无关。不管你输入阶跃信号还是正弦信号传递函数都是一样的。第二它假设零初始条件。这意味着传递函数描述的是系统从零开始的响应特性不包含初始状态的影响。第三它是线性系统的专属工具。非线性系统没有传递函数——这也是为什么经典控制理论只能处理线性系统。零极点传递函数的灵魂传递函数是一个关于s的有理分式可以写成G(s) K * (s-z1)(s-z2)... / (s-p1)(s-p2)...分子为零的点叫零点z分母为零的点叫极点p。零极点为什么重要因为极点决定了系统的稳定性零极点共同决定了系统的动态响应。极点在复平面的左半边实部为负系统稳定。极点在右半边实部为正系统不稳定。极点在虚轴上系统临界稳定等幅振荡。import numpy as np # 计算传递函数的极点 # G(s) 1 / (s² 0.5s 2) denominator [1, 0.5, 2] poles np.roots(denominator) print(f极点: {poles}) print(f实部: {poles.real}) print(f系统稳定吗? {all(poles.real 0)}) # 极点实部为负系统稳定 # 极点的虚部决定了振荡频率 # 极点的实部绝对值决定了衰减速度面试的时候如果面试官问传递函数的零极点有什么物理意义你可以这样回答极点决定了系统的自然响应模式——每个极点对应一个指数衰减或增长的模态。极点实部为负对应的模态指数衰减系统稳定。极点实部为正对应的模态指数增长系统发散。零点的存在会改变各模态的权重影响响应的形状比如超调量。补充一个工程上的直觉控制器设计的本质说白了就是极点配置。你通过设计控制器改变闭环系统的极点位置让极点都在左半平面保证稳定并且让极点的位置满足你对响应速度、超调量的要求。后面讲PID调参的时候你会发现调P其实就是在移动极点的位置。再举个例子。你有一个电机控制系统开环传递函数的极点在s-2和s-5的位置系统稳定但响应慢。你加了一个比例控制器闭环极点变成了s-10和s-20响应速度快了很多。但如果你把比例增益调得太大极点可能跑到复平面上变成共轭复数极点系统就开始振荡了。这就是为什么调参要在快和稳之间找平衡。用传递函数分析系统特性有了传递函数分析系统特性就变得非常系统化。稳态增益把s0代入传递函数得到的值就是稳态增益。它告诉你系统对恒定输入的放大倍数。带宽传递函数的幅值下降到-3dB时对应的频率。带宽越大系统响应越快。谐振峰值如果传递函数在某个频率处有峰值说明系统对这个频率的输入信号有放大效应。谐振峰值越大系统的振荡倾向越明显。# 用scipy分析传递函数的频率响应 from scipy import signal import numpy as np # 传递函数 G(s) 1 / (s² 0.5s 2) sys signal.TransferFunction([1], [1, 0.5, 2]) # 计算频率响应 w, mag, phase signal.bode(sys) # 稳态增益 (s-0) dc_gain 1.0 / 2.0 # 把s0代入 print(f稳态增益: {dc_gain:.2f}) print(f自然频率: {np.sqrt(2):.2f} rad/s) print(f阻尼比: {0.5/(2*np.sqrt(2)):.3f})这些分析工具在面试中经常出现。面试官不一定让你手算但你得知道每个指标的含义、怎么从传递函数中得到它、它跟系统性能的关系。之前面试一家做无人机的公司面试官问给你一个传递函数你怎么判断系统响应快不快我说主要看两个东西一是带宽带宽越大响应越快二是极点实部的绝对值绝对值越大衰减越快系统到达稳态越快。面试官又问怎么判断超调大不大我说看阻尼比阻尼比小于0.707就会有超调阻尼比越小超调越大。补充一个传递函数在实际项目中的应用经验。当时我们做一台移动机器人的速度控制需要设计一个速度环控制器。第一步就是用系统辨识的方法获取电机的传递函数——给电机发一个阶跃电压信号记录转速响应曲线从曲线的上升时间和稳态值反推出一个一阶传递函数G(s) K/(τs1)。有了这个模型就能在MATLAB/Python里仿真不同控制器参数下的响应选出合适的PID参数后再上实车验证。这个先辨识建模再仿真调参最后实车验证的流程在工业界非常普遍面试时候讲出来能体现你的工程素养。下一篇讲一阶和二阶系统的响应——这是理解所有动态特性的基础。如果这篇文章对你有帮助欢迎点赞、在看、转发三连。 你的支持是我持续更新的最大动力。「机器人软件开发面试·从入门到精通」连载系列上一篇第178篇 系统建模——从物理方程到数学模型 下一篇预告第180篇 一阶/二阶系统响应——理解动态特性的基础有任何问题欢迎评论区留言我会尽量回复。