控制系统/MATLAB
此页面将非常受益于一些关于各种系统的屏幕截图。鼓励拥有 MATLAB 或 Octave 的用户为这里的系统制作一些屏幕截图。 |
MATLAB 是一种专门为矩阵操作而设计的编程语言。由于其强大的计算能力,MATLAB 是许多控制工程师设计和模拟控制系统的首选工具。本页将讨论使用 MATLAB 进行控制系统设计和分析。MATLAB 有许多名为“工具箱”的插件模块。下面描述的几乎所有函数都位于 控制系统工具箱 中。如果您的系统安装了控制系统工具箱,您可以在 MATLAB 提示符下键入 help control
以获取有关该工具箱的更多信息。
此外,还有一个名为 Octave 的 MATLAB 开源竞争对手。Octave 与 MATLAB 类似,但也有一些区别。本页将重点介绍 MATLAB,但可以添加另一页来重点介绍 Octave。截至 2006 年 9 月 10 日,下面列出的所有 MATLAB 命令都已在 GNU octave 中实现。
本页将使用 {{MATLAB CMD}} 模板来显示可用于执行不同任务的 MATLAB 函数。
MATLAB 是 The Mathworks 生产的版权产品。有关 MATLAB 和 The Mathworks 的更多信息,请参阅 控制系统/资源.
在 MIMO 系统中,通常隔离单个输入-输出对以进行分析非常重要。每个输入对应于 B 矩阵中的一行,每个输出对应于 C 矩阵中的一列。例如,要隔离第二个输入和第三个输出,我们可以创建一个系统
sys = ss(A, B(:,2), C(3,:), D);
本页将把这种技术称为“输入-输出隔离”。
首先,让我们看一下经典方法,使用以下系统
此系统实际上可以建模为两个系数向量 NUM 和 DEN
NUM = [5, 10] DEN = [1, 4, 5]
现在,我们可以使用 MATLAB step 命令来生成此系统的阶跃响应
step(NUM, DEN, t);
其中 t 是一个时间向量。如果您没有在左侧提供结果,阶跃函数将自动生成阶跃响应的图形图。但是,如果您使用以下格式
[y, x, t] = step(NUM, DEN, t);
那么 MATLAB 不会自动生成图,您将不得不自己生成一个。
这是一个示例屏幕截图
-
阶跃响应
现在,让我们看一下现代状态空间方法。如果我们有矩阵 A、B、C 和 D,我们可以将它们代入阶跃函数,如下所示
step(A, B, C, D);
或者,我们可以选择包括时间向量 t
step(A, B, C, D, t);
同样,如果我们在等式的左侧提供结果,MATLAB 不会自动为我们生成图。
如果我们没有得到自动生成的图,并且我们想要生成自己的图,我们键入
[y, x, t] = step(NUM, DEN, t);
然后我们可以使用 plot 命令创建图形
plot(t, y);
y 是阶跃响应的输出幅值,而 x 是来自状态空间方程的系统的内部状态
MATLAB 包含可用于从拉普拉斯表示自动转换为状态空间表示的功能。此函数 tf2ss 的使用方法如下
[A, B, C, D] = tf2ss(NUM, DEN);
其中 NUM 和 DEN 分别是传递函数的分子和分母的系数向量。
类似地,我们可以使用 ss2tf 函数从拉普拉斯域转换回状态空间表示,如下所示
[NUM, DEN] = ss2tf(A, B, C, D);
或者,如果我们有多个输入在一个向量 u 中,我们可以将其写成如下
[NUM, DEN] = ss2tf(A, B, C, D, u);
当我们的系统有多个输入时,必须提供 u 参数,但如果我们只有一个输入,则不需要提供 u 参数。这种形式的等式为每个单独的输入生成一个传递函数。NUM 和 DEN 成为二维矩阵,每行都是每个不同输入的系数。
现在让我们考虑一个具有以下在 Z 域中的一般传递函数的数字系统
其中 n(z) 和 d(z) 分别是传递函数的分子和分母多项式。filter 命令可用于将输入向量 x 应用于滤波器。输出 y 可以从以下代码获得
y = filter(n, d, x);
在这个例子中,单词“filter”可能有点用词不当,但事实仍然是,这是将输入应用于数字系统的方法。获得输出幅值向量后,我们可以使用 plot 命令绘制它
plot(y);
要获得数字系统的阶跃响应,我们必须首先使用 ones 命令创建一个阶跃函数
u = ones(1, N);
其中 N 是我们想要在数字系统中采样的样本数量(不要与“n”混淆,我们的分子系数)。生成单位阶跃函数后,我们可以将此函数通过数字滤波器传递,如下所示
y = filter(n, d, u);
我们可以绘制 y
plot(y);
同样,我们也可以分析状态空间表示中的数字系统。如果我们有以下数字状态关系
我们可以使用上面用过的 ss2tf 函数自动转换为脉冲响应。
[NUM, DEN] = ss2tf(A, B, C, D);
然后,我们可以使用准备好的单位阶跃序列向量 u 对其进行滤波。
y = filter(num, den, u)
这将给出我们状态空间表示的数字系统的阶跃响应。
根轨迹图
[edit | edit source]MATLAB 提供了一个实用的自动工具,用于根据传递函数生成根轨迹图:rlocus 命令。在传递函数域或状态空间域中,我们有以下函数的使用方法。
rlocus(num, den);
和
rlocus(A, B, C, D);
这些函数将自动生成系统的根轨迹图。但是,如果我们提供左边的参数
[r, K] = rlocus(num, den);
或者
[r, K] = rlocus(A, B, C, D);
该函数不会自动生成图形,您需要自己生成图形。还可以提供一个可选的增益 K 参数。
rlocus(num, den, K);
或者
rlocus(A, B, C, D, K);
如果未提供 K,MATLAB 将为您提供自动增益值。
获得 [r, K] 值后,可以绘制根轨迹。
plot(r);
rlocus 命令不能用于 MIMO 系统,因此如果您的系统是 MIMO 系统,则必须将系数矩阵分开以隔离每个单独的输入输出对,并分别绘制每个对。
这是一个示例屏幕截图
-
根轨迹
数字根轨迹
[edit | edit source]为数字系统创建根轨迹图与为连续系统创建根轨迹图完全相同。唯一的区别是结果的解释,因为数字系统的稳定区域与连续系统的稳定区域不同。可以使用相同的 rlocus 函数,使用方法与上面相同。
伯德图
[edit | edit source]MATLAB 还提供了一些工具来检查系统的频率响应特性,既可以使用伯德图,也可以使用奈奎斯特图。要根据传递函数构建伯德图,请使用以下命令
[mag, phase, omega] = bode(NUM, DEN, omega);
或者
[mag, phase, omega] = bode(A, B, C, D, u, omega);
其中“omega”是分析幅度和相位响应点的频率向量。如果要将幅度数据转换为分贝,可以使用以下转换
magdb = 20 * log10(mag);
现在应该足够了解这种转换,无需解释。
当讨论以分贝为单位的伯德图时,使用对数频率尺度是最有意义的(也是最常见的)。要创建 omega 中的对数序列,请使用 logspace 命令,如下所示
omega = logspace(a, b, n);
此命令生成 n 个点,从 到 对数间隔。
如果在没有左手参数的情况下使用 bode 命令,MATLAB 将自动生成伯德相位和幅度图的图形。
bode 命令如果与 MIMO 系统一起使用,将使用子图在单个绘图窗口中生成所有输入输出关系图。对于具有多个输入和多个输出的系统,这可能难以看清。在这种情况下,通常最好将系数矩阵分开以隔离每个单独的输入输出对。
这是一个示例屏幕截图
-
伯德图(频率响应)
奈奎斯特图
[edit | edit source]除了伯德图外,我们还可以使用 nyquist 命令创建奈奎斯特图。nyquist 命令的操作方式类似于 bode 命令(以及我们迄今为止使用过的其他命令)
[real, imag, omega] = nyquist(NUM, DEN, omega);
或者
[real, imag, omega] = nyquist(A, B, C, D, u, omega);
这里,“real”和“imag”是包含奈奎斯特图每个点的实部和虚部的向量。如果我们不提供右手参数,nyquist 命令会自动为我们生成奈奎斯特图。
与 bode 命令一样,nyquist 命令将使用子图在一个绘图窗口中显示 MIMO 系统的输入输出关系。如果有多个输入输出对,可能难以看到各个图形。
这是一个示例屏幕截图
-
奈奎斯特图
李雅普诺夫方程
[edit | edit source]可控性
[edit | edit source]可以使用 ctrb 命令构造可控性矩阵。可以使用 gram 命令构造可控性格拉姆矩阵。
可观测性
[edit | edit source]可以使用 obsv 命令构造可观测性矩阵。
经验格拉姆矩阵
[edit | edit source]可以为线性控制系统和非线性控制系统计算经验格拉姆矩阵。经验格拉姆矩阵框架 emgr 允许计算可控性、可观测性和交叉格拉姆矩阵;它与 MATLAB 和 OCTAVE 兼容,并且不需要控制系统工具箱。
进一步阅读
[edit | edit source]- Ogata, Katsuhiko,“用 MATLAB 解决控制工程问题”,Prentice Hall,新泽西州,1994 年。 ISBN 0130459070
- MATLAB 编程.
- http://octave.sourceforge.net/
- ControlTheoryPro.com 上的 MATLAB 类别
- 经验格拉姆矩阵框架