我在 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
. 我的第一个问题是:
有没有一种方法可以直接访问或至少知道这些成员是什么,而无需使用who
.
我不想编译代码来访问其文档!对于这些情况并help
没有真正的帮助。
为什么 Simulink 模型在调用时不按照接收器属性中的规定保存数据。我知道我提到的代码行覆盖了一些 simulink 块规定(例如使用的求解方法)。
如何知道 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
通过隐藏机制而减少,但为了能够正确编写代码,我觉得我必须了解代码的大部分底层机制。
当大多数人开始使用 MATLAB 或 Simulink 时,他们总是讨厌它。我认为造成这种情况的主要原因是人们对 MATLAB 的了解非常少,这使得他们无法理解 MATLAB 的强大功能以及何时应该使用它。
在我开始描述 MATLAB 工作区之前,m
文件和 Simulink 之间的关系之前,我们首先分别定义它们各自的含义以及可以使用它们执行的一些操作。
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 工作区中使用的有用命令save
。允许您将变量从工作区保存到文件,同时允许您从工作区删除变量,从而释放内存。将从工作区中清除每个变量。clear
save
clear
clear all
m
文件(m-file
或脚本文件)是带有文件扩展名的简单文本文件.m
。m-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 紧密嵌入到 MATLAB 生态系统中,这为其增添了额外的功能(稍后在描述相似之处时我将再次讨论这一点)。
Simulink 模型包含的块均表现出不同的行为。如果您需要,还可以创建自己的 Simulink 模块。Simulink 中的模型是通过连接不同类型的模块来模拟您想要建模的系统而创建的。
Simulink 非常广泛,我不建议您自学。学习 Simulink 的最佳方式始终是作为课程的一部分,控制系统或系统分析类型的课程非常适合此目的。出于这个原因,我不会在这里过多地讨论它。
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_time
step_time
m-file
sim()
Simulink 可以通过向命令添加输出参数来将变量写入 MATLAB 工作区sim()
。然而,正如您所发现的,导航和提取您真正想要的内容可能非常麻烦!更好的方法是使用Simulink 中的数据导入/导出选项以及一个To Workspace
块来获取您关心的输出,以便您可以忽略其他所有内容。
下面是 Simulink 数据导入/导出窗格的屏幕截图。您可以看到这里有一些选项可供我们将变量发送到 MATLAB 工作区。通常,您需要的最常见的是先前配置窗格中tout
给出的范围。start_time:step_time:stop_time
此屏幕中主要感兴趣的其他区域将xInitial
用于xout
根轨迹分析。
然而,除此之外,Simulink 中最好的模块之一就是该To Workspace
模块。该模块可用于直接在 MATLAB 工作区中存储变量,是能够链接 MATLAB 和 Simulink 的关键之一。您可以获得 Simulink 的强大功能以及 MATLAB 的计算和绘图能力。我在下面提供了它的屏幕截图以及我将使用的典型配置。Save Format
该块的默认值是Timeseries
,但是,我建议将其更改为 ,Array
因为它会让您的生活更轻松。
好吧,我刚才在哪儿?我感觉我是在讲课而不是在写答案!
现在让我们通过一个简单的例子将所学到的一切付诸实践。首先我们将创建一个像这样的简单 Simulink 模型
现在我们将为此部分设置我们的配置,就像之前的Solver
部分一样
我们还将Limit data points to last:
在该Data Import/Export
部分中取消勾选
就是这样。我们的简单 Simulink 模型已创建并设置。为了这个答案的目的,我将我的保存为stackoverflow_model.slx
.
现在,我们将创建简单的 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 需要的所有变量(k
、start_time
和step_time
)stop_time
都在 MATLAB 工作区中。我们还可以看到 Simulink在 MATLAB 工作区中添加了 2 个新tout
变量,yout
它们是双精度数的简单1001x1
向量。structs
导航起来并不麻烦。
最后,这产生了一个很好的情节
我们的 MATLAB、文件和 Simulink 之旅就此结束m
!我希望你和我写它一样喜欢它!
PS我还没有检查拼写或语法错误,所以非常欢迎编辑;)