系统相图及MATLAB绘制方法

自治系统

许多动态系统的物理规律可以用常微分方程描述。对于一般的(非线性时变)系统,微分方程为如下形式:

其中是系统状态,是外部输入信号,表示系统运行规律随时间变化。如果没有外部输入信号,而且与时间无关,则变成如下形式:

这样的系统称为自治系统(autonomous system)或时不变系统(time-invariant system)。

相图及绘制原理

二阶自治系统在系统分析中有重要的地位,因为方程的解可以表示为平面上的曲线,也就是相图(phase portrait),相图是控制理论中分析非线性系统的重要工具。将写成如下形式:

是方程的解,初值条件为。解平面上的轨迹就是一条经过点的曲线,这有点类似于参数方程的图像。

方程的右边正好是梯度,由此可以得到曲线上某点的切线方向,因此,是平面的向量场(vector field)。先画出向量场,从某初值点出发,选择合适的步长沿着梯度方向绘制一条轨迹,即对应方程在该初值条件下的解。选择多个初始点,绘制多条轨迹以足够展示系统的特征,即得到相图。

MATLAB绘制方法

有了上面的方法,可以用熟悉的软件绘制相图,但想画得美观并不容易。本文以MATLAB为例,绘制一个简单线性系统的相图,系统微分方程为:

绝大多数非线性微分方程难以求出解析解,实际中一般计算其数值解,系统的解析解虽然容易得到,但为了保持一般性,我们还是求它的数值解。首先要创建一个函数表示该系统,供后续ode45函数调用:

1
2
3
function dxdt = simple(t, x)
dxdt = [-x(1) + x(2); -x(2)]; % 将(4)式表示为向量形式
end

通过如下代码画出系统的向量场:

1
2
3
4
5
6
7
% 合理选择坐标轴范围,让图形直观美观
[X1, X2] = meshgrid(-2:0.2:2, -2:0.2:2);
% 根据(3)式右边的f(x)计算梯度
X1dot = -X1 - X2;
X2dot = -X2;
% 用quiver函数画向量场,会自动调节箭头大小
quiver(X1, X2, X1dot, X2dot)

箭头表示梯度的方向和大小,所以从向量场就能大致看出该系统相图的特征,然后选取合适的初值点,绘制多条相轨迹。本例中,很容易看出,从任何点出发的轨迹最终都会汇聚到坐标原点,原点的梯度为零,是平衡点(equilibrium point)。选取左上角的点为初值点,如下代码求出微分方程的数值解,并将轨迹绘制到向量场上:

1
2
3
4
x0 = [-2, 2];
tspan = [0:0.1:10]; % 时间范围要稍微选大点,不然离极限值太远
[~, x] = ode45(@simple, tspan, x0);
hold on; plot(x(:, 1), x(:, 2))
系统的向量场和一条轨迹

本例中,可以在图像的边缘等间隔取一些初值点,绘制多条轨迹得到相图,如下图所示:

系统的相图

很容易从相图看出,系统是渐进稳定的(asymptotically stable)。上面的图相当漂亮,这样的话,课件中的图形质量就有保障了。

参考资料

  1. Autonomous system
  2. Nonlinear Systems - Khalil
  3. Phase portrait - Wikipedia
  4. AN INTRODUCTION TO PHASE PORTRAITS