在学自动控制原理时,线性系统的分析工具确实很顺手:传递函数、频率特性、根轨迹、奈奎斯特判据,一套组合拳下来基本能解决大部分问题。但一旦遇到死区、饱和、间隙、继电这些非线性环节,线性化方法经常会失效,甚至教材里的小偏差线性化也会失灵。卡在第八章本质非线性部分的同学不少,尤其是描述函数法的物理含义、负倒描述函数怎么画、自持振荡怎么判断这几个问题,网上的资料往往零散不成体系。这篇作为本质非线性专题的第二篇,会把典型本质非线性的建模、描述函数法原理、稳定性判断步骤完整梳理一遍,同时给出可复现的 Python 和 MATLAB 仿真代码,帮助你把教材公式转化成工程直觉。
本文适合自动化、电气、机械、机器人等方向正在学习自动控制原理的本科生和研究生,也适合准备考研复试或期末考试复习的读者。学完之后,你应该能做到:看到一张输入输出特性曲线,能快速识别是死区、饱和、间隙还是继电特性;能写出它们的分段数学表达式;能计算常见非线性的描述函数;能用描述函数法判断闭环系统是否稳定、是否会产生自持振荡;还能用代码复现描述函数曲线和振荡交点,而不是停留在抄公式的层面。
1. 背景与核心概念
1.1 什么是本质非线性
自动控制原理里说的非线性,通常分成两类。一类是“非本质非线性”,也叫一般非线性,这类特性往往在工作点附近是连续光滑的,可以用泰勒展开取一次项做小偏差线性化。比如电阻的电压电流曲线、电机的机械特性,在设计工作点附近近似成一条直线,误差是可以接受的。
另一类就是“本质非线性”。它们的特点是:要么本身存在不连续点,比如继电器在零点附近突然切换;要么局部特性无法用一条切线代替,比如死区在零输入附近输出恒为零,饱和在超过阈值之后输出被限幅。这类非线性即使在小范围内工作,也不能简单线性化。换句话说,你不能用“斜率”去近似它,因为功能变化本身就是系统行为的重要组成部分。
本质非线性的常见类型包括:
- 死区特性:常见于液压阀、测量仪表、静摩擦大的传动机构。
- 饱和特性:常见于运放输出限幅、电机力矩限制、控制器输出饱和。
- 间隙特性:常见于齿轮传动、齿轮—齿条机构、蜗轮蜗杆。
- 继电特性:常见于继电器开关控制、电力电子变换器、PWM 控制。
这些特性在工程系统里几乎无处不在。很多时候我们觉得一个系统“难调”,并不是控制器设计得不好,而是系统中存在未被建模的非线性环节在起反作用。
1.2 为什么不能用线性系统理论直接分析
线性系统有两个核心性质:齐次性和叠加性。对于本质非线性系统,这两个性质都不成立。输入幅值变化一倍,输出不一定变化一倍;两个输入叠加,输出也不是各自输出之和。更关键的是,非线性系统会表现出一些线性系统永远不可能有的行为。
最典型的就是极限环,也就是自持振荡。线性系统在临界稳定时,理论上可以出现等幅振荡,但参数稍有变化振荡就会发散或衰减,很难在工程上长期维持。而非线性系统可以在没有任何外部周期输入的情况下,自己维持一个固定幅值和频率的振荡,这就是极限环。继电器控制最容易产生这种问题。
另一个特点是稳定性与初始条件有关。线性系统的稳定性是系统的固有属性,和初始状态无关。但非线性系统常常存在多个平衡点,有些平衡点局部稳定、局部不稳定,从不同的初始状态出发,最终可能收敛到不同的解。比如同一个系统,初始偏差小时输出收敛到零,初始偏差大时反而出现持续振荡。这种“全局”和“局部”的差异,是学习非线性系统时最容易忽略的地方。
1.3 典型应用场景
本质非线性在自动控制系统中非常常见,举几个具体场景:
伺服电机驱动器输出有限幅,电流环和速度环在启动阶段经常进入饱和区;精密工作台存在静摩擦死区,导致小误差时系统不动作;齿轮减速器必然存在间隙,正反转切换时出现回程误差;温控系统用继电器或滞环控制加热器,系统天生就是一个非线性开关系统。甚至很多现代控制算法里,为了工程安全性故意加入了死区和限幅,比如 PID 输出限幅、执行机构死区补偿等。
理解这些非线性环节的本质,不仅是为了应付考试,更是为了看懂真实系统为什么会出现振荡、为什么响应慢、为什么小信号控制精度上不去。这也是本章在整本自动控制原理教材中价值最高的部分之一。
2. 典型本质非线性特性的建模与分析
2.1 死区特性
死区特性的输入输出关系可以用下面这个分段函数描述:
y = 0, 当 |x| <= Δ y = k * (x - Δ * sign(x)), 当 |x| > Δ其中 Δ 是死区宽度,k 是线性区斜率。从波形上看,输入为正弦信号时,输出在输入穿越零附近的一段时间内保持为零,相当于把正弦波的中间段削掉了一部分。
死区对控制系统的影响,需要从两个方面理解。一方面它降低了系统的稳态精度,因为在小误差区内,执行机构根本不响应,等于系统存在一个无法克服的静差;另一方面,死区又能滤除小幅噪声和扰动,避免执行机构频繁动作,这在很多需要节能或减少磨损的场合反而是优点。
工程中处理死区,典型思路是加入“死区逆模型”进行补偿,也就是前馈一个和死区特性相反的环节。但这要求系统模型足够准确,死区参数发生变化时补偿效果会明显下降。
2.2 饱和特性
饱和特性的数学描述为:
y = k * x, 当 |x| <= δ y = k * δ * sign(x), 当 |x| > δδ 是线性区宽度,k 是线性区增益。实际系统中,各类放大器和执行机构都有输出上限,所以饱和现象几乎无法避免。
饱和特性最本质的影响是“执行能力有限”。当控制量进入饱和区之后,实际系统的开环增益会明显下降。对线性控制器来说,这相当于在控制过程中临时降低了增益。具体表现是:系统启动阶段积分饱和导致超调变大;大误差时明明控制量已经顶满,输出仍然跟不上;抗扰动能力下降。
这里必须提到一个经典陷阱:PID 控制器的积分饱和。当执行机构饱和时,误差持续存在,积分项持续累积,一旦误差反向,积分值需要很长时间才能退出来,造成大超调。解决思路是采用抗积分饱和结构,比如积分限幅、积分分离、遇限停止积分等。这些措施本质上就是在工程层面补偿饱和非线性的不良影响。
2.3 间隙特性
间隙特性也叫回环特性,输入输出关系不满足单值映射,输出不仅取决于当前输入,还取决于历史输入方向。齿轮传动中主动轮换向时,从动轮会在间隙范围内滞后一段时间,形成典型的“空回”现象。
间隙特性的输入输出关系可以写成:
当 x 增加时:y = k * (x - b) 当 x 减小时:y = k * (x + b)其中 b 是间隙宽度折算到输入侧的等效值,k 是斜率。输入为正弦时,输出呈现一个平行四边形回环,回环面积越大,相位滞后越严重。
间隙对系统的影响主要体现在三个方面:一是产生稳态误差,齿轮反转后位置丢失;二是引入附加相位滞后,降低系统的相角裕度;三是可能诱发自持振荡,特别是在高增益控制下,间隙很容易让系统表现出持续的低频振荡。
抑制间隙影响的方法包括:机械上采用消隙齿轮、双电机消隙、预紧结构;控制上加入间隙逆模型补偿、增加阻尼、降低回路增益。需要注意的是,间隙逆模型需要判断运动方向,实现起来比死区补偿稍复杂。
2.4 继电特性
继电特性是典型的开关型非线性,工程上常用来控制加热器、水泵、阀门通断。理想继电特性的表达式最简单:
y = M,当 x > 0 y = -M,当 x < 0实际工程中更常见的是带滞环的继电特性。滞环宽度为 h 时,切换条件为:
当 x > h 时输出跳变为 +M 当 x < -h 时输出跳变为 -M 当输出已经为 +M 且 x > -h 时保持 +M 当输出已经为 -M 且 x < h 时保持 -M带滞环的继电控制有一个很大的优势:避免输入在零点附近波动时继电器频繁通断,延长执行机构寿命。温控器、压力开关大多采用这种设计。
继电特性输出只有两个或三个电平,功率放大效率高,驱动能力强,但也是最容易引发自持振荡的非线性特性。因为开关动作本质上是把一个大阶跃反复加到系统上,如果系统本身阻尼不够,就会形成极限环。后面我们会用描述函数法定量分析这个问题。
3. 描述函数法原理拆解
3.1 描述函数法的基本假设
描述函数法本质上是频率法的推广,它把非线性环节在正弦输入下的输出近似成一次谐波,然后用类似频率特性的方式分析闭环稳定性。这个方法的适用条件必须明确,不然很容易在工程应用中踩坑。
基本假设包括:
- 输入到非线性环节的信号是正弦信号,系统里的高次谐波已经被线性部分充分滤除。
- 非线性特性是奇对称的,也就是 f(-x) = -f(x),这样输出不含直流分量。
- 非线性环节的输入输出关系中,输出基波分量远大于高次谐波分量,可以忽略高次谐波。
- 系统中只考虑一个非线性环节,其余部分可以合并成线性部分。
因此,描述函数法并不是精确方法,而是一种工程近似方法。只有当线性部分的低通滤波特性明显时,结果才足够可信。
3.2 描述函数定义与谐波线性化
设非线性环节输入为:
x(t) = A * sin(ωt)其中 A 为正弦幅值,ω 为角频率。输出 y(t) 一般是周期信号,展开成傅里叶级数后,基波分量可以写成:
y1(t) = B1 * sin(ωt) + C1 * cos(ωt)用复数表示就是 Y1 = B1 - jC1,或者直接写成幅值相位形式。描述函数定义为:
N(A, ω) = 基波分量复数表达式 / 输入正弦复数表达式对大多数单值非线性,比如死区、饱和、理想继电,输出基波与输入同相,描述函数是实数,只和输入幅值 A 有关,和频率无关。对多值非线性,比如间隙、滞环继电,输出存在相位滞后,描述函数是复数,既和 A 有关,也可能和 ω 无关。
“谐波线性化”这个名字也解释清楚了:我们是主动扔掉高次谐波,保留基波,把非线性环节等效成一个随输入幅值变化的“变增益”,而不是在小范围内用切线近似。这正是描述函数法能处理本质非线性问题的核心思路。
3.3 常见本质非线性的描述函数
典型非线性的描述函数公式如下,这里的公式以教材和工程手册中常见的表达为准:
理想继电特性: N(A) = 4M / (πA) 带滞环继电特性: N(A) = (4M / (πA)) * sqrt(1 - (h/A)^2) - j * (4M * h) / (πA^2) 死区特性: N(A) = k * [1 - (2/π) * (arcsin(Δ/A) + (Δ/A) * sqrt(1 - (Δ/A)^2))] 饱和特性: N(A) = (2k/π) * (arcsin(δ/A) + (δ/A) * sqrt(1 - (δ/A)^2)) 间隙特性: N(A) = (k/π) * [π/2 + arcsin(1 - 2b/A) + 2 * (1 - 2b/A) * sqrt(b/A - (b/A)^2)] + j * (4kb/(πA)) * (b/A - 1)使用这些公式时,必须注意取值范围。死区公式要求 A ≥ Δ,饱和公式要求 A ≥ δ,继电公式要求 A > 0,间隙公式要求 A ≥ b。当输入幅值小于非线性阈值时,系统实际上工作在线性区或完全不动作,描述函数需要按极限情况处理。
死区、饱和这类单值非线性的描述函数是正实数,说明它只改变等效增益,不引入相位变化。间隙和滞环继电的描述函数包含虚部,其中虚部为负值,表示输出基波滞后于输入,这正是它们会降低系统稳定裕度的原因。
3.4 负倒描述函数的作用
闭环系统的特征方程可以写成:
1 + G(jω) * N(A) = 0等价于:
G(jω) = -1 / N(A)这里的 -1/N(A) 称为负倒描述函数,它在复平面上的轨迹随 A 变化,相当于非线性系统的一条“临界曲线”。整个描述函数法分析稳定性,本质上是看线性部分频率特性 G(jω) 和负倒描述函数 -1/N(A) 的相对位置关系。
对于理想继电特性,-1/N(A) = -πA/(4M),当 A 从 0 增大到无穷大时,它沿着负实轴从 0 走到负无穷。对于饱和特性,-1/N(A) 的起点和终点需要仔细计算,因为 N(A) 在 A = δ 时等于 k,在 A 趋于无穷时 N(A) 趋于 0,所以负倒描述函数会从 -1/k 出发走向负无穷,中间可能还有拐点。画曲线时,必须标清楚 A 增大的方向,这对后续判断自持振荡稳定性至关重要。
4. 稳定性分析与自持振荡判断
4.1 非线性系统稳定性判据
描述函数法把非线性系统近似成“线性部分 + 变增益”来分析,稳定判据如下:
- 如果 G(jω) 曲线不包围 -1/N(A) 曲线,则闭环系统被认为是稳定的。
- 如果 G(jω) 曲线包围 -1/N(A) 曲线,则闭环系统不稳定。
- 如果 G(jω) 曲线与 -1/N(A) 曲线相交,则系统可能产生自持振荡,交点对应的频率和幅值就是振荡的参数。
这个判据和线性系统奈奎斯特判据非常相似。线性系统中,G(jω) 绕过 (-1, j0) 点就表示临界稳定;非线性系统中,临界点变成了一条曲线 -1/N(A),每个 A 值对应一个临界点。系统可能在某些幅值下稳定,在另一些幅值下不稳定,这正是非线性系统的复杂之处。
还要注意,这里的“稳定”指的是对特定幅值范围内的扰动而言,不能直接扩展到全局。实际工程中,即使系统在平衡点附近是稳定的,一个大扰动也可能把系统推到极限环上。
4.2 典型例题:继电系统自持振荡计算
下面用一个具体例子演示完整计算过程。设系统由理想继电特性和线性部分组成,继电输出幅值 M = 1,线性部分传递函数为:
G(s) = 10 / (s * (s + 1) * (s + 3))先求理想继电特性的负倒描述函数:
N(A) = 4M / (πA),所以 -1/N(A) = -πA / 4当 A 从 0 增大到无穷大时,-1/N(A) 沿着负实轴从 0 到负无穷。
再求 G(jω) 的表达式。令 s = jω:
G(jω) = 10 / (jω * (jω + 1) * (jω + 3))展开整理得到:
G(jω) = 10 / [-4ω² + jω(3 - ω²)]令虚部为零,也就是令 G(jω) 与负实轴相交:
ω(3 - ω²) = 0解出 ω = √3 rad/s。代入 G(jω) 的实部:
G(j√3) = 10 / (-4 * 3) = -0.8333自持振荡条件要求:
-πA / 4 = -0.8333所以:
A = 4 * 0.8333 / π ≈ 1.061因此,这个系统在描述函数法近似下,预计会存在自持振荡,振荡角频率约为 1.732 rad/s,非线性环节输入端等效正弦幅值约为 1.061。这个结果并不精确,它依赖于高次谐波被线性部分滤除的假设,但作为工程估计已经很有参考价值。
4.3 自持振荡稳定性的进一步判断
两个曲线有交点,不一定代表振荡能实际观察到。还需要判断这个极限环本身是否稳定。工程上常用的判断方法是:在交点附近,沿 A 增大的方向观察 -1/N(A) 曲线的走向。
如果一个交点处,-1/N(A) 随 A 增大从 G(jω) 曲线包围区域内部走向外部,那么这个自持振荡是稳定的;反之,如果从外部走向内部,则极限环不稳定,实际系统不一定能维持该振荡。对于理想继电特性,-1/N(A) 随 A 增大从原点走向负无穷,分析时要结合 G(jω) 曲线具体形状来判断。
不过,教材对“内部”和“外部”的定义有时略有差异,建议以你所使用教材的表述为准。工程上更稳妥的做法是用仿真验证:给系统施加不同初始条件,观察是否出现等幅振荡以及振荡幅值频率是否和描述函数法预测一致。如果仿真结果和计算结果接近,这个方法就用对了。
5. 仿真验证:代码与结果
5.1 用 Python 绘制典型非线性描述函数
为了直观理解各类非线性的描述函数,这里写一个完整的 Python 脚本,用于计算死区、饱和、理想继电、带滞环继电四种特性的描述函数曲线。代码基于 NumPy 和 Matplotlib,Python 3.8 以上即可运行。
import numpy as np import matplotlib.pyplot as plt def dead_zone_describing_function(A, delta, k=1.0): A = np.asarray(A, dtype=float) N = np.ones_like(A) * k valid = A > delta x = delta / A[valid] N[valid] = k * (1 - 2.0 / np.pi * (np.arcsin(x) + x * np.sqrt(1 - x**2))) N[A <= delta] = 0.0 return N def saturation_describing_function(A, delta, k=1.0): A = np.asarray(A, dtype=float) N = np.ones_like(A) * k valid = A > delta x = delta / A[valid] N[valid] = 2.0 * k / np.pi * (np.arcsin(x) + x * np.sqrt(1 - x**2)) return N def ideal_relay_describing_function(A, M=1.0): A = np.asarray(A, dtype=float) return 4.0 * M / (np.pi * A) def hysteresis_relay_describing_function(A, M=1.0, h=0.5): A = np.asarray(A, dtype=float) N = np.zeros_like(A, dtype=complex) valid = A >= h x = h / A[valid] N[valid] = (4.0 * M / (np.pi * A[valid])) * np.sqrt(1 - x**2) \ - 1j * (4.0 * M * h) / (np.pi * A[valid]**2) return N A = np.linspace(0.05, 5.0, 2000) delta = 1.0 k = 1.0 N_dead = dead_zone_describing_function(A, delta, k) N_sat = saturation_describing_function(A, delta, k) N_relay = ideal_relay_describing_function(A, M=1.0) N_hyst = hysteresis_relay_describing_function(A, M=1.0, h=0.5) fig, axes = plt.subplots(2, 2, figsize=(11, 8)) axes[0, 0].plot(A, N_dead, 'b', linewidth=2) axes[0, 0].set_title("Dead Zone") axes[0, 0].set_xlabel("A") axes[0, 0].set_ylabel("N(A)") axes[0, 0].grid(True) axes[0, 1].plot(A, N_sat, 'g', linewidth=2) axes[0, 1].set_title("Saturation") axes[0, 1].set_xlabel("A") axes[0, 1].set_ylabel("N(A)") axes[0, 1].grid(True) axes[1, 0].plot(A, N_relay, 'r', linewidth=2) axes[1, 0].set_title("Ideal Relay") axes[1, 0].set_xlabel("A") axes[1, 0].set_ylabel("N(A)") axes[1, 0].grid(True) axes[1, 1].plot(A, N_hyst.real, 'm-', linewidth=2, label="real") axes[1, 1].plot(A, N_hyst.imag, 'c--', linewidth=2, label="imag") axes[1, 1].set_title("Relay with Hysteresis") axes[1, 1].set_xlabel("A") axes[1, 1].set_ylabel("N(A)") axes[1, 1].legend() axes[1, 1].grid(True) plt.tight_layout() plt.show()从结果中能看到几个关键特点:死区的 N(A) 从 0 逐渐增大趋向 k,说明幅值较小时等效增益低;饱和特性的 N(A) 从 k 逐渐下降趋向 0,说明大信号下增益衰减;理想继电的 N(A) 是一条反比曲线,幅值越小增益越大;带滞环继电的 N(A) 同时有实部和负虚部,说明输出基波滞后于输入。
5.2 用 Python 求自持振荡交点
下面用代码复现刚才的例题,直接求出 G(jω) 与 -1/N(A) 的交点。由于理想继电的 -1/N(A) 在负实轴上,可以先用数值方法找到 G(jω) 虚部为零的频率,再计算幅值 A。
import numpy as np from scipy.optimize import brentq K = 10.0 M = 1.0 def G_freq(w): s = 1j * w return K / (s * (s + 1.0) * (s + 3.0)) def imag_G(w): return np.imag(G_freq(w)) # 在 1 ~ 2 rad/s 之间寻找虚部过零点 w0 = brentq(imag_G, 1.0, 2.0) G0 = G_freq(w0) g_real = G0.real # 理想继电器:-1/N(A) = -pi*A / (4M),取实部相等 A0 = -4.0 * M / (np.pi * g_real) print("G(jw) 与负实轴交点频率: {:.4f} rad/s".format(w0)) print("交点处实部 G(jw0): {:.4f}".format(g_real)) print("预测自持振荡幅值 A0: {:.4f}".format(A0)) print("验证 -1/N(A0): {:.4f}".format(-np.pi * A0 / (4.0 * M)))运行结果应大约为:
G(jw) 与负实轴交点频率: 1.7321 rad/s 交点处实部 G(jw0): -0.8333 预测自持振荡幅值 A0: 1.0610 验证 -1/N(A0): -0.8333这个脚本把前面手算的例题自动化了。实际系统中线性部分更复杂时,brentq 的搜索区间需要根据奈氏图的大致形状调整,可以先画 G(jω) 曲线观察负实轴穿越点的大致范围。
5.3 用 MATLAB 和 Simulink 验证
MATLAB 环境下可以用几行代码画出同样的判断图:
s = tf('s'); G = 10 / (s * (s + 1) * (s + 3)); figure; nyquist(G); hold on; % 理想继电特性 M = 1 的负倒描述函数 M = 1.0; A = 0.1:0.01:5; n = -pi * A / (4 * M); plot(n, zeros(size(n)), 'r--', 'LineWidth', 1.5); xlabel('Real'); ylabel('Imag'); grid on; legend('G(j\omega)', '-1/N(A)', 'Location', 'best');运行后会在奈氏图中看到 G(jω) 曲线穿越负实轴,红色虚线沿负实轴延伸,交点位置就是预报的自持振荡点。
如果需要更直观地观察极限环,可以在 Simulink 中搭建模型:用 Signal Generator 产生一个初始扰动,或者直接在积分器初值上给一个偏差;非线性环节用 Relay 模块,线性部分用 Transfer Fcn 模块;输出接 Scope 观察。仿真时间设置足够长,比如 30 秒,能看到输出最终收敛到近似等幅振荡,振荡频率和幅值与描述函数法估计值比较接近。这里需要提醒的是,Simulink 的 Relay 模块参数要结合继电特性模型来设置,切换点、输出高电平和低电平都要对应清楚,否则仿真结果和理论对不上。
6. 常见问题与排查思路
描述函数法在实际使用中,新手容易碰到各种“算出来和仿真对不上”的情况。下面整理几个最常见的问题和排查思路。
| 问题现象 | 常见原因 | 解决思路 |
|---|---|---|
| 描述函数法预测稳定,但仿真出现振荡 | 高次谐波未被线性部分充分滤除 | 检查线性部分的低通特性,改用高次谐波更弱的仿真模型验证 |
| 计算出的自持振荡频率和仿真差很多 | G(jω) 与 -1/N(A) 交点找错 | 重新检查 G(jω) 表达式、变量单位和频率扫描范围 |
| 负倒描述函数曲线画不出来 | A 的取值范围设置不合理 | 确保 A 从非线性阈值附近开始扫描,覆盖整个有效区间 |
| 带滞环继电的描述函数实部虚部对不上 | 公式中 h 的取值符号错误 | 对照教材反复确认滞环宽度定义,仿真中注意 Relay 模块的切换逻辑 |
| 判断稳定性时方向出错 | 没有标注 A 增大方向 | 在 -1/N(A) 曲线上标箭头,沿箭头方向分析包围关系 |
| 系统有多个交点,不知道哪个极限环会出现 | 自持振荡稳定性没有逐点分析 | 对每个交点分别判断稳定性,再结合初始条件确定实际振荡点 |
| 仿真中改变初始条件后振荡消失 | 极限环只存在于有限吸引域 | 描述函数法只能给出局部结论,用多个初始值仿真确定有效范围 |
排查时建议遵循三个原则:先检查线性部分 G(jω) 是否正确,再检查非线性描述函数公式和参数,最后才怀疑稳定性判据本身。很多计算结果对不上,是因为多项式展开时符号错了,或者传函分子分母写反了。
关于自持振荡稳定性,这里再补充一句。描述函数法得到的是“可能存在”的振荡,实际系统中能不能稳定维持,要看交点附近的局部特性。工程判断最可靠的方法永远是仿真加实验,不要只凭曲线位置就下结论。
7. 最佳实践与工程建议
7.1 建模阶段的建议
在建立被控对象模型时,首先要识别系统里是否存在本质非线性,不要一上来就默认线性模型。对于机械系统,重点检查齿轮间隙和静摩擦;对于电气系统,重点检查功率放大器饱和和脉宽调制器的开关死区;对于测量系统,重点检查传感器和变送器的死区。建模时把非线性环节单独提出来,保留一个明确的接口,后续才能用描述函数法、相平面法或仿真工具进行针对性分析。
小偏差线性化不是不能用,但要确认工作点附近是否连续可导、偏差是否足够小。如果系统经常在零位附近反向运行,齿轮间隙和静摩擦带来的非线性是躲不掉的,强行线性化会得到完全错误的稳定性结论。
7.2 控制器设计与振荡抑制建议
如果分析发现系统存在自持振荡,抑制思路可以从以下几个方向入手:
- 增加系统阻尼,提高相位裕度。这是最通用的做法,相当于让 G(jω) 曲线远离临界点。
- 对继电控制加入滞环,减少高频通断,但从频率分析看滞环也可能引入相位滞后,需要权衡。
- 对测量信号加入滤波,降低非线性环节输入端的高频分量,但滤波本身也会引入相位滞后。
- 在控制器中加入死区或限幅,防止执行机构频繁进入饱和区和死区。
- 对非线性环节做逆模型补偿,例如间隙补偿和死区补偿。
控制器整定时,要特别关注线性控制器在本质非线性系统中可能出现的积分饱和问题。遇到响应迟钝、超调异常时,先看控制量是不是长期顶在饱和限幅上。
7.3 仿真验证与安全边界
任何基于描述函数法的结论,都应该在仿真和实际系统中验证。仿真时要注意:尽量使用变步长求解器并设置较小的相对误差,因为继电器这类不连续环节对求解器很敏感;合理安排仿真时长,让系统充分进入稳态,避免把暂态过程误判成极限环;每次修改参数后,重新扫描多个初始条件,确保结论不依赖于特定初值。
在实际生产环境中验证控制器修改方案时,一定要先做离线仿真,再在测试环境验证,最后才上生产设备。涉及参数调整时,备份原有参数,记录修改前后的响应曲线,遵循最小权限和可回滚原则。
7.4 非线性系统分析方法的选型
描述函数法并不是非线性分析唯一的选择。对于二阶系统或者可以降阶到二阶的系统,相平面法更直观,能完整地看到相轨迹和极限环;对于需要严格稳定性的系统,李雅普诺夫法更严谨;对于频率域工程分析,描述函数法最方便。实际工程中,建议先用描述函数法做快速估算,再用仿真工具精细分析,最后用实验数据修正模型参数。不同方法之间是互补关系,不是替代关系。
8. 总结与学习路线
本文围绕本质非线性专题,重点梳理了死区、饱和、间隙、继电四类典型特性,讲解了描述函数法的谐波线性化思想、常见非线性的描述函数公式以及负倒描述函数在稳定性判断中的作用,并通过一个理想继电系统例题,完整走了一遍自持振荡频率和幅值的计算流程。最后给出了 Python 和 MATLAB 仿真代码,帮助你把公式转化为可验证的结果。你读完应该已经掌握了:识别典型本质非线性、写出分段表达式、计算常用描述函数、判断系统稳定性、估算自持振荡参数这一套完整技能。
下一步可以继续学习的内容有三个方向:一是相平面法,用于观察二阶非线性系统的完整相轨迹;二是李雅普诺夫稳定性分析,用于处理描述函数法不适用的严格稳定性问题;三是非线性补偿与非线性控制器设计,比如死区补偿、间隙补偿、滑模控制和反步控制。如果这些内容都能掌握,整个非线性控制系统分析的知识框架就基本完整了。
学习这部分时,比较推荐的做法是“公式 + 仿真”结合。每学一种非线性特性,就在 Python 或 Simulink 里把输入输出曲线画出来,把描述函数曲线画出来,再看闭环响应与实际分析的差异。只有亲手调整参数、亲手重现极限环,才能真正理解非线性系统为什么和线性系统如此不同。
如果这篇文章对你有帮助,可以收藏备用,后面复习或做课程设计时直接翻出来对照。下一篇可以考虑继续整理相平面法的完整实战,或者用典型案例分析非线性系统校正设计。有问题欢迎在评论区一起讨论,互相交流排错思路比单看教材更容易进步。