C#与MATLAB混合编程在水闸数字化设计系统中的应用

2017-01-10 12:54刘廷
河北水利 2016年5期
关键词:水闸遗传算法编程

□刘廷

C#与MATLAB混合编程在水闸数字化设计系统中的应用

□刘廷

为了实现水闸的优化设计,本文在分析C#和MATLAB各自编程优缺点的基础上,结合MATLAB遗传算法工具箱在水闸数字化设计系统中的应用,详细介绍了C#与MATLAB混合编程的过程,并用具体的工程实例证明了该方法的可行性及正确性。

C#;MATLAB;混合编程;水闸;遗传算法

Microsoft Visual C#和MATLAB分别是Microsoft公司和Math Works公司开发的两种高级编程语言,在程序设计上优势各异,为了最大程度上实现二者的优势互补,提高编程效率,本文以MATLAB 2011与VS2010作为开发环境,以MATLAB遗传算法工具箱在水闸数字化设计系统中的应用为例详细讲解了MATLAB 2011与VS2010混合编程的流程和其中应注意的问题。

1.C#与MATLAB混合编程

C#与MATLAB混合编程有多种实现方法,本文采用灵活性较好、集成度较高的动态链接库技术实现C#对MATLAB函数的调用。

1.1 MATLAB创建动态链接库(DLL)

在MATLAB 2011版本中,已经对.NET混合编程提供了良好的接口和编程向导,具体步骤为:在Command Window窗口内输入“deploytool”,在弹出的Deployment Project对话框中输入工程名称、存储位置等,并在Type下拉框中选择“.Net Assembly”类型,然后,在弹出的.Net Assembly对话框中,点击[Add class]创建新类ycsf,并将提前准备好的遗传算法函数主文件(ycsf.m)添加到新建的ycsf类中,单击Build按钮等待编译完成即可生成ycsf.dll文件。

1.2 C#调用动态链接库(DLL)

在已经创建的C#项目工程的解决方案资源管理器中,添加引用,选择

1.1 中创建好的ycsf.dll文件,并在程序代码的头文件部分添加using ycsf。因为ycsf.dll本质上是把ycsf.m函数封装在ycsf类中生成的一个类库,所以,使用该函数前必须首先进行实例化。

1.3 数据类型转换

由于C#与MATLAB的数据类型不同,所以为实现二者之间数据类型的相互转换,需要按照1.2的步骤添加对MWArray的引用,并在C#的头文件中添加using MathWorks.MATLAB.NET. Arrays和using MathWorks.MATLAB. NET.Utility。

优化前后结果表

C#数据向MATLAB数据转换:若C#数据是int、double、float、char等非数组型的变量则可以直接传递给MATLAB,若C#数据是数组类型,则再根据是什么类型的数组变量先传递给对应的MWArray子类(如MWNumericArray、MWCharArray等),再通过这些子类传递给MWArray类型的变量。

MATLAB数据向C#数据转换:MATLAB输出的数据与输入的数据一样,都是MWArray类型,所以C#中接收到的MATLAB返回的数据必须先强制转换为MWArray对应的子类型,再转换成C#中的数据类型。

2.应用实例

本文以位于清凉江侧江河干渠渠首的某水闸为例,设计流量45m3/s,闸下设计水位17.731m,上游设计挡水位为清凉江10年一遇洪水位17.88m,将过闸总净宽(x1)、闸墩厚度(x2)、闸室长度(x3)、闸门位置(x4)、闸底板厚度(x5)、铺盖长度(x6)6个变量作为基本优化变量,以水闸总造价最小为目标函数F(x),考虑了规范所规定的各种约束条件,优化时对典型剖面做了适当简化,通过C#与MATLAB混合编程建立了水闸的优化设计模型,并实现了预期的效果。优化结果见下表。

3.结论

本文以MATLAB遗传算法工具箱在水闸数字化设计系统闸室的优化计算中的应用为例,详细讲解了MATLAB与C#混合编程的流程以及应注意的问题,并通过实例验证了整个流程的可行性和正确性,这对非计算机专业的技术人员来说具有很大的实用价值,因此,C#与MATLAB混合编程的思路具有一定的参考价值和较好的应用范围。□

2016-05-06

刘廷,男,汉族,河北省水利水电第二勘测设计研究院,工程师。

猜你喜欢
水闸遗传算法编程
编程,是一种态度
元征X-431实测:奔驰发动机编程
编程小能手
纺织机上诞生的编程
水闸翼墙地基处理设计研究
一种基于遗传算法的聚类分析方法在DNA序列比较中的应用
2016年河南省已建成水闸数量
全省已建成水闸数量
软件发布规划的遗传算法实现与解释
基于改进的遗传算法的模糊聚类算法