通过 VC++调用
摘 要: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++ 开发环境下,调用 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 页面,添加文件名 、 、
(3)在使用 engine 函数的程序头文件中包含如下两个头文件: #include
"" #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,fengPutVariable(ep,"b",mxArB);(其他参数方法确定方法相同)(4)给求解区域划分
网格,得到参数 p,e,t 得到结果如图 1engEvalString(ep,"[p,e,t]=initmesh(g)");
图 1(5)求解方程,得到结果 uengEvalString(ep," u=assempde(b,p,e,t,c,a,f) ");3.
将结果变量 u 用 mat 文件保存起来 pmat=matOpen("","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