通过VC++调用

(整期优先)网络出版时间:2019-03-03
/ 2

摘 要:MATLAB 语言是当今国际上最流行的科学与工程计算编程语言, 它起源于矩阵运算, 并已发展成一种高度集成的计算机语言。本文简单阐述了Matlab的基本功能和应用,引入了有限元的基本概念及有限元分析的一般步骤。通过matlab与其它高级语言相比较,指出其在有限元分析应用中的优势以及不足。在此基础上,提出了Vc++与matlab混合编程。最后用一个例子演示vc++与matlab混合编程在有限元分析的过程。

关键词:MATLAB 有限元 混合编程


一、引言

matlab是美国Mathworks公司推出的一种以矩阵为基本单位的高效数值计算语言,是一个集科学计算、图像处理、声音处理于一体的高度集成系统。在编程效率、程序可读性、可移植性和可扩充性上matlab远远优于其它的高级编程语言,而且编程易学、直观,代码非常符合人们的思维习惯。另外matlab为用户提供了丰富的windows图形界面设计方法,使用户能够在利用其强大的数值计算功能的同时可设计出友好的图形界面,它受到了越来越多的用户的欢迎,成为当今国际上最流行的计算机辅助设计软件。

近年来,在国内matlab已在许多工业部门,设计单位和科研机构特别是高校得到广泛的应用。它主要应用于自动控制系统、数字信号处理,时间系列分析等方面,在工程有限元数值分析方面应用甚少,也鲜见报道。

有限元方法是利用计算机求解数学物理或工程实际中的微分方程问题,主要是偏微分方程问题的一种系统化的数值计算方法。有限元法是将物体划分成有限个单元,这些单元之间通过有限个节点相互连接,单元看作是不可变得刚体,单元之间的力通过节点传递,然后利用能量原理建立各单元矩阵,最后组成总刚矩阵,求解线性方正组。

二、Matlab在有限元分析中的优势与不足

进行有限元分析,若用其他高级语言开发,如c,c++,frotran等,编程的工作量十分浩大,开发周期很长,而利用matlab进行有限元设计有以下优点:

(1)语言简洁紧凑、使用方便灵活、库函数及其丰富,几乎包括有限元编程中的所有基础程序。

(2)可视化及强大的图形功能。

(3)程序代码公开

(4)程序可移植性好。Matlab几乎可以在各种机型和操作系统上运行,所以在可移植性和可扩充性上,matlab远优越于其他的高级编程语言。

Matlab语言具有强大的数值计算能力和视图能力,其偏微分方程工具箱(PDEToolbox)提供了有限元求解的一个强大而灵活的环境,并且有限元网格可做精细划分以满足要求。但是,和其他的高级语言相比,matlab程序的执行速度较慢。

VC++是当前Windows 下的主要编程语言之一, 它能方便地形成应用软件中所需要的各种用户界面和工具并直接与系统及底层硬件交换数据。用VC++开发的系统具有容易维护、升级、界面友好、代码效率高、执行速度快等一系列优点,因此已成为目前应用软件开发中广泛采用的主要工具之一

三、Vc++与matlab混合编程

因此,将Matlab 与VC++进行有效的混合编程,不仅能更好地发挥Matlab 强大的功能,还能快速地进行软件开发,尤其是当软件开发中需要实现复杂的数学算法、图形处理时,更加高效。

(1)将Matlab 程序编译成C/C++源文件并嵌入VC++;

(2)在C/ C++程序中利用Matlab engine 调用Matlab 函数;

(3)在C/C++程序中直接使用Matlab C/C++ Math Library;

(4)将.m文件编译成*.dll文件嵌入到VC++的程序中。

其中matlab引擎是一组函数,通过这组函数,用户可以在应用程序中实现对matlab的控制。采用matlab引擎,可以在非matlab为主的应用程序中使用matlab功能。

Matlab采用mcc命令可以将大部分.m程序编译成动态连接库供matlab调用;通过mex命令,可以将C语言程序编写成MATLAB可执行程序。这两种方式中,前一种方式是在vc应用程序中调用matlab,后一种方式是在matlab程序中调用vc编写的程序。这两种方式都不能脱离matlab环境,所有操作都是基于matlab实现的。

与matlab引擎应用程序和matlab可执行程序相比,vc调用matlab数学库和图形函数执行速度快, 内存需求少,可以发布给没有matlab的用户使用。但也有其不可避免的缺点:

(1)用户不能够在基于matlab数学库和图形库的应用程序中使用matlab的函数eval()和input();

(2)不能调用图形句柄系统的函数;

(3)Matlab中的一些方法在c/c++中得不到支持,如“;”,”[]”.转贴于 中国论文下载中心

四、通过在vc++环境中调用matlab引擎实现有限元分析

本文采用matlab引擎的工作方式,在vc++6.0开发环境下,调用MATLAB引擎函数,绘制求解区域,进行有限元分析,得出结果的工作,并将结果保存到MAT文件中。



1.准备工作

(1)vc++环境编译文件设置。通过菜单 Tools/ Options,进入 Directorie页面。为Include Files和Library Files添加以下路径

D:\Matlab6p5\extern\include(在Matlab的安装路径下)

D:\Matlab6p5 \extern\ lib\win32\ Microsoft\ msvc60 (在Matlab的安装路径下)

(2)添加库文件:通过菜单 Projects|settings,进入 Link 页面,添加文件名libmx.lib 、libmat.lib 、libeng.lib

(3)在使用 engine 函数的程序头文件中包含如下两个头文件: #include "engine.h" #include

2.在应用程序中添加调用Matlab引擎的程序代码

(1)打开引擎

Engine *ep;

if(!(ep=engOpen(NULL)))

MessageBox(NULL,"CAN NOT OPEN MATLAB ENGIN","engine demo",MB_OK);

(2)求解区域

按照pde工具箱中区域变量gd的格式,定制一个多维double类型数组m_dbG最终根据m_dbGd中的内容绘制区域

mxSetPr(mxArGd,m_dbGd[0]);

engPutVariable(ep,"gd",mxArGd);

engEvalString(ep,"g=decsg(gd);");

(3)按照如上方法,根据数组m_b等中的内容确定边界条件b,pde方程系c,a,f

engPutVariable(ep,"b",mxArB);(其他参数方法确定方法相同)

(4)给求解区域划分网格,得到参数p,e,t得到结果如图1

engEvalString(ep,"[p,e,t]=initmesh(g)");

    图1

(5)求解方程,得到结果u

engEvalString(ep," u=assempde(b,p,e,t,c,a,f) ");

3.将结果变量u用mat文件保存起来

pmat=matOpen("fem.mat","w");

//打开/创建一个mat文件

mxArray *mxArGd= mxCreate DoubleMatrix (1,n, mxREAL);

//n为节点个数

mxArray= engGetVariable(ep,"u");      

//将数据从matlab工作空间中取出

matPutVariable(ep,"u",mxArray);      

//将数据放入mat文件中

五、结论

通过上述对Matlab在有限元分析中的优缺点,本文指出了vc++与matlab混合编程的必要性。在对vc++与matlab混合编程的各种方法进行比较后,本文选择了在vc++环境中调用matlab引擎的方式来来现有限元分析。从本文最后的实例以及其程序片断可以看出,通过调用matlab引擎,vc++程序可以方便的操作matlab工具箱函数进行有限元分析。

参考文献

[1] 赵经文,王宏钰. 结构有限元分析[M]. 北京: 科学出版社, 2001: 25- 37

[2] 于润伟. Matlab 基础及应用[M]. 北京: 机械工业出版社, 2003: 1- 3