当大多数人开始使用 MATLAB 或 Simulink 时,他们总是讨厌它。我看到的主要原因是人们对 MATLAB 的教导很差,这使他们无法理解 MATLAB 的强大功能以及何时应该使用它。
在我开始描述 MATLAB 工作区、m 文件和 Simulink 之间的关系之前,让我们首先定义它们各自的区别以及您可以用它们做的一些事情。
MATLAB 工作区
MATLAB workspace 包含您在 MATLAB 中通过命令窗口显式创建或通过运行 .m 文件隐式创建的 所有 变量(不要担心我会回到这些)。将变量添加到 MATLAB 工作区的最简单方法是直接在命令窗口中键入,例如
>> A = 1
A =
1
将变量A 添加到工作区并为其分配值1。更简单的是简单类型1 like
>> 1
ans =
1
将变量ans 添加到值为1 的工作区。 MATLAB 执行的任何未明确分配给变量的命令的默认工作区variable是ans。
MATLAB 中的工作区浏览器显示有关当前工作区中所有变量的信息。例如,如果我们要在命令窗口中执行,
>> A = 5;
>> B = [6 8];
>> C = [3 6 7; 9 11 12];
>> D = eye(max(size(C)));
工作区浏览器看起来像
一些有用的工作区命令
save 和 clear 命令是与 MATLAB 工作区一起使用的有用命令。 save 允许您将变量从工作区保存到文件中,而clear 允许您从工作区中删除变量,从而释放内存。 clear all 将清除工作区中的所有变量。
m 文件
m-file(或脚本文件)是一个带有.m 文件扩展名的简单文本文件。您可以在其中键入 MATLAB 命令,这些命令可以通过在命令窗口中执行 m-file 来顺序执行。例如,让我们从上面复制我们的命令并将它们粘贴到名为mfile_test.m 的m-file 中。现在让我们将命令C - A 添加到m-file 的底部(注意 不要在命令后附加;)。我们可以从命令窗口执行这个m-file,并查看其中所有命令按顺序执行的输出
>> mfile_test.m
ans =
-2 1 2
4 6 7
m 文件和函数
m 文件也可以包含functions。例如,我们可以编写一个函数来计算圆的面积和周长,例如
function [A, C] = circle(r)
A = pi*r*r;
C = 2*pi*r;
end
并将其放入名为circle.m 的m-file 中。然后我们可以像这样使用它
>> circle(5)
ans =
78.5398
其中ans 现在包含半径为5 的圆的面积或
>> [A, C] = circle(5)
A =
78.5398
C =
31.4159
其中A 保存圆的面积,C 保存圆周。
Simulink 模型
Simulink 是一种图形工具,可用于对各种不同类型的系统进行建模以及对动态系统行为进行建模。 Simulink 紧密嵌入到 MATLAB 生态系统中,这为其增加了额外的功能(稍后我将在描述相似之处时再次谈到这一点)。
Simulink 模型包含的模块都表现出不同的行为。如果需要,还可以创建自己的 Simulink 模块。 Simulink 中的模型是通过连接不同类型的模块来模拟您要建模的系统。
Simulink 相当广泛,我不建议您自学。学习 Simulink 的最佳方式总是作为课程的一部分,控制系统或系统分析类型的课程非常适合此目的。出于这个原因,我不打算在这里讨论太久了。
MATLAB 工作区、m 文件和 Simulink 有何关联?
好吧,m 文件和 Simulink 都可以使用 MATLAB 工作区。 MATLAB 工作区中的变量可以在m 文件和 Simulink 中使用。
m 仅包含脚本(而非函数)的文件会将其中创建的每个变量写入 MATLAB 工作区。 m 仅包含函数的文件不会将这些函数中使用的任何 new 变量写入 MATLAB 工作区。函数更改 MATLAB 工作区中的变量的唯一方法是将输出值分配给 ans,或者在调用函数时显式声明 output arguments。
Simulink 和 MATLAB 工作区与 m 文件和 MATLAB 工作区的关系非常相似。 MATLAB 工作区中的任何变量都可在 Simulink 中使用(在任何部分,包括配置)。例如在下面的配置中,我使用 MATLAB 工作区变量start_time、stop_time 和step_time 来设置模型的参数。通常,在使用 sim() 运行 Simulink 模型之前,我会在 m-file 中定义这些。这就是我们可以将所有 3 个联系在一起的方式。
Simulink 可以通过将输出参数添加到 sim() 命令来将变量写入 MATLAB 工作区。但是,正如您发现的那样,导航和提取您真正想要的内容可能会非常讨厌!更好的方法是使用 Simulink 中的 Data Import/Export 选项和 To Workspace 块来获取您关心的输出,这样您就可以忽略其他所有内容。
下面是 Simulink Data Import/Export 窗格的屏幕截图。您可以在此处看到我们将变量发送到 MATLAB 工作区的选项。通常,您需要的最常见的是tout,它将是前面配置窗格中start_time:step_time:stop_time 给出的范围。此屏幕中主要感兴趣的其他区域是 xInitial 和 xout,它们用于根轨迹分析。
但是,除了 Simulink 中最好的模块之一之外,还有 To Workspace 模块。此模块可用于将变量直接存储在 MATLAB 工作区中,并且是能够链接 MATLAB 和 Simulink 的关键之一。您可以获得 Simulink 的强大功能,以及 MATLAB 的计算和绘图能力。我在下面包含了它的屏幕截图以及我将使用的典型配置。此块的默认Save Format 是Timeseries,但是,我建议将其更改为Array,因为它会让您的生活更轻松。
好吧,我在哪里?我觉得我是在讲课而不是写答案!
实用说明
Simulink 模型
现在让我们通过一个简单的示例将我们学到的所有知识付诸实践。首先我们要像这样创建一个简单的 Simulink 模型
现在我们将为此设置我们的配置,就像之前的 Solver 部分一样
我们还将取消选中 Data Import/Export 部分中的 Limit data points to last:
而且,就是这样。我们简单的 Simulink 模型已经创建和设置。 出于此答案的目的,我将我的保存为stackoverflow_model.slx。
MATLAB 脚本
现在我们将创建一个名为 stackoverflow_script.m 的简单 MATLAB 脚本 (m-file),它将通过将变量添加到 MATLAB 工作区来为我们的 Simulink 模型设置必要的变量。然后,我们将调用 Simulink 模型并检查它添加到工作区的新变量。最后,我们将生成一个简单的图表来展示这种方法的好处。
这是 MATLAB 脚本
% Script developed to describe the relationship between the MATLAB
% workspace, m-files and Simulink
close all
clear all
% Initialise variables
start_time = 0;
stop_time = 10;
step_time = (stop_time - start_time) / 1000; % Creates 1000 + 1 points
% Choose k
k = 60;
% Execute Simulink model
sim('stackoverflow_model');
whos % To display variables returned from Simulink
% Plot results
figure;
plot(tout, yout, 'r');
title('Sample Plot');
xlabel('Time (s)');
ylabel('Output');
把它们放在一起
现在我们在命令窗口中使用stackoverflow_script 执行此脚本,然后坐下来惊叹 MATLAB 和 Simulink 结合的POWER。
>> stackoverflow_script
Name Size Bytes Class Attributes
k 1x1 8 double
start_time 1x1 8 double
step_time 1x1 8 double
stop_time 1x1 8 double
tout 1001x1 8008 double
yout 1001x1 8008 double
我们可以从上面的输出中看到 Simulink 需要的所有变量(k、start_time、step_time 和 stop_time)都在 MATLAB 工作区中。我们还可以看到 Simulink 向 MATLAB 工作区 tout 和 yout 添加了 2 个 新 变量,它们是简单的 1001x1 双精度向量。没有讨厌的structs 导航。
最后,这产生了一个很好的情节
至此,我们的 MATLAB、m 文件和 Simulink 之旅就这样结束了!我希望你和我写它一样喜欢它!
P.S.我没有检查拼写或语法错误,所以非常欢迎编辑;)