工作区、.m 脚本和 Simulink 模型之间的关系是什么?如何有效地使用它们?

What are the relationships between workspace, .m scripts and Simulink models and how can I use them efficiently?

我在控件中使用了很多 MATLAB class,有些事情真的让我很沮丧。他们希望我们使用大量的 Simulink,尽管我发现视觉表示没有那么有用,而且 Simulink 和 MATLAB 脚本之间的接口通常很难理解。

所以我有一个模型,我为 sinks 添加了 scopes,当来自 Simulink 运行 时,它可以将数据直接保存到工作区。但是,当我在脚本中使用命令 sim 直接根据某些参数(stopTimesolving method 等)使用模型时,结果被埋在 object 中至少可以说我有:

simout = sim('lab','StopTime','100','Solver','ode1','FixedStep','2');

现在我的工作区中有一个 object,但要访问我想要的数据,我需要深入到 simout 的成员中的 3、地狱 4 层。我的第一个问题是:

  1. 有没有一种方法可以直接访问或至少知道这些成员是什么,而无需使用 who.

    的繁琐使用

    我不想编译代码来访问它的文档! help 对这些情况并没有真正的帮助。

  2. 为什么 Simulink 模型在调用时不按照接收器属性中的规定保存数据。我知道我提到的代码行覆盖了一些 simulink 块规定(例如使用的求解方法)。

  3. 如何知道 simulink 模型如何与 matlab 脚本交互,g运行ted 我一般是编码方面的菜鸟,但文档并没有真正告诉我什么是正式的模型的定义及其在 matlab 中的使用方式。我害怕在某些时候 'sim' 的默认设置会覆盖我在早期模型中设置的一些设置,这将被证明是一个令人讨厌的调试工作。

TL;DR 有没有快速访问 object 深埋成员的方法?例如现在我必须做的:

simout = sim('lab','StopTime','100','Solver','ode1','FixedStep','2');
who(simout)
ScopeData = (simout.get('ScopeData'))
signals = (ScopeData.signals)
time = (ScopeData.time)

我可以做更多 C-ish 那种 (Simout->ScopeData).signals 的事情吗?

最后,为什么 MATLAB 套件被呈现为 day-traders 的应用程序,而通常需要了解其编码的 EE 人员经常使用它?为什么没有使用带有 headers 的库和您在代码中导入的内容(例如 boost、string 等)的良好文档?通过隐藏机制,最后一个选项可能更少 pretty,但为了能够正确编写代码,我觉得我必须了解代码的大部分底层机制。

一般

简而言之,工作区是您工作的可变环境。如果您 运行 一个脚本,您的工作区是 'base',这与控制台使用的相同。所以Matlab确实有不同的环境,一种是包含的环境,称为路径,另一种是用于变量的,称为工作空间。

Simulink 使用了另一种,我猜它可以防止隐藏变量名。

要检查当前工作区中的检查成员,请使用 who

要将成员写入另一个工作区,请使用 assignin

要运行指定工作区中的某物使用evalin

您的问题

1. 谁列出了当前工作区中的所有变量,你不需要它来做你想做的事情。 整个 simulink 文档不是很好...

2. 它确实...

3. 如果您 运行 脚本并定义变量,它们将在 base 工作区中定义。当您通过输入名称(例如 a)在 simulink 中指定一个变量时,它确实会从 base 工作区加载它(因此这种方式没有问题)。 另一种方法是使用给定的导出块,或者使用 globalassignin.

在您自己的块中指定导出值

4. 如果你打开范围块并点击选项按钮(小齿轮),你可以 select 导出选项。您还可以指定您不想使用的类型。您似乎使用了 struct with time 选项,这是 lvls 最多的选项,如果您的问题只是它是一个结构,我建议使用数组类型。 您也可以只使用输出块来指定导出类型和名称。

所以我会选择:

sim('modelname');
signals=ScopeData.signals;
time=ScopeData.time;

或者指定为数组时:

sim('modelname');
signals=ScopeData(:,2);
time=ScopeData(:,1);

在上面的示例中,我没有指定模型的方式 运行,但是您也可以在发布时指定它。

当大多数人开始使用 MATLAB 或 Simulink 时,他们总是讨厌它。我看到的主要原因是人们对 MATLAB 的了解很差,这使他们无法理解 MATLAB 的强大功能以及何时应该使用它。

在我开始描述 MATLAB 工作区、m 文件和 Simulink 如何相互关联之前,让我们首先定义它们分别是什么以及您可以使用的一些事情他们。

MATLAB 工作区

MATLAB workspace 包含您在 MATLAB 中通过命令 window 或隐式地通过 运行 宁一个 .m 文件(别担心,我会回到这些)。将变量添加到 MATLAB 工作区的最简单方法是直接输入命令 window like

>> A = 1
A =

     1

将变量 A 添加到工作区并为其分配值 1。更简单的是简单类型 1 like

>> 1
ans =

     1

将变量 ans 添加到工作区,值为 1default 工作区 variable 对于 MATLAB 执行的任何未显式分配给变量的命令是 ans.

MATLAB 中的工作区浏览器显示有关工作区中当前所有变量的信息。例如,如果我们要执行,在命令 window,

>> A = 5;
>> B = [6 8];
>> C = [3 6 7; 9 11 12];
>> D = eye(max(size(C)));

工作区浏览器看起来像

一些有用的工作区命令

save and clear 命令是适用于 MATLAB 工作区的有用命令。 save 允许您将工作区中的变量保存到文件中,而 clear 允许您从工作区中删除变量,从而释放内存。 clear all 将从工作区中清除每个变量。

m 文件

m-file(或脚本文件)是一个带有 .m 文件扩展名的简单文本文件。在其中键入 MATLAB 命令,这些命令可以通过仅执行命令 window 中的 m-file 来顺序执行。例如,让我们从上面复制我们的命令并将它们粘贴到名为 mfile_test.mm-file 中。现在让我们将命令 C - A 添加到 m-file 的底部(注意 不要在命令后附加 ;。我们可以从命令 window 执行此 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.mm-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_timestop_timestep_time 来设置模型的参数。通常我会在 m-file 中定义这些,然后 运行 我的 Simulink 模型和 sim()。这就是我们如何将所有 3 个联系在一起。

Simulink 可以通过将输出参数添加到 sim() 命令来将变量写入 MATLAB 工作区。但是,正如您所发现的那样,导航和提取您真正想要的内容可能非常麻烦!更好的方法是使用 Simulink 中的 Data Import/Export 选项和 To Workspace 块来获取您关心的输出这样您就可以忽略其他所有内容。

下面是 Simulink 数据 Import/Export 窗格的屏幕截图。您可以在此处看到我们可以将变量发送到 MATLAB 工作区的选项。通常,您需要的最常见的是 tout,这将是早期配置窗格中 start_time:step_time:stop_time 给出的范围。此屏幕中主要关注的其他区域是 xInitialxout,它们用于根轨迹分析。

然而,除了 Simulink 中最好的块之一之外,所有这些都是 To Workspace 块。此块可用于直接在 MATLAB 工作区中存储变量,是能够 link MATLAB 和 Simulink 的关键之一。您将获得 Simulink 的强大功能,以及 MATLAB 的计算和绘图能力。我在下面包含了它的屏幕截图以及我将使用的典型配置。此块的默认 Save FormatTimeseries,但是,我建议将其更改为 Array,因为它会让您的生活更轻松。

好的,我在哪里?我感觉我是在讲课而不是在写答案!

一个实用的解释

Simulink模型

那么现在让我们通过一个简单的例子将我们所学的一切付诸实践。首先我们要创建一个像这样的简单 Simulink 模型

现在我们将为此设置我们的配置,就像之前 Solver 部分

我们还将在 Data Import/Export 部分取消勾选 Limit data points to last:

而且,仅此而已。我们的简单 Simulink 模型已创建并设置。 出于此答案的目的,我将我的保存为 Whosebug_model.slx

MATLAB 脚本

现在我们将创建名为 Whosebug_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('Whosebug_model');

whos % To display variables returned from Simulink

% Plot results
figure;
plot(tout, yout, 'r');
title('Sample Plot');
xlabel('Time (s)');
ylabel('Output');

综合考虑

现在我们用Whosebug_script在命令window中执行这个脚本,坐下来惊叹MATLAB和Simu[=234=的POWER ]合并。

>> Whosebug_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需要的所有变量(kstart_timestep_timestop_time)是全部在 MATLAB 工作区中。我们还可以看到 Simulink 向 MATLAB 工作区 toutyout 添加了 2 new 变量,它们是简单的 1001x1 向量双打。没有讨厌的 structs 导航。

最后,这产生了一个很好的情节

这样我们就结束了我们通过 MATLAB、m 文件和 Simulink 的哨声之旅!我希望你和我一样喜欢它!

P.S. 我没有检查拼写或语法错误,所以非常欢迎编辑 ;)