□劉廷
C#與MATLAB混合編程在水閘數(shù)字化設(shè)計系統(tǒng)中的應(yīng)用
□劉廷
為了實現(xiàn)水閘的優(yōu)化設(shè)計,本文在分析C#和MATLAB各自編程優(yōu)缺點的基礎(chǔ)上,結(jié)合MATLAB遺傳算法工具箱在水閘數(shù)字化設(shè)計系統(tǒng)中的應(yīng)用,詳細(xì)介紹了C#與MATLAB混合編程的過程,并用具體的工程實例證明了該方法的可行性及正確性。
C#;MATLAB;混合編程;水閘;遺傳算法
Microsoft Visual C#和MATLAB分別是Microsoft公司和Math Works公司開發(fā)的兩種高級編程語言,在程序設(shè)計上優(yōu)勢各異,為了最大程度上實現(xiàn)二者的優(yōu)勢互補,提高編程效率,本文以MATLAB 2011與VS2010作為開發(fā)環(huán)境,以MATLAB遺傳算法工具箱在水閘數(shù)字化設(shè)計系統(tǒng)中的應(yīng)用為例詳細(xì)講解了MATLAB 2011與VS2010混合編程的流程和其中應(yīng)注意的問題。
C#與MATLAB混合編程有多種實現(xiàn)方法,本文采用靈活性較好、集成度較高的動態(tài)鏈接庫技術(shù)實現(xiàn)C#對MATLAB函數(shù)的調(diào)用。
1.1 MATLAB創(chuàng)建動態(tài)鏈接庫(DLL)
在MATLAB 2011版本中,已經(jīng)對.NET混合編程提供了良好的接口和編程向?qū)В唧w步驟為:在Command Window窗口內(nèi)輸入“deploytool”,在彈出的Deployment Project對話框中輸入工程名稱、存儲位置等,并在Type下拉框中選擇“.Net Assembly”類型,然后,在彈出的.Net Assembly對話框中,點擊[Add class]創(chuàng)建新類ycsf,并將提前準(zhǔn)備好的遺傳算法函數(shù)主文件(ycsf.m)添加到新建的ycsf類中,單擊Build按鈕等待編譯完成即可生成ycsf.dll文件。
1.2 C#調(diào)用動態(tài)鏈接庫(DLL)
在已經(jīng)創(chuàng)建的C#項目工程的解決方案資源管理器中,添加引用,選擇
1.1 中創(chuàng)建好的ycsf.dll文件,并在程序代碼的頭文件部分添加using ycsf。因為ycsf.dll本質(zhì)上是把ycsf.m函數(shù)封裝在ycsf類中生成的一個類庫,所以,使用該函數(shù)前必須首先進(jìn)行實例化。
1.3 數(shù)據(jù)類型轉(zhuǎn)換
由于C#與MATLAB的數(shù)據(jù)類型不同,所以為實現(xiàn)二者之間數(shù)據(jù)類型的相互轉(zhuǎn)換,需要按照1.2的步驟添加對MWArray的引用,并在C#的頭文件中添加using MathWorks.MATLAB.NET. Arrays和using MathWorks.MATLAB. NET.Utility。
優(yōu)化前后結(jié)果表
C#數(shù)據(jù)向MATLAB數(shù)據(jù)轉(zhuǎn)換:若C#數(shù)據(jù)是int、double、float、char等非數(shù)組型的變量則可以直接傳遞給MATLAB,若C#數(shù)據(jù)是數(shù)組類型,則再根據(jù)是什么類型的數(shù)組變量先傳遞給對應(yīng)的MWArray子類(如MWNumericArray、MWCharArray等),再通過這些子類傳遞給MWArray類型的變量。
MATLAB數(shù)據(jù)向C#數(shù)據(jù)轉(zhuǎn)換:MATLAB輸出的數(shù)據(jù)與輸入的數(shù)據(jù)一樣,都是MWArray類型,所以C#中接收到的MATLAB返回的數(shù)據(jù)必須先強制轉(zhuǎn)換為MWArray對應(yīng)的子類型,再轉(zhuǎn)換成C#中的數(shù)據(jù)類型。
本文以位于清涼江側(cè)江河干渠渠首的某水閘為例,設(shè)計流量45m3/s,閘下設(shè)計水位17.731m,上游設(shè)計擋水位為清涼江10年一遇洪水位17.88m,將過閘總凈寬(x1)、閘墩厚度(x2)、閘室長度(x3)、閘門位置(x4)、閘底板厚度(x5)、鋪蓋長度(x6)6個變量作為基本優(yōu)化變量,以水閘總造價最小為目標(biāo)函數(shù)F(x),考慮了規(guī)范所規(guī)定的各種約束條件,優(yōu)化時對典型剖面做了適當(dāng)簡化,通過C#與MATLAB混合編程建立了水閘的優(yōu)化設(shè)計模型,并實現(xiàn)了預(yù)期的效果。優(yōu)化結(jié)果見下表。
本文以MATLAB遺傳算法工具箱在水閘數(shù)字化設(shè)計系統(tǒng)閘室的優(yōu)化計算中的應(yīng)用為例,詳細(xì)講解了MATLAB與C#混合編程的流程以及應(yīng)注意的問題,并通過實例驗證了整個流程的可行性和正確性,這對非計算機專業(yè)的技術(shù)人員來說具有很大的實用價值,因此,C#與MATLAB混合編程的思路具有一定的參考價值和較好的應(yīng)用范圍。□
2016-05-06
劉廷,男,漢族,河北省水利水電第二勘測設(shè)計研究院,工程師。