公司动态
信号与系统考研:由微分方程快速判断线性时不变系统
这次我们来看一个考研信号与系统里的高频基础题由微分方程描述系统的线性与时不变性判断。题目出自《小马哥960题》对应 2024 年西南交通大学真题第 1.1 题。先给结论判断线性看方程两边是否只出现未知函数、输入以及它们各阶导数的一次项判断时不变看方程中所有系数是否为常数。两个条件都满足就可以直接判定为线性时不变系统。下面我会把完整的判定流程、数值验证和考场答题模板都展开帮助你把这类题稳定拿分。这类题目看起来不像卷积、傅里叶变换那样有大计算量真正的问题在于概念边界。很多考生能把“常系数线性微分方程对应 LTI 系统”这个结论背下来但一遇到变系数、非线性项、常数项或非零初始条件就出错。文章后面会逐个场景拆解所以这篇内容既适合第一次学信号与系统的同学也适合冲刺阶段用来检查概念漏洞的考生。1. 核心能力速览项目说明题目来源《小马哥960题》2024 年西南交通大学真题第 1.1 题核心考点线性、时不变性以及由微分方程快速判断系统的线性时不变属性判断对象给定输入输出关系的常系数/变系数微分方程线性判断依据方程关于未知函数和输入是否满足叠加性与齐次性时不变判断依据方程系数是否为常数是否出现随 t 变化的系数或作用时刻常见结论常系数线性微分方程对应线性时不变系统验证手段Python scipy.signal.lsim 数值验证或手推零状态响应验证适合读者信号与系统考研、自动控制原理基础复习、期末备考从表格可以看出这道题考察的不是“会不会列方程”而是“会不会对系统概念做严格判断”。所以下面先花一点时间把线性和时不变的定义抠清楚再给出可以套用的步骤。后面的示例方程只是为了说明方法真题中把对应方程代入同一套流程即可。2. 适用场景与使用边界这种“判断系统属性”的题目在信号与系统、自动控制原理、电路分析基础里都会出现。它适合用来训练系统概念的清晰度对后续学习冲激响应、卷积积分、传递函数和状态空间模型都有帮助。考研试卷中这类题常以选择、填空或简答题的形式出现分值不高但出现频率高属于“必须拿满”的题型。更重要的是线性时不变概念是后续所有频域分析、复频域分析的前提如果这一步没有理解透后面学傅里叶变换和拉普拉斯变换时很容易越学越晕。但它的适用边界也很明显。第一它只能判断系统在给定方程输入输出关系下的宏观属性不能替代稳定性分析中的极点计算也不能替代具体响应求解。第二如果题目没有明确输入、输出的定义或者方程不是标准的“左端 y、右端 f”形式那么需要先自行整理成标准形式否则判断结果没有意义。第三在工程实际中一个系统常带有非零初始状态。严格来说“线性时不变”是系统本身的属性而零输入响应、零状态响应是否线性要分开讨论。如果题目只给微分方程默认讨论零状态响应这是考研题目的常见约定但复习时不要忽略这一点。还要补充一个边界情况微分方程描述的“系统”并不一定都是因果系统。虽然工程上绝大多数物理可实现系统是因果的但如果题目出现类似 (y(t)f(t1)) 的表达哪怕它满足线性时不变也不能默认因果。因此线性、时不变、因果、稳定这四个属性要分开判断不能因为系统是 LTI 就自动认为因果稳定。3. 线性与时不变性判断的底层概念3.1 线性系统定义线性系统要同时满足叠加性和齐次性。设输入 (f_1(t)) 对应输出 (y_1(t))输入 (f_2(t)) 对应输出 (y_2(t))那么对任意常数 (a_1)、(a_2)系统是线性的当且仅当[ a_1 f_1(t) a_2 f_2(t) \Rightarrow a_1 y_1(t) a_2 y_2(t) ]这个式子被称为零状态响应下的线性条件。注意这里说的“线性”是针对“输入—输出”关系不是针对时间变量 (t)。也就是说方程里出现 (t)、(t^2) 乃至 (\sin t) 作为系数不会破坏线性但如果出现 (y(t) f(t))、(y^2(t))、(\sin(y)) 这类以 (y) 或 (f) 为自变量的表达式就会破坏线性。初学者最常见的问题就是把“对 t 是否线性”和“对输入是否线性”混在一起。判断时只看未知函数和输入不看自变量 (t)。从算子角度理解线性系统等价于输入输出算子 (\mathcal{T}) 满足[ \mathcal{T}[a_1 f_1 a_2 f_2] a_1 \mathcal{T}[f_1] a_2 \mathcal{T}[f_2] ]如果系统由微分方程描述那么 (\mathcal{T}) 就是由微分算子组合成的映射。判断线性本质上就是判断这个映射能否保持数乘和加法运算。微分算子本身是线性算子因此 (y3y2yf) 这类方程左端是线性算子同时右端对 (f) 也是线性的系统就是线性的。3.2 时不变系统定义时不变性也叫移不变性。如果输入延迟 (t_0) 后输出也相应延迟 (t_0)那么系统是时不变的[ f(t - t_0) \Rightarrow y(t - t_0) ]从微分方程角度理解时不变要求系统的结构、参数都不随时间变化。如果一个微分方程的系数是常数那么方程描述的物理规律在不同时刻是相同的这就是时不变如果系数是 (t) 的显函数那么不同时刻方程本身都不一样系统自然是时变的。例如 (y(t)2y(t)f(t))无论什么时候启动输入系统内部都按同样的微分关系响应因此时不变。而 (y(t)t y(t)f(t))时刻越晚(y(t)) 前面的系数越大系统特性随时间改变因此是时变系统。注意时不变性和线性是两个独立维度。非线性系统也可能是时不变的例如 (y(t)y^2(t)f(t)) 就是非线性时不变系统而非线性时变系统的例子是 (y(t)t y^2(t)f(t))。所以做题时不要看见“非线性”就直接写“时变”两个结论必须分别判断。3.3 微分方程中的判断对象现实中系统微分方程可能带有非零初始条件例如[ y(t) 3y(t) 2y(t) f(t), \quad y(0)1,\ y(0)0 ]这里系统本身是 LTI 的但完整响应中包含了零输入响应。零输入响应依赖于初始状态初始状态可以看作一个附加输入。如果讨论“系统是否线性”正确做法是把零输入响应和零状态响应分开系统对输入 (f) 的零状态响应是线性的对初始状态的响应也是线性的但全响应关于“输入加初始状态”这个扩展输入是线性的。考研中很多判断题只给微分方程不给初始条件这时一律按零状态响应处理判断起来最简单。还需要注意如果题目只给出微分方程本身并没有明确哪个变量是输出哪个变量是输入需要先根据上下文确定输入输出关系。比如电路方程里电压和电流的关系可以写成多种形式判断前先统一写成[ \sum_{k0}^{n} a_k(t) y^{(k)}(t) \sum_{j0}^{m} b_j(t) f^{(j)}(t) ]这是后面所有判断的基础。4. 微分方程判断线性与时不变性的完整流程4.1 第一步整理方程形式先把给定方程改写成标准形式[ \sum_{k0}^{n} a_k(t) y^{(k)}(t) \sum_{j0}^{m} b_j(t) f^{(j)}(t) ]如果方程右侧含常数项也要先把它视为输入 (f) 的某个特殊项或者明确指出它会导致系统不满足齐次性。例如方程 (y2yf(t)1)如果输入是 (f(t))那么右侧的常数 (1) 不随输入缩放系统不是线性系统但如果把 (f(t)1) 整体看作新的输入 (u(t))则系统关于 (u) 是线性的。考试时要把输入定义写清楚避免因为“输入到底是什么”而丢分。整理形式时还要注意有些方程可能同时包含有延迟项比如 (y(t)2y(t-1)f(t))。这种方程属于微分差分方程如果延迟量固定且系数为常数系统仍然可能是线性时不变的因为固定延迟算子本身是时不变线性算子。遇到这类题不要慌把它当作“带延迟的线性常系数方程”处理即可。4.2 第二步判断线性逐项检查方程中出现的所有项。允许出现的是(a_k(t) \cdot y^{(k)}(t))其中 (a_k(t)) 只依赖 (t) 或为常数(b_j(t) \cdot f^{(j)}(t))其中 (b_j(t)) 只依赖 (t) 或为常数。一旦出现 (y^2)、(y y)、(y^2)、(\sin(y))、(e^y)、(y f)、(f^2) 等项系统就是非线性的。这里要特别提醒(y y y) 中虽然有三个不同的导数阶次但每一项对 (y) 都是一次所以仍然是线性方程而 (y y^2 f) 中(y^2) 不是一次项所以是非线性方程。线性判断不要只看“最高阶数”要逐项看未知函数和输入有没有相乘或自乘。可以用下面这个伪代码流程来整理思路输入系统微分方程 1. 把方程改写为 L[y] F[f] 的标准形式 2. 对每一项检查 - 是否只包含 y 或 f 的一次幂 - 是否存在 y 与 f 相乘或 y 的不同阶导数相乘 - 是否存在 sin(y)、e^y、|y|、y^n 等非线性函数 3. 如果任意一项违反一次条件则系统为非线性 4. 否则系统为线性4.3 第三步判断时不变在线性判断完成后单独检查时不变性。看标准形式的系数 (a_k(t)) 和 (b_j(t))。如果全部是常数系统是时不变的如果至少有一个系数是 (t) 的函数例如 (t^2 y)、(\sin t \cdot y)系统就是时变的。需要强调的是时不变判断并不要求系统一定是线性的。非线性系统同样可以有时不变和时变之分所以在回答时需要写成两个并列结论例如“非线性时不变系统”。判断时不变还可以从输入输出关系入手如果输入从 (f(t)) 变成 (f(t-t_0))输出是否也从 (y(t)) 变成 (y(t-t_0))如果方程系数是常数这个条件自动满足如果系数含 (t)比如 (t f(t))那么输入延迟后变成 ((t-t_0) f(t-t_0))而不是原来的 (t f(t)) 延迟 (t-t_0)两者不相等所以系统时变。4.4 典型示例对照微分方程线性结论时不变结论简要理由(y3y2yf(t))线性时不变y/f 各阶均为一次且系数常数(yt y2yf(t))线性时变系数含 (t)但 y/f 仍为一次(yy^2f(t))非线性时不变出现 (y^2)系数为常数(yt y^2f(t))非线性时变出现导数平方且系数含 (t)(y2yf(t)1)非线性关于 f时不变参数不变常数项破坏齐次性(y(t)f(2t))线性时变时间缩放破坏时移对应关系这张表可以作为快速对照。在真题中把方程对着表看一般不会出大问题。但也要注意表格中的“非线性”和“时变”是独立判断不要看见非线性就顺手写“时变”也不要看见常系数就默认线性。5. 用 Python 数值验证判断结果数值验证不是考试必须步骤但它能帮助理解“叠加性”和“时移性”到底是什么。下面以系统 (y 3y 2y f(t)) 为例用 Python 验证。5.1 验证线性叠加性把二阶微分方程转成状态空间模型再用scipy.signal.lsim计算不同输入下的输出。系统矩阵为[ A\begin{bmatrix}01\-2-3\end{bmatrix},\quad B\begin{bmatrix}0\1\end{bmatrix},\quad C\begin{bmatrix}10\end{bmatrix},\quad D0 ]import numpy as np from scipy import signal # 系统: y 3y 2y f A np.array([[0, 1], [-2, -3]], dtypefloat) B np.array([[0], [1]], dtypefloat) C np.array([[1, 0]], dtypefloat) D 0.0 sys signal.StateSpace(A, B, C, D) t np.linspace(0, 10, 1000) f1 np.sin(t) f2 np.cos(t) _, y1, _ signal.lsim(sys, f1, t) _, y2, _ signal.lsim(sys, f2, t) _, y_sum, _ signal.lsim(sys, f1 f2, t) max_err np.max(np.abs(y_sum - (y1 y2))) print(线性叠加残差, max_err)运行后线性叠加残差会是一个接近 0 的数说明该系统对输入满足叠加性这是线性系统的表现。如果换成非线性方程比如把系统改成 (y 3y 2y f^2(t))同样的代码算出来残差会明显不为 0。这里的残差就是判断线性的量化指标。5.2 验证时不变时移对应关系继续用同一个线性常系数系统验证输入时移后输出是否也时移。t0 2.0 f_orig np.sin(t) f_shift np.sin(t - t0) _, y_orig, _ signal.lsim(sys, f_orig, t) _, y_shift, _ signal.lsim(sys, f_shift, t) # 将未时移输出右移 t0与输入时移后的输出比较 delay int(t0 / (t[1] - t[0])) max_err np.max(np.abs(y_shift[delay:] - y_orig[:-delay])) print(时不变性残差, max_err)从时间轴上看y_shift对应的是时移后的输出y_orig右移 (t0) 之后应该与y_shift在重叠区间一致。残差接近 0说明系统是时不变的。如果系统是变系数的比如 (y t y 2y f(t))同样的时移验证就会出现明显偏差。代码中使用了周期正弦信号实际教学时也可以用有限时宽脉冲避免周期信号边界瞬态带来的微小误差。5.3 代码运行后的观察点运行这些代码时不用刻意追求残差绝对为 0因为数值积分本身有误差。可以观察两点第一残差量级是否远小于输出本身的量级第二如果修改系统参数后残差异常增大说明改变的那一项破坏了线性或时不变属性。更严谨的验证应该使用有限时间窗脉冲信号避免周期信号在边界处带来的瞬态影响但上面的代码已经足够帮助理解概念。如果要在 MATLAB 中复现可以用lsim函数本质思路一样。需要说明的是这里的数值验证只是辅助手段考试中不能依靠跑代码还是要手推判断过程。6. 常见错误与排查方法下面整理一份排查清单覆盖大多数丢分点。常见错误可能原因排查方式解决方案看见 (y^2) 没反应只关注导数阶数忘记检查多项式次数逐项看 y 的整体次数(y^n(n\ne1)) 都是非线性把 (t y) 当成非线性混淆“系数随时间变”和“输出非线性”