Python Control Systems Library 为反馈控制系统的设计与验证提供了完整的工具链。本文聚焦该库在非线性领域的两大核心能力——相轨迹可视化与描述函数频域近似,帮助工程师建立对复杂非线性行为的直观认知。
相轨迹:二阶系统的几何直观
相平面法将二阶系统的两个状态变量映射为平面坐标,通过轨迹的几何形态揭示稳定性、极限环与吸引域等本质特征。Python Control 的
control.phaseplot 子模块封装了完整的绘制管线,支持向量场、积分曲线、奇点及分隔线的多层叠加渲染。
阻尼振子的相轨迹绘制
以下示例重构了标准阻尼振子的相轨迹分析,采用参数化方式定义系统并自定义初始条件网格:
import numpy as np
import control as ct
import control.phaseplot as pp
import matplotlib.pyplot as plt
def pendulum_dynamics(t, state, p):
ζ = p.get('damping', 0.6)
ω = p.get('nat_freq', 1.0)
return [state[1], -2*ζ*ω*state[1] - ω**2*state[0]]
plant = ct.NonlinearIOSystem(
updfcn=pendulum_dynamics,
inputs=0, outputs=2, states=2,
params={'damping': 0.6, 'nat_freq': 1.0}
)
pp.phase_plane_plot(
plant,
pointdata=[-3, 3, -3, 3],
gridtype='meshgrid',
gridspec=[12, 12],
vectfield=True,
streamlines=True,
equilpoints=True
)
plt.title('Underdamped Oscillator Phase Portrait')
plt.xlabel('Displacement')
plt.ylabel('Velocity')
执行后得到包含向量场与流线的相平面图,螺旋收敛至原点的轨迹清晰反映了欠阻尼特性。
相轨迹的核心构成要素
- 向量场:各状态点处的切向方向与相对速率的直观表示
- 积分曲线:从指定初态出发的时间演化轨迹
- 奇点:状态导数为零的平衡位置,其邻域线性化特征决定局部稳定性
- 分隔线:划分不同定性行为区域的临界轨线
描述函数:频域近似分析框架
描述函数法将无记忆非线性环节等效为输入幅值依赖的复增益,使Nyquist判据得以拓展应用于非线性闭环。该方法成立的前提是线性部分具备充分的低通滤波能力,以抑制高次谐波分量。
典型非线性特性库
control.descfcn 内置了工程常见的非线性模型:
| 非线性类型 | 构造函数 | 关键参数 |
| 饱和特性 | saturation_nonlinearity | 线性区宽度 |
| 死区特性 | deadzone_nonlinearity | 死区阈值 |
| 间隙特性 | friction_backlash_nonlinearity | 间隙宽度 |
| 继电器滞环 | relay_hysteresis_nonlinearity | 阈值与滞环宽度 |
饱和非线性系统的稳定性判据
以下示例演示了描述函数法的完整分析流程,包括负倒数曲线与Nyquist曲线的交互判稳:
import numpy as np
import control as ct
from control.descfcn import saturation_nonlinearity
import matplotlib.pyplot as plt
# 线性被控对象:二阶积分加惯性
G = ct.tf([4], [1, 1.2, 1])
# 单位饱和非线性
nl = saturation_nonlinearity(limit=1.0)
# 振幅扫描
amplitudes = np.logspace(-1, 1, 200)
describing_gains = np.array([nl.describing_function(a) for a in amplitudes])
neg_inv_locus = -1.0 / describing_gains
# 频域响应
ω = np.logspace(-2, 2, 1000)
Gjw = G(ω * 1j)
plt.figure(figsize=(8, 8))
ct.nyquist(G, omega=ω, plot=True, color='C0')
plt.plot(np.real(neg_inv_locus), np.imag(neg_inv_locus), 'r--', linewidth=2)
plt.plot(np.real(neg_inv_locus), -np.imag(neg_inv_locus), 'r--', linewidth=2)
plt.xlim(-5, 2)
plt.ylim(-4, 4)
plt.legend(['Linear Part Nyquist', 'Nonlinearity -1/N'])
两曲线交点预示潜在的自持振荡,其坐标对应振荡幅值与频率的近似估计。需结合时域仿真验证该周期解的稳定性。
工程实践要点
倒立摆的相平面分岔分析
旋转倒立摆作为强非线性对象,其相轨迹呈现丰富的拓扑结构。上驻点与下驻点附近的局部行为差异、异宿轨道的存在性,均可通过
phaseplot 模块进行可视化探究。参考实例路径:
examples/phase_plane_plots.py 中包含了完整的建模与参数化分析。
执行器饱和的前馈-反馈设计
实际伺服系统中,驱动器饱和常引发积分 wind-up 与稳定性退化。描述函数法可在频域预估极限环特性,指导抗饱和补偿器的参数整定。测试用例集
control/tests/descfcn_test.py 覆盖了多种典型场景,可作为自定义非线性分析的基准。
方法论的适用边界
描述函数法的有效性受限于双重假设:线性环节的低通特性与非线性环节的无记忆性。对于含显著动态滞环或高频谐波不可忽略的情形,建议采用相轨迹数值积分或Lyapunov直接法作为补充验证手段。