MATLAB编程仿真

2024-06-03

MATLAB编程仿真(精选7篇)

MATLAB编程仿真 第1篇

Control Build(简称CB)是自控软件设计领域中第一个全流程的CASE解决方案,涵盖了从设计规格说明书、设计、代码生成、仿真校验到实施的全过程。它使用用户熟悉的图形化方法对系统进行分解和形式化建模,可根据所建立模型生成PLC或C语言的源代码,并可对自控代码设计进行校验测试和优化,发现并更正绝大多数设计错误,从而确保使用最短的现场时间完成系统的安装调试[1]。

Matlab是一种面向工程实践和科学运算的交互式仿真、计算软件,它集科学计算、信号处理、系统仿真与图形可视化于一体,具有极高的编程效率,非常有利于工程技术人员方便地解决各种问题[2];然而由于Matlab是一种解释性语言开发平台,这就决定了它的代码执行效率比较低[3]。

CB具有灵活开放、便利高效、界面友好、容易掌握、仿真模拟校验功能强大等特点,但在矩阵运算、数值分析、科学计算等方面功能稍嫌不足[4]。因此,将两者结合运用,进行混合编程,实现优势互补,将大大提高工作效率,从而能够在工程高质量完成和编程效率上找到一个最佳平衡点,进而在快速实现工程仿真模拟和高质量指导现场工作之间找到一个绝好结合点。

实现CB和Matlab的混合编程有两种情况:(1)在CB上建立仿真模块,利用Matlab编写的M文件和接口程序共同完成仿真模拟[5]。(2)建立CB和Matlab的相互通信接口,来实现CB上的建模和利用Matlab工程计算的强大功能实现仿真工程的信息互通共享,直接在一个CB和Matlab的共同体上混合编程[6]。

本文通过一个简单水罐对象的控制说明CB与Matlab混合编程方法。

2 简单混合编程实现

2.1 CB建立模型

首先在CB上面建立如图1所示的水罐液位控制对象,并定义相应的CB变量,变量如表1所示。

2.2 Matlab编写接口程序

在Matlab中编写一个初始化的M文件,即init.m文件[7]。该文件主要完成路径、应用与变量的声明及初始化等工作,并设置Mat LAB的运行模式。init.m文件如下(编号1,2,…为说明方便而另加的):

1 path='DConntrol Build420E02tooldirtestmattestmat';%路径名

2 app Name='CBMat Local Connector';%连接文件

3 global HH H L LL P1 P2;%变量声明

4 HH=0;H=0;L=0;LL=0;P1=0;P2=0;%变量初始化

5 t=timer('period',0.05);%设置定时器工作模式

6 set(t,'Timer Fcn',['Level Control;CBMat Local Connector(path,app Name);']);

7 set(t,'Execution Mode','fixedrate');%设置运行模式

8 start(t);

2.3 液位控制

在C B中建立了一个模型框架,给出了输入输出变量及局部变量参数,上面已经把路径和相关函数做了定义。接下来在Matlab中写接口程序,来实现调动CB中的静态模型进行液位控制仿真。在Matlab中编写水罐的水位控制文件Level Control.m,该程序略去,实现流程图如图2。

实现液位控制把接口文件(CBMat Local Connector.dll)和初始化文件(init.m)放同一个文件夹下,CBMat Local Connector.e、CBMat Local Connector.s为E文件和S文件,E、S文件是接口文件。要完成接口文件的建立,首先找到CB水罐模型所在的位置,在水罐模型文件夹下有个comm文件,其中有两个仿真运行时(在CB中写完控制程序点仿真运行按钮)自动生成的接口变量文件:共享内存及交换接口信息文件(后缀分别是.e和.s),把E、S文件拷贝到驱动程序所在文件夹下,改文件名字成连接接口程序文件名,后缀不变即可,这样就完成了接口文件。控制程序(Level Control)的M文件放在别的地方,可以实现调用,但是为了整齐和便于管理,一般把控制文件放在同个文件夹下。这样仿真就可以运行了,水罐液位控制情况如图1所示。

两个软件通过接口建立连接,实现一个非常简单的工程混合编程的仿真;下面要通过接口程序、修改文件路径,混合作业,来实现CB直接启动Matlab,并通过两个软件的建立的“共同体”直接混合编程[8]。

3 CB和Matlab直接混合编程

要把CB和Matlab两个软件整合成一个整体,进行混合编程实现预期的工程仿真模拟效果,上例的两个M文件(init.m和Level Control.m)继续使用不在这里详细说明了,在CB中定义初试变量和参数如:输出变量output(initialized)和局部变量local(First Cycle)。编写一个可以把CB和Matlab连接好后直接调用Matlab中的各个公式和函数的文件如下。编译头文件(header),此调用函数编写如下所示:

任何一个想要和Matlab连接的软件必须直接拷贝使用该文件,修改其第4、5行的路径成实际路径。并编写C语言代码,调用init Fonction Matlab命令——CB通过该命令调用Matlab。

把CB和Matlab混合编程实现工程仿真模拟的工作环境搭建好,继续完成混合编程工作:在CB中定义变量输入变量(input),输出变量(output),局部变量(Local)。CB中编写头文件(header),修改header中第四五行程序的地址,用Matlab在计算机中安装地址来替代原头文件程序中第4、5行的地址。

在Matlab的Set Path中设置文件路径,把需要用到的驱动程序、M文件和E/S接口文件的路径都放到一个文件夹下,并将该文件夹的路径设置到Matlab的Set Path里面,这样就可以实现CB和Matlab的混合编程。

4 结束语

冶金、化工等实际工业过程,都相对要复杂得多,要做到仿真模拟的科学化、规范化,必须与Matlab的高级功能相结合,或使用系统辨识或神经网络等Simulink专用工具箱,建立实际工业过程模型,这样的工作更有实际意义[9]。Matlab的神经网络等高级功能与CB的连接,实现也很方便,只要根据工程实际情况选好神经网络模型,神经网络所需要的数据等可从CB中在线获取,而经过处理的结果等传给CB[10]。

简单混合编程工作能完成一些简单的工程建模仿真,但并不能充分体现出CB和Matlab的优势。而直接混合编程虽然前期工作较繁琐复杂,但通过建立接口和程序的直接调用直接应用于工程建模仿真上,更为灵活,并能充分利用Matlab的各种高级功能与专用工具箱。这样直接混合编程不仅很容易通过Matlab强大功能实现工程仿真模拟工作,更加可以做到运用C B达到自动生成准确详尽的项目说明书,并可以直接导出PLC代码,应用到生产控制上面,实现了建模仿真和生产应用的直接握手。

摘要:应用ControlBuild(CB)与Matlab的混合编程方法可以充分发挥CB和Matlab的各自优势,提高仿真、开发效率和效果。着重探讨了CB与Matlab的混合编程方法,并阐述了混合编程的基本步骤、编程过程中遇到的关键问题及其解决方案;最后,分析了它们的优缺点和适用场合。

关键词:混合编程,ControlBuild,Matlab,接口,仿真

参考文献

[1]洪荣.国际自动化领域的最新趋势[J].世界仪表与自动化,2007,(4):31-32.

[2]常魏,谢光军,黄朝峰.MATLABR2007基础与提高[M].北京:电子工业出版社,2007.

[3]张志涌等.精通MATLAB[M].北京:北京航空航天大学出版社,2003.

[4]吴玲燕,刘宽信,刘新.ControlBuild在电镀铬生产线设计中的应用[J].制造业自动化,2006,(28):26-27.

[5]徐昕,李涛,伯晓晨等.Matlab控制工程篇[M].北京:电子工业出版社,2000.

[6]施阳,李俊等.MATLAB语言工具箱[M].西安:西北工业大学出版社,1999.

[7]姜伟等.基于MATLAB与VC混合编程的飞机刹车系统仿真[J].计算机测量与控制,2006,(14):1413-04.

[8]VC++与Matlab/Simlink混合编程的实现与研究[J].科学技术与工程,2007,(21):5685-03.

[9]飞思科技研发中心编著.神经网络理论与MATLAB7实现[M].北京:电子工业出版社,2006.

MATLAB编程仿真 第2篇

随着海上采油、原油运输等活动日益频繁,海上溢油的危险大大增加。溢油污染的危害极大,如何设计海上溢油仿真系统对海上溢油进行监测和防控成为新的挑战。

1 海上溢油与仿真系统

据统计,1938年以来10%以上的海洋生物灭绝,其中绝大多数的大批死亡事件都发生在过去20年间,特别是受到海上溢油的影响[1]。由于难以自然降解,油类进入海洋后,所含的苯和甲苯等有毒化合物进入了食物链,从低级藻类到人类无一幸免。最近两年的墨西哥湾深海地平线、大连新港、渤海蓬莱19-3等重大原油泄漏事故无不提示人类,海上溢油的形势越来越严峻。

为了保护海洋和人类的可持续发展,海上溢油的防控日益重要,同时也是世界性的技术难题。一方面,需要加强原油开采和运输的安全工作;另一方面,发生溢油事故时,应该掌握溢油的发展趋势,在油膜进入沿海养殖、工业、经济等敏感区域之前将其围堵和回收。但是,海上环境比较复杂,难以估计油膜的动向。

监控海上溢油可以采用卫星遥感、飞机航拍、船舶跟踪、油膜浮子传感器等实时性较强的硬件方式。但是硬件方式费用较高,且难以实现预测。这个时候,能够提供快速分析油膜运动趋势的海上溢油仿真系统应运而生。

2 海上溢油仿真系统的架构选择

海上溢油仿真系统的工作原理是根据物理扩散、海流、风向等因素分析溢油的运动轨迹。从本质上看,海上溢油仿真系统是一种具备较强计算和分析功能的信息系统。当前的信息系统主要有B/S(Browser/Server,浏览器/服务器)和C/S(Client/Server,客户机/服务器)两种架构。

B/S架构也称为Web架构。它的特点是系统安装在服务器,客户机不需要安装额外的软件,仅通过IE、Chrome等浏览器就能获取服务。C/S架构下,服务器安装系统,客户机也需要安装相应的软件才能访问。

文献[2]和文献[3]分别采用Web技术和VB+MapX技术实现海上溢油仿真系统。C/S架构具有运行速度快的优点,但是在技术难度、成本、开发周期、配置和维护等方面都不如Web架构[4]。随着计算机硬件性能的高速发展,Web架构成为开发各类信息系统的发展趋势。因此,以下对Web架构展开研究。

3 Matlab Web Service与ASP.NET

由于海上溢油仿真系统要处理较复杂的数值计算和图像绘制,如果仅仅采用VC++、Java等常规高级程序设计语言来编写,则难度较大。因此,应该采用具备强大矩阵运算、数值分析、图形绘制功能的Matlab作为开发工具[5]。

基于Matlab的Web架构信息系统,可以采用两种模式来实现。第一种模式,通过Matlab Web Service(MWS)直接提供服务。MWS是Matlab实现网络运算的组件[6],其原理为:系统接到用户访问请求后,服务代理程序matweb将请求重定向到服务器程序matlabserver,使之运行对应的m文件,并将计算结果反馈给用户。第二种模式,通过Matlab与其他语言混合编程实现核心功能,然后以动态页面的形式提供服务。

MWS模式的设计比较便捷,但是在速度、稳定性、可扩展性方面较弱。因此,采用Matlab混合编程更为适合。在Windows平台上,采用微软的旗舰语言C#可以和Matlab实现高效的混合编程[7],然后通过ASP.NET技术提供交互性良好界面。

4 Matlab混合编程的实现

基于Matlab混合编程的海上溢油仿真系统,开发环境为Windows Server 2003、Matlab 2010、Visual Studio 2005、C#、IIS、SQL Server 2005。本系统面向沿海地区,由于水平尺度远大于垂直尺度,因此采用二维模型进行简化处理。

第一步,使用蒙特卡罗方法模拟油膜的物理扩散。设Rx、Ry为归一化、具有1/3离散分布的正态随机数,扩展系数k与离散方差2存在k(28)2/2(35)t,则油膜在x轴、y轴的扩展距离分别为:

第二步,油膜的漂移涉及到的因素很多,也比较复杂,目前还没有一个比较理想的数学模型。因此,以下采用最经典的、基于专家经验的美国海军数据中心的风场模型。在该模型下,经过Δt的时间后,油膜中心位置为:S(28)S0(10)(Vt(10)Vw)(35)t

其中S0为油膜的起始位置,tV为海流速度,wV为风速,α为风力因子(一般取0.01~0.05)。

第三步,根据数学模型,通过Matlab 2010设计子程序oil_spill。其中用到的传递参数分别是油膜起始位置、时间、海流和风的速度和角度、风力因子等。子程序oil_spill从ASP.NET的form中获取用户输入的数据后,通过mvnrnd函数生成二维正态随机数,然后根据物理扩散、漂移运动的控制方程计算油膜溢出若干时间后的结果,并绘制到地图、保存。部分核心程序如下:

第四步,安装Matlab自带的MCR(Matlab Components Runtime,Matlab运行环境),选择VS 2005 VC++作为编译器,通过Deploytool创建工程、添加类,将oil_spill.m编译为.NET类型的DLL文件。

第五步,通过VS 2005和C#语言设计ASP.NET页面,实现用户交互、数据库通信、地图文件管理的功能。其中,地图是从数据库中调取生成的新实例,通过SessionID和DateTime.Now进行命名,并记录到数据库中,便于Matlab子程序调用、显示和管理。另外,工程需要引用前面生成的oil_spill.dll和Matlab自带的MWArray.dll,声明如下:

using oil_spill;

using MathWorks.MATLAB.NET.Utility;

using MathWorks.MATLAB.NET.Arrays;

最后,客户端在浏览器地址栏中输入服务器的IP访问系统,输入坐标、时间等相关参数后,就可以马上获取油膜的运动仿真结果,如图1所示。

图中红色、白色区域分别是起始位置和2小时扩散、漂移后的油膜位置。掌握油膜运动趋势后,就可以提前预警、拦截和回收。与国内几起溢油事故的相关数据对比可知,该系统已经具备一定的参考价值。

5 结束语

采用Matlab和ASP.NET混合编程的技术设计了海上溢油仿真系统。该系统具有仿真分析快速准确、易用、稳定、可扩展性好等优点。

摘要:针对海上溢油仿真系统的设计展开研究,提出基于Matlab和Web构建系统的思路。对Matlab Web Server、Matlab混合ASP.NET两种模式进行了分析,根据Matlab混合编程的思路设计了海上溢油仿真系统。实践表明,该系统具有仿真快速准确、使用便捷等优点。

关键词:海上溢油仿真系统,Matlab,混合编程,Matlab Web Server,ASP.NET

参考文献

[1]张小明,生态环境与保护[N].光明日报,2002-05-02(4):47.

[2]包敬海.基于Web的溢油仿真系统的研究[J].智能计算机与应用,2011,1(4):25-27.

[3]杨芝龙.基于VB+MapX的船舶溢油预报地理信息系统的研究[D].大连:大连海事大学优秀硕士论文,2008:13-23.

[4]包敬海,龚文锋,黄安甲等.基于虚拟机的轻量级医疗诊断系统的应用研究[J].计算机应用研究,2010,27(4):1394-1396.

[5]章铁军,宫彬彬,吴晓蕾等.基于MATLAB的温室灌溉系统模糊控制的模型[J].安徽农业科学.2012,40(20):10696-10698.

[6]庄思发.利用Maltab web server实现在线作图[J].计算机系统应用,2010,19(6):223-225.

MATLAB编程仿真 第3篇

MATLAB是美国MathWorks公司推出的一套功能非常强大的商业数学软件,是一款将数值分析、矩阵计算、信号处理、图形显示和电子仿真等结合在一起,包含大量高度集成的函数可供调用,适合科学研究、工程设计等众多学科领域使用的一种简洁、高效的编程工具。但MATLAB解释性语言执行效率低,局限于MATLAB环境而不利于商业开发,源代码公开不利于算法与数据的保密性等,大大限制了它的执行速度和推广应用[1]。

Visual C++(简称VC)是Microsoft公司推出的当前主流的强大可视化集成编程环境,开发环境强大,开发的程序执行速度快,几乎可以开发从底层软件到直接面向用户的各个方面的软件。但在科学计算函数库方面显得不够丰富,读取、显示数据图形不方便[2]。

MATLAB的应用程序界面开发功能远不如VC方便强大,VC在工程计算方面则要比MATLAB繁琐得多。因此实现MATLAB和VC的混合编程,可以充分利用MATLAB强大的科学计算功能和丰富的工具箱,开发出高效、实用的程序,为科研工作和工程开发提供强大的技术支持[3,4]。

本文通过MATLAB的编译器将MATLAB函数编译成可以脱离MATLAB环境的动态链接库,然后在VC环境中编写应用程序界面并加载调用动态连接库,实现了MATLAB的数学函数与VC的无缝连接。以显示时滞混沌系统的图形为例,对MATLAB图形结果显示做了初步研究,实现了MATLAB图形在VC中的调用。

1 在MATLAB环境下的函数编写和编译操作

1.1 编写MATLAB函数文件(m文件)

为了说明问题,以绘制时滞混沌系统的时间历程图和相图为例,本文选取了直接绘制图形和通过函数参数传递绘制图形两类情况。首先在MATLAB环境下编写相关的函数和子函数文件。

(1)第一类:直接绘制图形

已知时滞值tau的时滞混沌系统的时间历程图和相图[5]的dde_lv.m函数文件,程序如下:

(2)第二类:通过函数参数传递绘制图形

可变时滞值tau的时滞混沌系统的时间历程图和相图的dde_phd.m函数文件,程序如下:

其中,dde_lvf子函数文件同上。

1.2 对MATLAB编译环境进行设置

在MATLAB环境中运行mex setup命令,按屏幕提示选择有关选项,此处选编译器为Microsoft Visual C/C++version6.0 in C:Program FilesMicrosoft Visual Studio,路径按实际情况选择。然后在MATLAB环境中运行mbuild setup命令,设置方法同上。

1.3 利用MATLAB提供的mcc编译器命令将m文件转换成动态链接库

(1)第一类情况在MATLAB环境中的运行

其中生成的文件中只有三个文件:hrp.dll、hrp.h、hrp.lib有用,hrp为编译后文件的名字。

(2)第二类情况在MATLAB环境中的运行

其中共生成13个文件:dde_phd.cpp、dde_phd.hpp、dde_lvf.cpp、dde_lvf.hpp、dde_phd_mainhg.cpp、subplot.cpp、subplot.hpp、xlabel.cpp、xlabel.hpp、ylabel.cpp、ylabel.hpp、zlabel.cpp、zlabel.hpp.

2 在VC中调用MATLAB数学函数库,实现混合编程

第一步:用VC建立相应类型的工程(MFCAppwizard(exe)(单文档)),文件名为yanshi,生成了相应的源文件和头文件。

第二步:在VC的编译环境下进行设置。

(1)选择菜单Tools-Options-在属性页中选择Directories-下拉框中选择IncludeFiles,在其最后加入c:MATLAB6P5EXTERNINCLUDECPP。

其中c:MATLAB6P5为MATLAB的安装路径。再在下拉框中选择LibraryFiles,在最后加入c:MATLAB6P5EX-TERNLIBWIN32MICROSOFTMSVC60。

c:MATLAB6P5EXTERNLIBWIN32该步设置结束,以后就不用再设置。

(2)选择菜单Project-Settings-属性页Link-下拉列表中选择Input,在Object/librarymodules文本框中加入libmmfile.lib、libmatlb.lib、libmx.lib、libmat.lib、libmatpm.lib、sgl.lib、libmwsglm.lib、libmwservices.lib,然后在IgnoreLibraries中加入msvcrt.lib。

(3)选择C/C++属性页,在下拉列表中选择Preprocessor,在Preprocessordefinitions中加入MSVC、IBMPC、MSWIND,再在下拉框中选择PrecompliedHeaders,选中Automatic use of precompiled headers,在其中填入stdafx.h。

第三步:把MATLAB环境编译生成的文件复制,添加到VC程序根目录下。

(1)选择菜单Project-Settings-属性页Link-下拉列表中选择Input,在Object/librarymodules文本框中加入hrp.lib。

(2)把生成的三个文件中的hrp.h文件加入到当前工程中,以及生成的13个文件中的所有cpp文件加入到当前工程中。

第四步:编写代码,加入头文件。

建立菜单ID_hrs、对话框IDD_hrs(建立对应的对话框类Chrs,通过点击按钮显示图形)。

(1)MainFrm.cpp中加入头文件:#include"hrs.h",然后在函数中添加如下代码:

(2)在主对话框中添加显示图形按钮Button1(显示直接绘制图形),并添加按钮的相应函数OnButton1,在按钮响应函数所在文件hrs.cpp中添加如下头文件代码:#include"hrp.h",然后在按钮响应函数中添加代码:

对不同m文件生成的lib文件名不一样,那么OnButton1中间的3句代码也不一样,可以查看相应的hrp.h文件写出相应的3句代码。

(3)在主对话框中添加显示图形按钮Button2(通过参数传递绘制图形),并添加按钮的相应函数OnButton2;再添加时滞值输入编辑框,并在Member Variables为其添加成员函数m_edit1(value float),最后在按钮响应函数所在文件中添加如下头文件代码:#include"dde_phd.h",并在按钮响应函数中添加如下代码:

第五步:编译连接成可执行文件,运行程序。

经VC编译器编译连接生成可执行文件,点击按钮Button1直接显示时滞混沌系统图形,或者在编辑框输入参数,点击按钮Button2后图形即可显示,即实现了时滞混沌系统的图形仿真处理。

3 结束语

MATLAB是工程人员常用的编程语言,但m文件不能脱离MATLAB这个应用程序环境,从而大大制约了程序的可移植性和通用性。本文采用目前较为流行的VC应用程序开发环境完成图形界面设计、数据管理操作。首先利用MATLAB数学库完成软件核心算法设计,很大程度上降低了编程难度和工作量,然后利用编译器调用MATLAB动态连接库,实现了m文件在其他编程环境中的编译与运行,大大提高了程序的执行效率,更极大拓展了MATLAB的应用范围。通过MATLAB与VC混合编程只需很少的程序即可实现复杂的功能,不但算法简单,而且节省了内存资源,在很大程度上降低了软件开发的难度和工作量。故这种方法在开发大型软件时优势更明显,具有很大的实用性和可操作性。

参考文献

[1]张志涌.精通MATLAB[M].北京:北京航空航天大学出版社,2000.

[2]贺淮清,刘浩翰,郭航.Visual C++的使用及面向对象软件工程实例分析[M].北京:电子工业出版社,2007.

[3]郭虹,薄云飞,林冬.VC++与MATLAB混合编程技术研究[J].计算机工程,2002,28(9):269-271.

[4]鲁强,孔英会.MATLAB与Visual C++混合编程的实现[J].现代电子技术,2003,(1):27-28.

Matlab基本数据分析编程 第4篇

关键词:数据分析,函数极值,方差,傅里叶变换,滤波,卷积

1 最大值、最小值、平均值、中间值

最大值、 最小值、 平均值、 中间值和元素求和是数据分析中最基本的手段, 在很多研究的算法性能比较中经常看到它们的运用。

(1) 最大值采用max函数, 调用格式如下:

(2) 最小值使用min函数, 调用格式与max相同。

(3) 平均值使用mean函数, 调用格式如下:

(4) 中间值使用median函数, 调用格式与mean相同。

下面的代码说明了这些函数的用法:

执行上述代码可得到图1所示的结果。

2 数学函数极值与零点

工程上一个常见的问题是求函数的极值和零点。 这里极值的求解只介绍最小值的方法。 至于最大值的求解, 只需要把原函数乘以一个常数-1 得到一个新函数, 然后求这个新函数的最小值, 则新函数的最小值与原函数的最大值的自变量取值相同。

(1) 对于一元函数在指定区间内的最小值问题, Matlab使用函数fminbnd求解。 其调用格式如下:

值得注意的是: 函数fminbnd只能用于连续函数, 并且只能给出局部最小值。 当最小值在指定区间的边界上时, 收敛的速度很慢。

下面的代码用于计算正弦函数在[0, 10 区间内的最小值:

(2) 对于多元函数的最小值, Matlab使用函数fminsearch求解。 使用该函数时必须指定开始矢量X0, 然后返回在矢量X0 附近的局部最小值。 其调用格式如下:

下面的代码用于计算二元函数的局部最小值:

(3) 对于一元函数的零点, Matlab使用fzero函数求解。在寻找一元函数的零点时, 可以指定一个开始点或者指定一个区间。 当指定一个开始点时, 此函数在开始点附近寻找一个使得函数值变号的区间, 如果没有找到这样的区间, 则返回Na N; 如果知道零点所在的区间, 则可以使用一个包含两个元素的向量来指定此区间。 其调用格式如下:

值得注意的是: 函数fzero只能返回一个局部零点, 不能寻找所有的零点。 此外, 它的收敛速度与开始点或区间的选取有关, 尽可能猜出零点的大致范围, 然后在该范围内寻找零点。

下面的代码用于求解函数的零点:

%用匿名函数来表示函数

3 标准差和方差

在Matlab中, 向量x的标准方差有如下两种定义:

其中:, N是向量x的长度。 (1) 式称为有偏标准差, (2) 式称为无偏标准差。Matlab使用 (1) 式计算数据的标准差。方差是标准方差的平方。相应地, 方差也有两种定义。

(1) 标准方差使用std函数, 其调用格式如下:

(2) 方差使用var命令, 其调用格式如下:

下面的代码对于随机变量x验证2*x的方差是x的4 倍、2x标准方差是x的2 倍:

4 协方差和相关系数矩阵

在数理统计中, 协方差和相关系数是非常重要的随机变量的数字特征。对于给定的n维随机变量, x= (x1, x2, ..., xn) 定义协方差, 则称为随机变量x的协方差矩阵;定义相关系数, 则称为相关系数矩阵。

(1) Matlab使用函数cov计算随机变量的协方差矩阵, 其调用格式如下:

(2) Matlab使用函数corrcoef计算随机变量的相关系数矩阵, 其调用格式如下:

下面的代码用于计算随机变量的系数相关矩阵:

5 元素排序

Matlab可以对实数、 复数和字符串进行排序。 对复数矩阵进行排序时, 先按照复数的模进行排序, 如果模相等则按照其在区间的相角进行排序。

(1) 数据排序使sort用函数。 其调用格式如下:

(2) 对矩阵的行进行排序使用sortrows函数。 其调用格式如下:

下面的代码对复数矩阵和字符串数据进行排列:

6 有限差分

Matlab使用函数diff来计算差分, 其调用格式如下:

下面的代码利用有限差分计算正弦函数的导数:

执行该代码可得到图2 所示的结果。

7 梯度

对于一个二元函数f (x, y) , 定义其梯度为。Matlab使用函数gradient来计算梯度, 调用格式如下:

下面的代码计算二维高斯函数的梯度场:

执行上述代码可得到图3 所示的梯度场。 图3 中椭圆是二维高斯函数的等高线, 箭头的方向代表了梯度的方向, 箭头的长度表示梯度的模。 此图也验证了梯度场的基本性质之一: 梯度方向总是垂直于等高线。

8 滤波

Matlab使用函数filter函数实现一维数字滤波。 它是下列直接II型线性差分方程组的解, 可以用于FIR和IIR滤波:

其中: na和nb是向量a和b的长度。 该方程是n-1 阶线性方程。 该方程在Z域上的表现形式为:

函数filter的调用格式如下:

下面的代码实现对带噪声的正弦信号进行平均值滤波:

执行上面代码可得到图4 所示的结果。 可知平均值滤波方法能有效去除信号中的噪声。

一般在对信号做快速傅里叶变换之前经常需要去除信号中的直流成分或线性成分。 Matlab使用detrend函数实现此功能, 其调用格式如下:

下面的代码实现去除信号中的直流成分和线性成分:

执行上述代码可得到图5 所示的结果。

9 傅里叶变换

对信号进行分析通常可以在时域中进行, 也可以在频域中进行, 时域分析方法和频域分析各有优势。 傅里叶变换可以把信号从时域变换到频域, 因此它在信号分析中非常重要, 特别是在滤波器设计、 频谱分析等方面更是如此。

傅里叶变换既可以对连续信号进行分析, 也可以对离散信号进行分析。 其中, 连续信号的傅里叶变换实际上是要计算傅里叶积分。 这里只介绍离散型傅里叶变换。

(1) 对于一维离散傅里叶变换: 如果有一个向量x (n) , 其离散傅里叶变换的结果为X (k) , 则x (n) 和X (k) 之间的关系为:

其中N为向量x (n) 的长度。 Matlab使用函数FFT实现一维离散傅里叶变换, 其调用格式如下:

对于一维离散傅里叶逆变换, Matlab使用ifft函数实现, 其调用格式与fft基本相同, 只是多了一个选项:

与傅里叶变换函数经常配合使用的是fftshift函数。 为了绘图方便, Matlab使用该函数把傅里叶变换的结果频谱X (k) 转换为适合画图显示的格式。 对于一维信号进行操作时, fftshift把信号分为左半部分和右半部分, 然后交换其左右部分。当然, fftshift函数不仅可以调整一维傅里叶变换的结果, 也可以用于二维甚至多维傅里叶变换的调整。 其调用格式如下:

下面的代码用于计算单位冲击信号经过带阻滤波器前后的频谱:

执行上述代码, 可得到图6、 图7 所示的结果。 可以看出, 单位冲击信号的频谱是一个常数, 它通过一个带阻滤波器后的频谱等于带通滤波器的频率响应曲线。 这个结果验证了: 一个信号通过一个线性系统后的频谱等于信号频谱乘以线性系统的频率响应。

(2) 在图像处理中经常使用二维傅里叶变换来进行图像滤波等操作。 Matlab使用函数fft2 实现二维傅里叶变换。 它可以看成是对信号进行两次一维傅里叶变换。 其调用格式如下:

下面的代码用于分析图片的频谱:

10 卷积

假设向量u和向量v的卷积为w, 则记为w=u塥v。 如果u, v的长度分别为m, n, 则w的长度为m+n-1。 卷积的定义为:

其中: j是使得u (j) 和v (k+1-j) 有意义的任何值。

卷积的一个非常重要的性质是满足。 这里fft函数用于信号的傅里叶变换。 Matlab使用函数conv来计算卷积。 函数conv计算卷积时利用快速傅里叶变换来实现。

下面的代码实现信号向量的卷积运算:

MATLAB编程仿真 第5篇

关键词:组件对象模型,节点,动态链接库,混合编程,雷达界面仿真

计算机和仪器的密切结合是目前仪器发展的一个重要方向。这种结合有两种方式,一是将计算机装入仪器,其典型的例子就是所谓智能化的仪器。另一种方式是将仪器装入计算机,以通用的计算机硬件及操作系统作为依托,实现各种仪器功能,虚拟仪器主要是指这种方式。

LabVIEW是美国NI公司研发的功能强大而且灵活的仪器分析开发软件,是目前应用最为广泛的虚拟仪器开发软件。其拥有强大的界面开发能力和良好的软硬件接口,但是在对各种算法的支持方面,LabVIEW的工具箱有限,这限制了使用LabVIEW对大型应用程序的快速开发。Matlab拥有强大的矩阵运算、图形处理能力和内容丰富且可扩展的工具箱,但其界面开发能力较差,并且在数据输入、网络通信、硬件控制等方面都比较繁琐。针对LabVIEW和Matlab两种软件的优势和不足,使用混合编程的方法,可以很好的结合两者的优势,互补不足,开发出更具智能化的虚拟仪器。

本文首先介绍了三种方法实现对Matlab和LabVIEW的混合编程,分别是Matlab Script节点法、动态链接库(DLL)技术和COM组件技术,重点介绍了后两种比较复杂的混合编程方法,并在此基础上完成了对雷达显示界面的仿真。(编程环境:Matlab6.5;LabVIEW 8.5;MS Visual C++6.0)

1 混合编程方法

在进行混合编程之前,需要对Matlab和MS Visual C++6.0编程环境进行设置。这是因为后两种方法都需要借助外部编译器对M文件进行编译,动态链接库(DLL)技术还需要使用Matlab Add-in插件。

Matlab Add-in插件能将M文件自动集成到Visual C++的工程中。安装外部编译器和Matlab Add-in插件,需要如下几个步骤:

1)在命令窗口中输入mbuild–setup或mex–setup;

2)选择MS Visual C++6.0;

3)在Matlab命令窗口中输入如下的命令

这两个命令将Matlab的路径保存在一个名叫mccpath的文件中。Add-In需要这个文件来确定Matlab的路径。当Matlab更换目录时需要重新执行这两个命令以便Add-In获取Matlab的路径。

4)打开MS Visual C++。

5)在MS Visual C++菜单中选择工具->定制。

6)点击附加项和宏文件标签。

7)点击浏览,在Common文件夹中选择Addins文件夹中的MatlabAddin.dll文件将Matlab Addin安装进MS Visual C++。

1.1 Matlab Script节点法

LabVIEW软件自身提供了Matlab Script节点来调用Matlab语言开发的算法,实际上是使用ActiveX控件与Matlab Server进行通信。在LabVIEW中调用Matlab的函数算法是把Matlab作为一个ActiveX服务器,LabVIEW将程序发送给Matlab,由Matlab在后台执行,并返回结果。在Matlab Script节点中,用户可以编辑Matlab程序,也可以直接调入已经存在的Matlab程序,并在LabVIEW环境下运行。这种方法简单实用,但要求客户机装有Matlab并在后台运行,程序可移植性不好。对简单的工程和对实时性要求不高的工程可以使用该方法进行混合编程,能大大减少LabVIEW程序的复杂程度,提高程序的可读性。使用该方法有以下几点需要注意:

1)客户机必须安装Matlab。

2)由于LabVIEW是使用ActiveX的方法调用Matlab,所以Matlab脚本节点只能在Windows平台下使用。

3)Matlab与LabVIEW的输入输出类型有很大区别,在使用Matlab脚本节点时应注意输入输出类型的转换。可直接右键点击输入输出节点修改数据类型。

1.2 DLL(Dynamic Link Library)动态链接库技术

1.2.1 动态链接库文件的生成

用MATLAB Script节点法所开发出的工程不能够脱离Matlab独立运行,在实际运用中要求客户机都安装有Matlab,这往往是不现实的。为了增强程序的可移植性,利用DLL(Dynamic Link Library)动态链接库技术,结合Matlab、Microsoft Visual C++、LabVIEW三种编程软件,可以开发出可独立于Matlab而运行的工程。其流程图如图1所示。

函数文件经Matlab编译器编译后直接生成的动态链接库文件,其输入输出类型均为mxArray指针。LabVIEW支持标准C数据类型,但不支持mxArray,而Matlab所生成的动态链接库文件要求输入数据为mxArray。为此需要使用MS Visual C++对函数文件进行包装,使其输入输出类型符合函数文件和LabVIEW的要求。

我们使用MathWorks公司为MS Visual C++开发的Matlab Add-in插件将M文件集成入VC++的工程中。在VC++中使用以下两个函数:mxSetPr(a,b)———double数据类型的值赋给mxArray的实部、mxGetPr()———将mxArray数据类型转换为double数据类型,完成对函数文件的输入输出类型的转换,编译链接工程后,生成可供LabVIEW调用的动态链接库。图2为生成的动态链接库的结构图。

1.2.2 在LabVIEW中调用DLL

在LabVIEW中有下面两种途径可以调用DLL文件:

1)使用CLF(Call Library Function Node)实现对DLL的调用

在程序框图窗口中打开函数选板,点击互连接口中的库与可执行程序,选择弹出选项中的调用库函数节点,并将其拖至程序框图窗口。

2)使用LabVIEW自动导入功能导入动态链接库

在程序框图窗口中,选择工具条上的工具->导入->共享库(.dll)选项,再对导入的动态链接库文件和其头文件进行正确的配置,并选择所需导入的函数后,LabVIEW就可将自动导入的动态链接库文件生成可用的子VI。

1.3 COM组件技术

COM是微软为了计算机工业的软件生产更加符合人类的行为方式开发的一种软件开发技术。在COM构架下,人们可以开发出各种各样的功能专一的组件,然后将它们按照需要组合起来,构成复杂的应用系统。Matlab所包含的Matlab COM Builder能帮助用户将用M语言开发的算法自动快速地转变为独立的COM组件对象,以供其他支持COM的编程语言调用,实现Matlab和其他编程语言的整合。LabVIEW也提供了对COM的支持。

1.3.1 创建COM组件

在Matlab中创建一个COM组件需要如下几个步骤:

1)选择start→MATLAB→MATLAB COM Builder。

2)在Component name中填入需要创建的工程名。

3)按编程需要选择使用C或者C++语言进行编译,再根据Matlab程序决定是否包含图形库。

4)工程建立后,将M文件添加到工程中。

5)工程编译完毕后在distrib文件夹中将生成相应的动态链接库文件并自动地注册到系统中。

6)编译完成后,在MATLAB COM Builder窗口中选择Package Component将COM组件打包并发布。打包后程序会在distrib文件夹下生成一个后缀为exe的自解压文件,运行它可实现动态链接库的安装和COM组件的注册。为了在没有安装Matlab的客户机上使用该COM组件,需要一同发布MCR(Matlab Component Runtime),可通过MCRInstaller.exe进行安装。

1.3.2 LabVIEW中调用COM组件

要在LabVIEW中调用COM组件,首先要引用COM对象。为此,首先在程序框图窗口中调用互连接口→ActiveX→打开自动化,右键点击打开自动化控件,选择ActiveX类,选中已注册类型库中的对象或生成的动态链接库文件,或直接从Matlab文件夹下的work文件夹中选择,这时会生成对应的图标与打开自动化控件相连接。

接下来选择ActiveX选板中的调用节点控件,将此控件与打开自动化相连,并在调用节点控件上点击右键选择方法———即Matlab程序中的函数名称。当方法有输出变量时,第一个变量为nargout,它的数据类型为Long,这个输入参数传递函数输出变量个数给编译函数。其余变量为函数的输入输出变量。

需要注意的是,虽然输入变量为整型或浮点型,但调用的函数内部对应的变量为变体型数据,LabVIEW会自动将输入数据转换为变体型数据,满足COM组件要求。但调用节点控件的输出数据为变体型数据,在输出数据时需要使用ActiveX选板中的变体至数据转换控件将变体型数据转换为LabVIEW能够显示和处理的数据类型。

1.4 雷达显示界面仿真

下例为基于Matlab与LabVIEW混合编程方法的雷达显示界面仿真。

在仿真中,通过LabVIEW控件编辑功能,使用Photoshop7画出雷达显示器与目标图形,然后将其导入LabVIEW中已有的控件,制作出雷达显示屏和目标模型,并将其设置为严格自定义的输入控件。图3为雷达显示界面的前面板。前面板由三个部分组成:雷达显示器控件与三个目标控件,扫描间隔控制控件(扫描间隔时间t单位为ms),目标坐标显示控件。

雷达显示器为一个转盘式的数值输入控件,由COM组件控制其扫描线进行扫描,扫描周期为T=360 t。三个目标由Matlab script节点仿真飞行轨迹。

扫描间隔控件用来控制扫描线的扫描快慢。

在程序框图中由雷达显示器的属性节点提供该控件的边界、尺寸等信息,将这些数据处理后输入While循环框图中,While循环再根据这些数据对目标位置进行初始化,每一次循环再通过Matlab script节点更新目标控件的坐标。图4为程序框图。

2 结语

三种混合编程方法中,Matlab Script节点法简单实用,可大大简化LabVIEW编程的复杂程度,直接调用Matlab中先进的算法。但该方法要求Matlab在后台运行,提供支持,故可移植性不高,程序运行速度也会受到影响。使用动态链接库技术进行混合编程,实现起来最为复杂,涉及到Matlab、LabVIEW、MS VC++三个大型软件的接口编程,但其能脱离Matlab被LabVIEW调用,执行效率高编程灵活,适合大型程序开发。COM组件法也能脱离Matlab使用,但在没有安装Matlab的电脑上需要安装MCRinstaller.exe。在LabVIEW中恰当的使用混合编程方法可以有效地提高编程效率,简化G语言编程的复杂程度,提高程序的运行速度,用户可根据工程的实际情况选用合适的混合编程方法。

参考文献

[1]裴锋,汪翠英.利用COM技术的LabVIEW与Matlab的无缝集成.仪器仪表用户,2005;12(2):97—98

[2]苏金明,黄国明,刘波.Matlab与外部程序接口.北京:电子工业出版社,2004

[3]National Instruments Corporation.LabVIEW Application Builder User Guide,2003

[4]雷振山.LabVIEW7Express实用技术教程.北京:中国铁道出版社,2004

MATLAB编程仿真 第6篇

1.1 在VS(vs2005,matlabbr2008a)中直接执行matlab

这种方法是利用MATLAB引擎技术。MATLAB引擎函数库是MATLAB提供的一系列程序的集合,允许用户在自己的应用程序中对MATLAB函数进行调用,将MATLAB作为一个计算引擎使用,让其在后台运行。引擎对象提供的最常用的接口有三个:Execute,Put Full Matrix,Get Full Matrix。其中Execute是执行脚本,Put Full Matrix是MATLAB SERV-ER中添加矩阵,Get Full Matrix从MATLAB SERVER中读取矩阵功能。创建过程为:创建一个windows窗体应用程序,然后在解决方案中填加两个引用,一个com组件和net组件。如图1所示。

添加如下命名空间:

设计界面,放入Button、text、picture Box控件,Button控件的激活事件中加入如下代码:

执行结果如图2所示。

1.2 C#函数调用Matlab工作空间

利用C#函数调用Matlab的工作区,工作区执行任务,然后从工作区向C#函数返回结果,在此方法中主要使用eng Open,eng Close,eng Put Variable,eng Eval String,eng Get Variable函数进行操作。

例如通过C#控制台程序调用Matlab产生图。主要代码为:

结果如图3所示。

1.3 使用Matlab Deploy Tool生成.Net组件或.com组件

组件是编译成DLL文件的类,因为组件有自己的文件,所以通过使用组件的命名空间和类名,可以在不同的应用程序中应用。COM组件中的对象是一种二进制代码对象,其代码形式是动态链接库DLL或可执行程序EXE执行代码。COM组件中的对象直接地注册在Windows的系统库中,是由系统平台直接对象。编写函数myfun.m如下:

在Command Window里面直接输入deploytool即可。生成.net组件的步骤:

(1)新建工程。选择New Deployment Project->MATLAB Builder NE->.Net Component,输入相应的保存位置和名称。(myco.prj),如图4所示。

MATLAB Builder NE是MATLAB平台下的一个开发工具,通过其可以将MATLAB平台编写的程序封装成.N-ET平台的通用组件。

(2)添加相应的M(myfun.m)文件,projectAdd file。

(3)创建工程,选择tools->Bulid编译成.net组件,点击tools->Package进行打包。文件保存后打开刚才保存工程的文件夹可以看到有两个新建的文件夹distrib和src。这里包含了在调用中需要用到的文件、库、资源和接口等。

在.net程序中引用组件的方法是:

新建C#项目,添加引用,在.net找到新生成net组件(myco)和Matworks,.net Mwarry API(Mwarray)组件。填加相应命名空间和主要程序代码为:

点击确定按扭后的执行结果如图5所示。

生成.com组件的方法和生成.net组件的方法类似,只是在创建工程时稍作改动,选择New Deployment Project->MATLAB Builder NE->Generic COM Component。

2 结束语

在C#编程中调用matlab,使用matlab的函数库和工具箱中自带的各种函数,可以简化编程难度,提高效率,使设计更加完美。

摘要:本文结合一个小实例提出了几种混合编程的方法。

关键词:C#.net,Matlab,混合编程

参考文献

[1]赵士伟,赵明波,陈平.基于COM的MATLAB与C#.NET混合编程的实现与应用[J].淄博:山东理工大学学报,2006,20(4):27.

[2]范建中,陈蕴.基于C共享库的MATLAB与VisualC#混合编程[J].北京:计算机工程与设计,2006,27(14).

[3]MATLAB C#Book[M].Copyright2004by LePhan Publishing.

MATLAB编程仿真 第7篇

MATLAB进行二维、三维图形显示时,程序语法简单,图形精度高,用VC++则需要几十行甚至数百行的程序,但VC++容易做出各种用户界面。在VC++环境下调用MATLAB中的图形显示函数,将二者结合进行编程,则可实现VC++和MATLAB在此功能上的互补及数据共享和数据可视化。

1 编程思路

VC++中调用MATLAB的常用三种方法。

(1)用MATLAB自带的编译器,把M文件翻译成C/C++代码,从而在VC++环境中进行调用,产生脱离MATLAB环境的独立应用程序,但需要MATLAB中的C/C++数学函数库和图形库的支持。图1为利用MATLAB编译器构建C/C++应用程序的过程。其中,阴影方块是用户写的代码,附有阴影的方块是工具软件,无阴影的方块是MATLAB编译器生成的代码,虚线方块是由C/C++编译器产生的目标文件和可执行文件。

(2)图2表示计算引擎应用的情况。

在VC++应用程序中调用MATLAB引擎,功能全面,但不能脱离MATLAB环境,不适于开发[1]。MAT-LAB计算引擎实际上是利用MATLAB提供的一组接口函数(API),在用户开发的语言应用程序中,通过某种通信机制后台调用MATLAB应用程序以完成复杂的系统任务。在Windows平台下,这种通信机制是利用COM应用接口IEngine来完成的。

(3)通过第三方软件MATCOM将M脚本文件和M函数转化为C/C++文件,转化过程简单,支持MATLAB图形功能,但是部分绘图语句无法实现或得不到准确图像,尤其是三维图形。故本文将介绍前两种方法。

2 编程实现

本文中的两个例子是基于Visual C++6.0,MAT-LAB 6.5.1的版本,对其他版本同样适应,均假定matlab安装在目录D:MATLAB6p5下。

2.1 MATLAB编译器

MATLAB随带了编译器,其主要功能是将.m文件翻译成各种源代码,要用到的命令为mcc。mcc的命令行参数很多,设置不同的参数可实现不同的功能。

2.1.1 MATLAB环境配置

编译器使用了CC++库函数,需要使用mbuildsetup和mex-setup对编译器进行配置。这两条命令是自动搜索系统上安装的编译器,然后对所选择的进行核对,Matlab下的环境配置设置一次即可。

2.1.2 mcc编译M文件

编写绘制三维曲面的M函数文件,命名为tripicture.m,程序如下所示:

%已知x,y的最大值与最小值,把x,y各分成50份,即x,y各有51个值

在MATLAB下利用mcc命令将tripicture.m翻译为C/C++代码,并提供图形库支持:

编译后可以得到几个文件,mesh.cppmesh.hpp,parseparams.cpp,parseparams.hpp,tripicture.cpp,tripicture.hpp,tripicture_mainhg.cpp,xlabel.cpp,xlabel.hpp,ylabel.cpp,ylabel.hpp,zlabel.cpp,zlabel.hpp及tripicture.exe和bin目录中的两个fig文件,需要的是.cpp文件及其对应的.hpp文件,bin目录中的两个fig文件。本例中要将所有生成的.cpp、.hpp文件和bin文件夹拷贝到建立的VC++工程中。

2.1.3 VC++环境设置

用MFC App Wizard(exe)建立一个应用程序,点击菜单项Project/Add To Project/Files…将所有拷贝过来的.cpp文件(本例中为tripicture_mainhg.cpp,parseparams.cpp,tripicture.cpp,mesh.cpp,xlabel.cpp,ylablel.cppe及zlabel.cpp)添加到当前工程中。

(1)选择菜单ToolsOptions,在属性页中选择Directories,添加头文件和库文件的搜索路径。

在Show directories for下拉框中选择Include files,添加路径:

再在下拉框中选择Library files,添加路径:

(2)选择菜单ProjectSettings…,选择Link属性页,在Category下拉框中选择Input。

在Object/library modules文本框中加入libmx.lib libeng.lib libmat.lib libmmfile.lib libmatlb.lib libmatpm.lib sgl.lib libmwsglm.lib libmwservices.lib,注意用空格隔开。在下面的Ignore libraries文本框中添加msvcrt.lib。

在属性页中选择C/C++选项,在Category下拉框中选择Code Generation,在Use Run-time Library的下拉列表中选择Debug Multithreaded DLL;同样,Category下拉框中选择Precompiled Headers,并选择Automatic use of precompiled headers,在Through headers编辑框中输入stdafx.h;同样,在C/C++属性页上,Category下拉框中选择General,在Preprocessor definitions编辑框中添加MSVC,IBMPC,MSWIND,用逗号隔开。

2.1.4 VC++中程序说明

把复制到VC++工程下面的所有.hpp文件全部添加为头文件(本例为#include"tripicture.hpp",#include"mesh.hpp",#include"parseparams.hpp",#include"xlabel.hpp",#include"ylabel.hpp",#include"zlabel.hpp")。在程序中用mw Array对MATLAB中调用的参数进行定义并赋值。

实现调用的主要代码如下:

本例中用到的数据minx=-4,maxx=4,miny=-4,maxy=4,所得图形如图3所示:

2.2 MATLAB引擎

从编程复杂度的角度来说,最简单的途径就当属利用MATLAB的引擎功能[2]。与其它各种接口方式相比,引擎所提供的MATLAB功能支持是最全面的。

2.2.1 VC环境设置

用MFC App Wizard(exe)建立一个应用程序,并作如下设置:

(1)通过菜单Tools/Options…,打开设置属性页,进入Directories页面,在目录下拉列表框中选择Include files,添加路径D:MATLAB6p5externinclude再在下拉框中选择Library files,添加路径D:MATLAB6p5externlibwin32microsoftmsvc60

(2)选择菜单Project/Settings…,打开工程设置属性页,进入Link页面,在Object/library modules编辑框中,添加文件名libmx.lib libmat.lib libeng.lib,以空格隔开。

2.2.2 VC++中程序说明

调用命令eng Open打开引擎,然后将mx Array转换成在MATLAB中可操作的形式。具体方法是:在MATLAB中将一个自定义的数据结构复制到mx Array中,后将此矩阵放入MATLAB计算引擎的工作区中,把命令以字符串的形式传递给函数eng Eval String进行执行。使用引擎,计算程序中必须添加头文件#include“engine.h”,程序开始后需要打开引擎,运算完成后要释放内存并关闭引擎。

本例绘制的是一个TIG焊焊接质量神经网络中输出背面熔深(Back Width)与两个输入参数电流(Current)、清洁度(Cleaning)之间的变化曲线。已知两个输入参数的最小值与最大值(minx=80,maxx=100,miny=30,maxy=60),采样个数取为50,即共有51个数。x[51],y[51]中存储了采样后的两个输入变量值,数组matdata[]中存储的是其余参数不变时,电流每变化1次,清洁度变化51次后,神经网络运算出的背面熔深的结果。

主要程序代码部分:

程序运行后得到的图形如图4所示:

3 结论

本文通过两个实例把VC++与MATLAB的数值计算、图形显示功能进行了结合,既保持了VC++的良好用户界面和高执行效率,又保持了MATLAB的优良算法,使VC++和MATLAB各自的优势能够得到充分发挥。当VC与MATLAB互传的参数比较简单或无参数传递时,使用MATLAB编译器实现相对简单方便,且可以脱离MATLAB环境运行,但图形不方便存储;当需要互传大量数据,则使用MATLAB引擎更容易实现,图形方便存储,但不能脱离MATLAB环境。

参考文献

[1]李天昀,葛临东.综述MATLAB与VC++的交互编程[J].计算机仿真,2004,21(9):193-196.

[2]何强,何英.MATLAB扩展编程[M].北京:清华大学出版社,2002.

[3]柏晟.VC++与MATLAB混合编程的方法研究与实现[J].电脑开发与应用,2006,19(4):24-27.

[4]潘爱民,王国印.Visual C++技术内幕[M].北京:清华大学出版社,1998.

[5]飞思科技产品研发中心.MATLAB6.5应用接口编程[M].北京:电子工业出版社,2003.

[6]周灵.基于COM的VC调用Matlab的方法及实现[J].中国科技信息,2006,24:131-133.

[7]张志涌.精通MATLAB 6.5版[M].北京:北京航空航天大学出版社,2003.

上一篇:幼儿园服装信息化管理下一篇:上海信息产业