• 为了保证你在浏览本网站时有着更好的体验,建议使用类似Chrome、Firefox之类的浏览器~~
    • 如果你喜欢本站的内容何不Ctrl+D收藏一下呢,与大家一起分享各种编程知识~
    • 本网站研究机器学习、计算机视觉、模式识别~当然不局限于此,生命在于折腾,何不年轻时多折腾一下

Matlab教程0x9-在GUI中调用含未知参数的Simulink模型

Matlab admin 3年前 (2016-11-08) 1787次浏览 0个评论 扫描二维码

本节教程主要向大家演示使用三种不同的方法在 GUIDE 中嵌入Simulink模块。关于原理大家可以参考http://www.mathworks.com/access/ … g_guis/f6-8865.html

在 Simulink 中能够直观快速的搭建系统模型,如果再联合 GUIDE 的面向对象可视化编程,可以说是锦上添花!将 Simulink 融入到 GUIDE 中可以方便模型的终端用户,很容易直接可视化的操控模型参数和显示仿真结果,而此时并不需要进入 Simulink 环境。

构建 Simulink 模型

该部分我们将快速的构建一个 Simulink 模型方便在后面的 GUIDE 中使用。本次我们就使用一个简单的二阶“质量-弹簧-阻尼”系统作为示例吧。

在使用该教程时,我们假定您已经具备 Simulink 相关建模基础和了解“质量-弹簧-阻尼”系统的理论。因此在这里我就不深入介绍 Simulink 模型的建立和“质量-弹簧-阻尼”系统的数学推导。如果的确需要,建议您参考下http://edu.levitas.net/Tutorials/Matlab/Simulink/index.html

1、先下载论坛为您制作好的 Simulink 和 GUI 模型 simulink-gui.zip (13.04 KB, 下载次数: 2036) ,包含simulink_gui.fig、simulink_gui.m、 simulateButton.mmass_spring.mdl四个文件,将其解压到MATLAB工作目录。

2、在 Simulink 中打开模型,框图如下所示

3、请注意增益(Gain)模块的增益使用的是变量 1/m、c/m 和 k/m,而不是数值。因为Simulink 默认使用基本状态空间(Base WorkSpace)的数据,因此在仿真之前必须先在状态空间定义参数 m、c 和 k,否则将出错。当然我们可以使用 set_param()函数直接设置参数,这个将会在后面讲解。

4、由于函数有自己的状态空间(不是 Base Workspace),因此在函数中使用 sim()函数进行模型仿真,即使你在函数中定义了模型的必要参数,但是这些参数只存在于函数状态空间中,模型在仿真是没法获取。比如下面的代码将会导致错误

  1. function runSimulinkModel(m,c,k)
  2. % 即使在函数中有模型的参数输入或定义,但是 Simulink 默认只使用基本状态空间的数据
  3. sim(‘mass_spring’);

复制代码

5、由于函数状态空间和基本状态空间的变量和数据不兼容,这就增加了在 GUIDE 中调用 Simulink 模型的难度。在接下来的教程中,我们将讨论使用三种方法来解决这个问题!

GUIDE 调用 Simulink

方法一:

主要使用 set_param 函数设置仿真参数,具体参考http://www.matlabsky.com/thread-17464-1-1.html

方法二:

Simulink 中提供的 simset()函数,可以让用户自定 Simulink 模型的运行空间(默认是 Base Workspace),我们只要将 Simulink 设置为从当前工作空间运行就 Ok 了。关于 simset 的更多用法,感兴趣的网友可以自己参考 Matlab 帮助!

1、在 GUIDE 中打开 simulink_gui.fig 文件(不会使用 GUIDE,那先看下http://www.matlabsky.com/thread-5217-1-1.html),GUI 布局如下所示

2、打开 simulink_gui.m 文件定位到 Simulate!按钮的回调函数simulate_pushbutton_Callback,在后面添加如下代码

  1. axes(handles.axes1) % 将 axes1 设置为当前坐标系,便于绘制仿真结果
  2. m=str2num(get(handles.mass_editText,’String’)); % 获取质量
  3. c=str2num(get(handles.damping_editText,’String’)); % 获取阻尼
  4. k=str2num(get(handles.spring_editText,’String’)); % 获取劲度系数
  5. % 配置 Simulink 仿真选项,使其使用当前工作空间
  6. % 设置 Simulink 从当前工作空间运行
  7. options = simset(‘SrcWorkspace’,’current’);
  8. % 使用 sim()函数对模型进行仿真
  9. % 第一参数是模型名称
  10. % 第二个参数是向量,指定仿真开始和结束时间
  11. % 如果设置为[],则使用在 Simulink 中设置的始末时间
  12. % 第三个参数设置 Simulink 仿真选项
  13. sim(‘mass_spring’,[],options);
  14. % 绘制图形% 模型中有一个 OUT 模块,使用它我们可以设置输出变量为 tout 和 yout
  15. % 然后就可以直接调用 Simulink 的获取仿真结果 tout 和 yout 进行绘图了
  16. plot(tout,yout)
  17. xlabel(‘Time’)
  18. ylabel(‘Displacement’)
  19. Title(‘2nd Order Mass Spring System’)
  20. grid on

复制代码

3、保存修改,再运行 GUI。在文本框中输入“质量-弹簧-阻尼”系统的三个参数(注意不要输入字母、符号或负数),然后点击“Simulate!”按钮,看看我们的劳动成果吧!

方法三:

1、同样在 GUIDE 中打开未经有修改的 simulink_gui.fig 文件

2、双击“Simulate!”按钮打开属性查看器,将 Callback 属性修改为 simulateButton。以后每次点击“Simulate!”按钮时,则 GUI 只响应 simlateButton 中定义的操作,而不是simulate_pushbutton_Callback

注意:simulateButton 是另外编写的一个 M 脚本文件,MATLAB 中脚本文件(不同于函数文件)中的所有变量和数据共用基本状态空间。

3、其实 simulateButton.m 脚本的代码如下

  1. % 注意到 simulateButton.m 文件不是一个 M 函数(以 function 开头的为 M 函数),而是 M 脚本!
  2. % Matlab 脚本将在基本工作空间运行,它涉及到所有的变量和数据都保存在基本工作空间!
  3. % 而 Simulink 所有参数默认调用基本工作空间的数据,所以此时我们就可以直接使用 sim()函数进行模型仿真了!
  4. clear all
  5. % 获取当前 GUI 窗体的句柄
  6. h =gcf;
  7. % 获取 GUI 的 handles 结构体,它包含了所有控件的信息
  8. handles = guidata(h);
  9. % 选择当前坐标系,由于后面的绘图
  10. axes(handles.axes1);
  11. % 获取文本框中的 Simulink 仿真参数
  12. m=str2num(get(handles.mass_editText,’String’)); % 注意获取的 string 是一个字符串,需要使用 str2num 将其转换为数值
  13. c=str2num(get(handles.damping_editText,’String’));
  14. k=str2num(get(handles.spring_editText,’String’));
  15. % 仿真系统
  16. sim(‘mass_spring’);
  17. % 绘制仿真结果图形
  18. plot(tout,yout)
  19. xlabel(‘Time’)
  20. ylabel(‘Displacement’)
  21. Title(‘2nd Order Mass Spring System’)
  22. grid on

复制代码

其实方法二的一种变形就是,跨空间计算 Simulink 模型所需要的参数,比如 evalin(‘base’,’m=5′),就表示在基本工作空间运行 m=5 这条命令。

4、保存下对 GUI 的修改,验证下我们的成果吧!


Deeplearn, 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明Matlab 教程 0x9-在 GUI 中调用含未知参数的 Simulink 模型
喜欢 (0)
admin
关于作者:
互联网行业码农一枚/业余铲屎官/数码影音爱好者/二次元

您必须 登录 才能发表评论!