1. 相平面分析的核心价值与工程意义
相平面法作为非线性系统分析的经典工具,在控制工程领域已经应用了超过半个世纪。我第一次接触这个概念是在调试一台老式伺服电机时——当传统频域分析方法无法解释系统出现的异常振荡时,相平面图清晰地展示了系统状态轨迹如何在不同初始条件下收敛到极限环。这种直观的几何表示法,让复杂的动态行为变得肉眼可见。
相平面的横纵坐标通常分别代表系统误差e(t)及其导数ė(t),构成所谓的"状态空间"。通过绘制状态轨迹,我们可以直接观察到:
- 系统是否稳定(轨迹是否收敛于原点)
- 超调量大小(轨迹在垂直方向的最大偏移)
- 稳态误差(收敛点是否偏离原点)
- 是否存在极限环(闭合的环形轨迹)
这种分析方法特别适合二阶非线性系统,比如带有饱和特性的PID控制器、存在死区的液压系统等。在自动驾驶的横向控制、机器人关节定位等场景中,我经常用它来快速验证控制算法的鲁棒性。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 典型非线性系统的相轨迹绘制
2.1 带死区的继电器系统
考虑一个经典案例:温度控制系统中的继电器控制器,其数学描述为:
code复制u(e) = { +M, e > Δ
{ 0, |e| ≤ Δ
{ -M, e < -Δ
其中Δ=0.5为死区宽度,M=1为输出幅值。被控对象为二阶惯性环节1/(s²+s+1)。
手工绘制步骤:
-
将系统转化为状态方程形式:
ẋ₁ = x₂
ẋ₂ = -x₁ - x₂ + u(x₁) -
按输入u的不同取值分区讨论:
- 当x₁ > 0.5时,u=1,求解微分方程得到轨迹方程
- 当|x₁| ≤ 0.5时,u=0,此时系统退化为线性
- 当x₁ < -0.5时,u=-1,与第一象限对称
-
在MATLAB中验证:
matlab复制% 定义分段函数
u = @(x) 1*(x>0.5) + 0*(abs(x)<=0.5) -1*(x<-0.5);
% 绘制相轨迹
f = @(t,x) [x(2); -x(1)-x(2)+u(x(1))];
for x0 = -2:0.5:2
for dx0 = -2:0.5:2
[t,x] = ode45(f,[0 10],[x0 dx0]);
plot(x(:,1),x(:,2)); hold on
end
end
xline(0.5,'--'); xline(-0.5,'--'); % 标记死区边界
工程启示:
- 死区会导致系统在原点附近出现"粘滞"现象
- 轨迹在|e|<Δ区域内沿抛物线滑动
- 可通过增大M或减小Δ来改善响应速度,但需权衡噪声敏感性
2.2 饱和非线性系统分析
某电机位置控制系统存在输出饱和:
code复制u(e) = { K*e, |e| < e_max
{ K*e_max, e ≥ e_max
{ -K*e_max, e ≤ -e_max
取K=2,e_max=1,对象传递函数为1/(0.5s²+s)。
关键观察点:
-
线性区内(|e|<1):
- 特征根为-1±j√7,对应螺旋收敛轨迹
- 阻尼比ζ=0.27,预计有显著超调
-
饱和区(|e|≥1):
- 系统退化为ẍ = -2ẋ ± 2
- 相轨迹变为抛物线簇
实操技巧:在Simulink中设置Saturation模块时,建议启用"Linear region specification"选项,可以自动生成分区解析式,避免手动编写switch-case逻辑。
3. 极限环现象的判别与处理
3.1 描述函数法应用示例
对于具有理想继电器特性的系统:
code复制u(e) = M*sign(e)
被控对象为G(s)=10/(s(s+1)(s+2))。
描述函数法步骤:
- 计算继电器描述函数N(A) = 4M/(πA)
- 令1/N(A) = -G(jω),解算振幅A和频率ω
- 绘制G(jω)曲线和-1/N(A)曲线
- 交点处即为预测的极限环参数
MATLAB实现:
matlab复制w = logspace(-1,1,1000);
G = 10./(1j*w.*(1j*w+1).(1j*w+2));
A = linspace(0.1,10,100);
Ninv = -pi*A/(4*1); % M=1
figure;
plot(real(G),imag(G),'b',Ninv,0*A,'r');
axis equal; grid on;
实测数据对比:
- 理论预测:ω=1.414 rad/s, A=1.25
- 仿真结果:ω=1.38 rad/s, A=1.19
- 误差主要来自高频谐波忽略
3.2 工程调整策略
在某型无人机舵机系统中观测到极限环后,我们通过以下措施消除振荡:
- 在继电器前增加死区(Δ=0.1→0.3)
- 使-1/N(A)曲线右移,脱离G(jω)包围
- 并联速度反馈(增加0.2s/(0.1s+1))
- 改变G(jω)形状,避免交点
- 最终采用PWM调制替代继电器
- 从根本上消除描述函数成立条件
避坑指南:描述函数法要求系统具有低通特性(对象阶次比非线性高2阶以上),在分析电机+齿轮间隙这类问题时需格外注意适用条件。
4. 分段线性系统的拼接技巧
4.1 状态空间连续性验证
以碰撞系统为例:
code复制ẍ = { -kx - cẋ, x > 0 (弹簧受压)
{ -kx, x ≤ 0 (弹簧分离)
需确保在x=0边界处:
- 位置x连续
- 速度ẋ连续
- 加速度ẍ可能突变
拼接步骤:
- 分别求解两个区域的解析解
- 记录轨迹首次穿越边界的时间t*
- 以t*时刻的状态作为新初始条件
- 切换微分方程继续求解
matlab复制function dxdt = piecewiseSys(t,x)
if x(1) > 0
dxdt = [x(2); -2*x(1)-0.5*x(2)];
else
dxdt = [x(2); -2*x(1)];
end
end
% 使用事件检测确保精确切换
options = odeset('Events',@(t,x) events(t,x));
[t,x,te] = ode45(@piecewiseSys,[0 10],[1 0],options);
function [value,isterminal,direction] = events(t,x)
value = x(1); % 触发条件:x=0
isterminal = 0; % 不停止积分
direction = -1; % 仅检测从正到负
end
4.2 工程应用实例
某车辆悬架系统的双刚度弹簧特性:
- 小位移时刚度k1=2000 N/m
- 大位移时附加k2=5000 N/m激活
- 阻尼比ζ=0.3保持不变
建模要点:
- 在Simulink中使用Hit Crossing检测位移阈值
- 采用Stateflow管理多刚度模式切换
- 实测表明:相轨迹在切换面处斜率突变,但整体连续
- 通过调整k2激活阈值可优化乘坐舒适性
5. 数值计算中的实用技巧
5.1 步长自适应策略
在计算含快速切换的系统时,固定步长会导致:
- 过零检测不精确(最大误差达步长量级)
- 能量守恒被破坏(特别是碰撞问题)
推荐方案:
- 初始步长设为系统最小时间常数的1/10
- 启用ode45的Refine选项(默认值4)
- 对刚性系统换用ode15s
- 重要区域局部加密:
matlab复制tspan = [0 10];
tspan_refined = sort([tspan linspace(2,3,100)]);
5.2 可视化增强方法
除了基本相轨迹图外,建议:
- 叠加等倾线簇:
matlab复制[x1,x2] = meshgrid(-3:0.2:3,-3:0.2:3);
dx1 = x2;
dx2 = -x1 -0.5*x2.*abs(x2); % 含平方阻尼
quiver(x1,x2,dx1,dx2,0.5,'Color',[0.8 0.8 0.8]);
- 标注特征点(平衡点、切换面)
- 使用颜色表示Lyapunov函数值
- 制作轨迹动画:
matlab复制writerObj = VideoWriter('phase_portrait.avi');
open(writerObj);
for k = 1:length(t)
plot(x(1:k,1),x(1:k,2),'b');
frame = getframe(gcf);
writeVideo(writerObj,frame);
end
close(writerObj);
在最近参与的机械臂碰撞检测项目中,我们通过相平面分析成功识别出末端执行器接触物体时的特征轨迹突变,这比传统力矩阈值法提前约50ms检测到碰撞。这种基于动态特性的分析方法,为安全控制争取了宝贵的时间裕度。
