首页 理论教育 核心算法与开发工具优化方案

核心算法与开发工具优化方案

时间:2023-06-26 理论教育 版权反馈
【摘要】:核心算法的开发的可行途径是使用Matlab平台完成核心算法的编程,再使用Matlab提供的工具将算法程序的M 文件编译成动态链接库文件 ,最后使用VC++调用动态链接库,以实现风电功率预测。

核心算法与开发工具优化方案

核心算法是风电功率预测软件的核心,算法的实现也是软件开发中难度最大的部分。传统的预报算法如自回归-动平均算法 (AR)、多项式拟合算法等,原理简单,编程实现难度不大,但预报精度则比较低;而新兴算法如神经网络算法、支持向量机算法等,预报精度较高,但原理复杂,软件开发者要从头编程实现,既需要对算法原理有较深理解,又需要有较强的编程能力,因此实现难度较大。核心算法的开发的可行途径是使用Matlab平台完成核心算法的编程,再使用Matlab提供的工具将算法程序的M 文件编译成动态链接库文件 (dll),最后使用VC++调用动态链接库,以实现风电功率预测。

4.3.3.1 Matlab平台简介

Matlab是美国MathWorks公司出品的商业数学软件,用于算法开发、数据可视化、数据分析以及数值计算的高级技术计算语言和交互式环境,主要包括Matlab和Simulink两大部分。Matlab是Matrix&Laboratory两个词的组合,意为矩阵工厂 (矩阵实验室)。它将数值分析、矩阵计算、科学数据可视化以及非线性动态系统的建模和仿真等诸多强大功能集成在一个易于使用的视窗环境中,为科学研究、工程设计以及必须进行有效数值计算的众多科学领域提供了一种全面的解决方案,并在很大程度上摆脱了传统非交互式程序设计语言 (如C、Fortran) 的编辑模式,代表了当今国际科学计算软件的先进水平。Matlab平台提供了大量的工具箱,每个工具箱都拥有若干函数,使用这些函数,即可用少量代码完成复杂的数据处理过程。如神经网络工具箱,BP神经网络、RBF神经网络等复杂数学模型的建立,使用工具箱函数只需寥寥数行程序即可实现,大大降低了使用以神经网络为代表的复杂模型的门槛;此外,Matlab本身还是一个开放性平台,使用C 语言开发的软件包通过VC++编译器的编译后,也可在Matlab平台上使用,这个特性更加扩展了Matlab的应用范围,以支持向量机算法为例,最流行的是由台湾大学林智仁副教授开发libsvm 软件包,该软件包即可通过编译在Matlab平台上应用,简单地开发出高质量的支持向量机预报算法。

4.3.3.2 VC++调用Matlab库函数技术简介

VC++调用Matlab库函数须使用Matlab编译器。Matlab编译器由若干Matlab的软件工具组成。其实现原理是首先把需要从VC++中调用的函数写成一个M 文件,再将M 文件转化为C/C++语言的源代码文件。每个源文件相当于一个用C/C++编写的函数的定义与实现文件,只不过该函数的实现不是程序员编写的,而是调用Matlab函数库中的实现。同时,Matlab编译器会生成一个动态链接库,它包含相应算法的二进制实现代码。出于版权保护的目的,这些生成的源文件不会包含函数的实现代码,而仅仅包含指向上述那个动态链接库的相应入口的调用语句。然后程序员手工将C/C++源文件加入VC++的项目之中,就可以和项目的其他代码一起编译链接,生成可执行文件。下文将通过一个简化实例来介绍针对Visual Studio.net 2010 版本及Matlab 2010b 版的具体流程。

1.M 文件的编写

调用Levinson 算法的代码如下:

function A=My_Levi(r);

A=levinson(r);

将其保存为文件名为My_Levi.m 的M 文件。编写该M 文件时除少量特定语句不能包含外基本上和普通M 文件一样,也可由多行语句组成。当我们需要调用多个Matlab库函数时,出于代码可维护性的考虑,一般为每个函数调用单独编写一个M 文件。

2.配置Matlab编译器

在开始使用Matlab编译器前,需要按如下步骤配置它:在Matlab命令窗口中执行mex-setup命令和mbuild-setup命令。这两个命令会搜索安装在本机上的C/C++编译器并要求程序员指定哪个将与Matlab协同工作。程序员只要按照提示进行几步选择即可,配置工作由Matlab自动完成,其主要作用在于按照不同的C/C++编译器版本,确定在源代码转换和生成时所应遵循的语法规范。除配置Matlab外,开发工具所在的操作系统也要进行配置。需要给操作系统的环境变量 (Windows7中为用户变量和系统变量)的路径加入Matlab的有关目录,即指定Matlab的bin、bin\win32、extern\lib\win32\microsoft等几个子目录的位置。上述两类配置只需在Matlab和VC++安装好后执行一次即可。

3.用MCC 生成C++源代码及链接库

在Matlab命令窗口中运行工具软件MCC (Matlab C/C++ Compiler):

该命令将根据My_Levi.m 生成一系列的文件,它们全部以cpplib选项后面指定的名字作为文件名。其中主要的是My_Levi.cpp,My_Levi.h,My_Levi.lib,My_Levi.dll这几个文件。其中C++源文件需要被手动包含到VC++的项目当中,LIB文件用于VC++的链接器,DLL 文件则是运行时动态链接库。如果项目需要调用多个MATLAB算法函数,一般会编写多个M 文件,这时可以一次性处理所有的M 文件,例如:

mcc-W cpplib:My_Lib-T link:lib My_Call1.m My_Call2.m My_Call3.m …此时仍然只生成单一的源文件和库文件,但My_Lib.h和My_Lib.dll等文件中包含所有调用的定义和入口等。这在M 文件很多时显然非常方便。

下面摘抄My_Levi.h 中Levinson 算法的C++函数定义,以便后面对它的调用:

extern LIB_My_Levi_CPP_API void MW _CALL_CONV My_Levi (int nargout,mwArray& A,const mwArray&r);

这个格式是统一的,即参数列表中第一个是输出个数,随后一个或多个是输出参数,再随后一个或多个是输入参数。至此需要在MATLAB中做的工作结束。

4.VC++中的调用代码编写

(1)库的初始化及关闭。首先要在程序的某个合适的位置 [比如CWinApp::InitInstance ()]加入对Matlab链接库的初始化代码:

mclmcrInitialize();

mclInitializeApplication(NULL,0);

My_LeviInitialize();

另外在程序的退出代码中要关闭链接库以释放资源:(www.xing528.com)

My_LeviTerminate();

mclTerminateApplication();

(2)函数的调用。示例代码如下:

int nLen;

double* data=new double[nLen];

double* ans=new double[nLen];

(完成对nLen和data的赋值

mwArray r(1,nLen,mxDOUBLE_CLASS);

r.SetData(data,nLen);

mwArray A(1,nLen,mxDOUBLE_CLASS);

My_Lrvi (1,A,r);

A.GetData(ans,nLen);

这里演示了C/C++中如何向Matlab调用传递参数以及取回返回值的方法之一。其中data和ans数组分别是在C/C++中的Levinson算法的输入数据和计算结果,矩阵对象r和A 则分别是Matlab中Levinson算法的输入和输出。如果MATLAB要求的类型是矩阵,将C/C++代码的相应变量定义为多维数组即可。

5.配置VC++项目设置

上述代码编写好后,还无法编译链接,因为VC++默认的项目属性中缺少必要的信息,必须手工修改。

打开项目属性设置对话框,作如下修改:

(1)添加Matlab外部包含文件和库文件所在的本机路径,包括<MATLAB>\extern\lib\win32\microsoft,<MATLAB>\extern\include\win32,<MATLAB>\extern\include。若是64位操作系统应将win32子目录改为win64子目录;

(2)在链接器属性之附加依赖项中添加必需的2 个库文件,即mclmcrrt.lib和My_Levi.lib。注意现在的Matlab 2010b 运行时刻附加库只需要mclmcrrt.lib,不再需要老版的libmat.lib、libmex.lib 等库文件。

(3)如果是要运行在64位操作系统上,还要做以下修改:在链接器属性之高级选项中选择目标计算机为MACHINE:X64。在解决方案平台的配置管理器中新建一个目标为X64的平台,然后切换到这个新的X64平台。

上述的编程和配置工作完成后就可以进行编译链接,生成可执行文件了。

6.软件的安装

在向用户计算机上安装上述包含对MATLAB 的Levinson算法调用的软件时,安装程序必须复制My_Levi.dll文件到软件的安装目录。另外在没有安装MATLAB 的计算机上还要安装一个通用的MATLAB 的编译器运行时刻库MCR。MCR 的安装十分简单,MATLAB提供了相应的安装程序MCRInstaller.exe,只要在软件的安装程序中包括对它的运行安装即可。至此,按上述方法开发的软件就可以在没有安装MATLAB的系统上独立运行。

免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。

我要反馈