动态系统相图及MATLAB绘制方法
自治系统
许多动态系统的物理规律可以用常微分方程描述。对于一般的(非线性时变)系统,微分方程为如下形式:
\[ \dot{\mathbf{x}} = \mathbf{f}(t,\mathbf{x}, \mathbf{u}) \tag{1} \]
其中\(\mathbf{x}\)是系统状态,\(\mathbf{u}\)是外部输入信号,\(t\)表示系统运行规律随时间变化。如果没有外部输入信号,而且\(\mathbf{f}\)与时间\(t\)无关,则\((1)\)变成如下形式: \[ \dot{\mathbf{x}} = \mathbf{f}(\mathbf{x}) \tag{2} \]
这样的系统称为自治系统(autonomous system)或时不变系统(time-invariant system)。
相图及绘制原理
二阶自治系统在系统分析中有重要的地位,因为方程的解可以表示为平面上的曲线,也就是相图(phase portrait),相图是控制理论中分析非线性系统的重要工具。将\((2)\)写成如下形式: \[ \begin{cases} \dot{x}_1(t) = f_1(x_1, x_2) \\ \dot{x}_2(t) = f_2(x_1, x_2) \end{cases} \tag{3} \]
令\(\mathbf{x}(t) = \left[x_1(t), x_2(t) \right]^{\mathsf{T}}, t\ge 0\)是方程\((3)\)的解,初值条件为\(\mathbf{x}(0) = \left[x_{10}, x_{20} \right]^{\mathsf{T}}\)。解\(\mathbf{x}(t)\)在\(x_1 - x_2\)平面上的轨迹就是一条经过点\(\mathbf{x}(0)\)的曲线,这有点类似于参数方程的图像。
方程\((3)\)的右边正好是\(\mathbf{x}(t)\)的梯度\(\left[\dot{x}_1(t), \dot{x}_2(t) \right]^{\mathsf{T}}\),由此可以得到\(\mathbf{x}(t)\)曲线上某点的切线方向,因此,\(\mathbf{f} = \left[f_1, f_2 \right]^{\mathsf{T}}\)是平面的向量场(vector field)。先画出向量场,从某初值点出发,选择合适的步长沿着梯度方向绘制一条轨迹,即对应方程在该初值条件下的解。选择多个初始点,绘制多条轨迹以足够展示系统的特征,即得到相图。
MATLAB绘制方法
有了上面的方法,可以用熟悉的软件绘制相图,但想画得美观并不容易。本文以MATLAB为例,绘制一个简单线性系统的相图,系统微分方程为: \[ \begin{cases} \dot{x}_1 = -x_1 + x_2 \\ \dot{x}_2 = -x_2 \end{cases} \tag{4} \]
绝大多数非线性微分方程难以求出解析解,实际中一般计算其数值解,系统\((4)\)的解析解虽然容易得到,但为了保持一般性,我们还是求它的数值解。首先要创建一个函数表示该系统,供后续ode45
函数调用:
1 | function dxdt = simple(t, x) |
通过如下代码画出系统的向量场:
1 | % 合理选择坐标轴范围,让图形直观美观 |
箭头表示梯度的方向和大小,所以从向量场就能大致看出该系统相图的特征,然后选取合适的初值点,绘制多条相轨迹。本例中,很容易看出,从任何点出发的轨迹最终都会汇聚到坐标原点,原点的梯度为零,是平衡点(equilibrium point)。选取左上角的点为初值点,如下代码求出微分方程的数值解,并将轨迹绘制到向量场上:
1 | x0 = [-2, 2]; |
本例中,可以在图像的边缘等间隔取一些初值点,绘制多条轨迹得到相图,如下图所示:
很容易从相图看出,系统是渐进稳定的(asymptotically stable)。上面的图相当漂亮,这样的话,课件中的图形质量就有保障了。