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

Sol*_*vis 4 matlab simulink

我在 Control 类中使用了大量 MATLAB,但有些事情确实让我感到沮丧。他们希望我们大量使用 Simulink,尽管我发现可视化表示没有那么有帮助,而且 Simulink 和 MATLAB 脚本之间的接口通常很难理解。

因此,我有一个模型,并且添加了从 Simulink 运行时scopes可以sinks将数据直接保存到工作区的模型。然而,当我使用脚本中的命令sim根据某些参数( 、 等)直接使用模型时,stopTime结果solving method被隐藏在一个对象中,该对象的文档记录很少,至少可以说我有:

simout = sim('lab','StopTime','100','Solver','ode1','FixedStep','2');
Run Code Online (Sandbox Code Playgroud)

现在我的工作区中有一个对象,但要访问我想要的数据,有时需要在simout. 我的第一个问题是:

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

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

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

  3. 如何知道 simulink 模型如何与 matlab 脚本交互,假设我一般来说是编码新手,但文档并没有真正告诉我模型的正式定义是什么以及它在 matlab 中的使用方式。我担心在某些时候“sim”的默认设置会覆盖我在早期模型中设置的一些设置,这将被证明是一项令人讨厌的调试工作。

TL;DR有没有一种快速的方法来访问对象中深埋的成员?例如现在我必须做:

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

我可以做一些更 C 风格的事情吗(Simout->ScopeData).signals

最后,为什么 MATLAB 套件被认为是一款面向日内交易者的应用程序,而它却被通常需要了解其编码的 EE 人员大量使用?为什么没有使用带有标头和良好文档的库来说明您在代码中导入的内容(例如 boost、字符串等)?最后一个选项可能会pretty通过隐藏机制而减少,但为了能够正确编写代码,我觉得我必须了解代码的大部分底层机制。

IKa*_*agh 7

当大多数人开始使用 MATLAB 或 Simulink 时,他们总是讨厌它。我认为造成这种情况的主要原因是人们对 MATLAB 的了解非常少,这使得他们无法理解 MATLAB 的强大功能以及何时应该使用它。

在我开始描述 MATLAB 工作区之前,m文件和 Simulink 之间的关系之前,我们首先分别定义它们各自的含义以及可以使用它们执行的一些操作。

MATLAB 工作区

MATLAB工作区包含您在 MATLAB 中通过命令窗口显式创建或通过运行文件隐式创建的所有变量不用担心,我会再讨论这些变量)。将变量添加到 MATLAB 工作区的最简单方法是直接在命令窗口中键入,例如.m

>> A = 1
A =

     1
Run Code Online (Sandbox Code Playgroud)

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

>> 1
ans =

     1
Run Code Online (Sandbox Code Playgroud)

它将变量添加ans到工作区,值为1。MATLAB 执行的任何未显式分配给变量的命令的默认工作区变量为。ans

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

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

工作区浏览器看起来像

                           MATLAB 工作区浏览器

一些有用的工作区命令

和命令是在 MATLAB 工作区中使用的有用命令save。允许您将变量从工作区保存到文件,同时允许您从工作区删除变量,从而释放内存。将从工作区中清除每个变量。clearsaveclearclear all

m文件

m-file或脚本文件)是带有文件扩展名的简单文本文件.mm-file您可以在其中键入 MATLAB 命令,只需在命令窗口中执行即可顺序执行这些命令。例如,让我们从上面复制我们的命令并将它们粘贴到m-file调用的mfile_test.m. 现在让我们将命令添加C - A到底部m-file注意不要;在命令后添加 a)。我们可以m-file从命令窗口执行此命令,并查看其中按顺序执行的所有命令的输出

>> mfile_test.m
ans =

    -2     1     2
     4     6     7
Run Code Online (Sandbox Code Playgroud)

m文件和函数

m文件还可以包含函数。例如,我们可以编写一个函数来计算圆的面积和周长,例如

function [A, C] = circle(r)
    A = pi*r*r;
    C = 2*pi*r;
end
Run Code Online (Sandbox Code Playgroud)

并将其放入一个m-file名为circle.m. 然后我们可以像这样使用它

>> circle(5)
ans =

   78.5398
Run Code Online (Sandbox Code Playgroud)

其中ans现在保存半径为5或的圆的面积

>> [A, C] = circle(5)
A =

   78.5398

C =

   31.4159
Run Code Online (Sandbox Code Playgroud)

其中A包含圆的面积和C周长。

Simulink 模型

Simulink 是一种图形工具,可用于对各种不同类型的系统进行建模以及对动态系统行为进行建模。Simulink 紧密嵌入到 MATLAB 生态系统中,这为其增添了额外的功能(稍后在描述相似之处时我将再次讨论这一点)。

Simulink 模型包含的块均表现出不同的行为。如果您需要,还可以创建自己的 Simulink 模块。Simulink 中的模型是通过连接不同类型的模块来模拟您想要建模的系统而创建的。

Simulink 非常广泛,我不建议您自学。学习 Simulink 的最佳方式始终是作为课程的一部分,控制系统或系统分析类型的课程非常适合此目的。出于这个原因,我不会在这里过多地讨论它。

MATLAB 工作区、m文件和 Simulink 有何关联?

那么,MATLAB 工作区可用于m文件和 Simulink。MATLAB 工作区中的变量可在文件和 Simulink 中使用m

m仅包含脚本(而不包含函数)的文件会将其中创建的每个变量写入 MATLAB 工作区。m仅包含函数的文件不会将这些函数中使用的任何变量写入 MATLAB 工作区。函数更改 MATLAB 工作区中的变量的唯一方法是将输出值分配给或在调用函数时ans显式声明输出参数。

Simulink 和 MATLAB 工作区与m文件和 MATLAB 工作区具有非常相似的关系。MATLAB 工作区中的任何变量都可以在 Simulink 中使用(在任何部分,包括配置)。例如,在下面的配置中,我使用 MATLAB 工作区变量并start_time设置模型的参数。通常,我会在运行 Simulink 模型之前定义这些。这就是我们如何将这三者联系在一起。stop_timestep_timem-filesim()

   Simulink 配置

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

下面是 Simulink 数据导入/导出窗格的屏幕截图。您可以看到这里有一些选项可供我们将变量发送到 MATLAB 工作区。通常,您需要的最常见的是先前配置窗格中tout给出的范围。start_time:step_time:stop_time此屏幕中主要感兴趣的其他区域将xInitial用于xout根轨迹分析。

   Simulink 数据导入/导出

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

  Simulink 到工作区

好吧,我刚才在哪儿?我感觉我是在讲课而不是在写答案!

实用的解释

Simulink模型

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

                 Simulink模型

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

   Simulink 模型配置

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

   Simulink 数据导入/导出

就是这样。我们的简单 Simulink 模型已创建并设置。为了这个答案的目的,我将我的保存为stackoverflow_model.slx.

MATLAB脚本

现在,我们将创建简单的 MATLAB 脚本 ( m-file),stackoverflow_script.m该脚本将通过将 Simulink 模型添加到 MATLAB 工作区来设置必要的变量。然后,我们将调用 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');
Run Code Online (Sandbox Code Playgroud)

把它们放在一起

现在,我们在命令窗口中执行此脚本,stackoverflow_script并惊叹于MATLAB 和 Simulink 相结合的强大功能

>> 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
Run Code Online (Sandbox Code Playgroud)

从上面的输出中我们可以看到 Simulink 需要的所有变量(kstart_timestep_timestop_time都在 MATLAB 工作区中。我们还可以看到 Simulink在 MATLAB 工作区中添加了 2 个tout变量,yout它们是双精度数的简单1001x1向量。structs导航起来并不麻烦。

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

                    最终情节

我们的 MATLAB、文件和 Simulink 之旅就此结束m!我希望你和我写它一样喜欢它!

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