雷芳華,孫 寧,劉博良
(桂林電子科技大學(xué) 機(jī)電工程學(xué)院,廣西 桂林541004)
在工程計(jì)算中,多數(shù)工程的實(shí)現(xiàn)幾乎都要涉及多目標(biāo)函數(shù)的優(yōu)化,常規(guī)的解決辦法是運(yùn)用MATLAB或VC++軟件進(jìn)行編程計(jì)算,但目前這些軟件都還存在一些不足。一方面MATLAB雖有強(qiáng)大的計(jì)算能力和強(qiáng)大的數(shù)據(jù)處理能力,但是由于程序不能脫離其MATLAB環(huán)境運(yùn)行,限制了程序的通用性和應(yīng)用開發(fā),不利于后續(xù)編程;另一方面Visual C++程序的代碼運(yùn)行效率高,界面設(shè)置交互性也比較好,但是由于在函數(shù)計(jì)算能力方面的不足,很大程度上加大了編程人員對(duì)一般數(shù)學(xué)函數(shù)和算法的工作量。通過合適的編譯器,結(jié)合MATLAB和Visual C++混合編程能有助于界面開發(fā)和代碼重用,而且算法精確度高,可擴(kuò)展性強(qiáng),混合編程連接性較好[1]。
近年來隨著動(dòng)力總成懸置系統(tǒng)設(shè)計(jì)工程的發(fā)展,絕大部分研發(fā)人員在系統(tǒng)設(shè)計(jì)時(shí)以系統(tǒng)的固有頻率和解耦程度為合理設(shè)計(jì)目標(biāo),運(yùn)用MATLAB的GUI界面實(shí)現(xiàn)優(yōu)化面板設(shè)計(jì),這在一定程度上可以很好地提高運(yùn)算能力,但卻制約了程序升級(jí)和改進(jìn)的可擴(kuò)展性能力。針對(duì)這些工程問題,本文提出了一種基于MATCOM轉(zhuǎn)換法的VC++與MATLAB混合編程。傳統(tǒng)的VC++與MATLAB混合編程一般是在VC++環(huán)境下調(diào)用MATLAB編寫的函數(shù),在函數(shù)參數(shù)傳遞方面多用MATLAB編寫優(yōu)化算法函數(shù),總是將目標(biāo)函數(shù)的匿名函數(shù)作為其參數(shù)之一,以此來達(dá)到優(yōu)化目標(biāo)函數(shù)的目的。然而在C++語言中是不能將函數(shù)作為參數(shù)調(diào)用的,關(guān)于VC++與MATLAB混編參數(shù)調(diào)用這方面的文章也相當(dāng)少,本文提出了一種解決上述參數(shù)調(diào)用的方法。由于混編后的程序可以脫離MATLAB運(yùn)行,程序的速度和效率都得到了極大的提升。本文充分發(fā)揮MATCOM轉(zhuǎn)換法的優(yōu)勢(shì),將高難度的算法研究與實(shí)際應(yīng)用結(jié)合在一起,達(dá)到了程序簡潔、編程效率提高和算法更易實(shí)現(xiàn)的目的。
一般情況下,都是把動(dòng)力總成視為剛體,同時(shí)把動(dòng)力總成懸置系統(tǒng)視為有3個(gè)移動(dòng)自由度和3個(gè)轉(zhuǎn)動(dòng)自由度的一個(gè)空間6自由度振動(dòng)系統(tǒng),對(duì)應(yīng)6個(gè)模態(tài),包括前后移動(dòng)模態(tài)、左右移動(dòng)模態(tài)、上下移動(dòng)模態(tài)、橫向轉(zhuǎn)動(dòng)模態(tài)、縱向轉(zhuǎn)動(dòng)模態(tài)和左右轉(zhuǎn)動(dòng)模態(tài),懸置系統(tǒng)模型如圖1所示。
在動(dòng)力總成上建立一個(gè)動(dòng)坐標(biāo)系G0-XYZ,原點(diǎn)G0位于動(dòng)力總成質(zhì)心,系統(tǒng)動(dòng)力模型通過三個(gè)具有三向彈性(阻尼)的元器件支承,剛體的廣義坐標(biāo)為 x、y、z及繞X、Y、Z 軸的轉(zhuǎn)動(dòng) θx、θy、θz,記做 q。 在懸置系統(tǒng)中,阻尼能有效地減少系統(tǒng)的振動(dòng),由于阻尼對(duì)固有頻率和解耦程度的影響較小,一般可以忽略不計(jì)。可以根據(jù)上述動(dòng)力總成懸置系統(tǒng)力學(xué)模型建立6自由度無阻尼自由振動(dòng)方程:
目前應(yīng)用比較普遍的模態(tài)解耦度評(píng)價(jià)指標(biāo)是用模態(tài)的能量比值概念來表示的。第j階振型中第k個(gè)自由度的振動(dòng)能量占該階運(yùn)動(dòng)總能量的百分比可以表示為:
式中 φj為第 j階振型向量,ek為第 k個(gè)元素為 1的 6階單位列向量。
在一個(gè)頻率下,一個(gè)模態(tài)能量占到總能量的98%即表明這個(gè)模態(tài)能量非常強(qiáng),在實(shí)際工程中,一般情況是難以達(dá)到這種解耦度的。一般來說,如果在某個(gè)頻率下,一個(gè)模態(tài)的能量占到總能量的85%以上,則這個(gè)模態(tài)與其他模態(tài)的解耦程度被視為滿意,對(duì)于橫向轉(zhuǎn)動(dòng)模態(tài)一般要求要高些,期望達(dá)到90%以上[2]。
MATCOM是MathWorks公司開發(fā)的為MATLAB中的m文件進(jìn)行高效解釋和調(diào)試的集成開發(fā)環(huán)境。MATCOM最主要的功能是能夠?qū)文件按照與C++語法的對(duì)應(yīng)關(guān)系翻譯為cpp源代碼,并通過Visual C++將其編譯成可執(zhí)行程序(exe)或動(dòng)態(tài)鏈接庫(dll),這樣既保持了C++的優(yōu)良算法,又保持了C++的高執(zhí)行效率。
利用MATCOM實(shí)現(xiàn)MATLAB與VC++之間的混合編程,具體實(shí)現(xiàn)方法有以下3種可供選擇:
(1)利用MATCOM生成獨(dú)立執(zhí)行的exe文件。但不能脫離MATLAB的后臺(tái)支持;
(2)利用MATCOM生成動(dòng)態(tài)鏈接庫(dll)文件;
(3)利用MATCOM的組件VisualMatcom實(shí)現(xiàn)在Visual C++6.0環(huán)境中直接對(duì)m文件進(jìn)行編譯,這種方法與第二種十分相似,但應(yīng)用起來更為簡便[3]。
為了實(shí)現(xiàn)MATLAB與VC++之間的混合編程,本文采用第二種方法,以 MATLAB 7.1、MATCOM 4.5、VC++6.0和Windows XP為操作環(huán)境,具體轉(zhuǎn)化法如圖2所示。
圖2 MATCOM轉(zhuǎn)化法示意圖
采用第二種MATCOM轉(zhuǎn)化法,結(jié)合算例,將MATLAB中計(jì)算函數(shù)的m文件轉(zhuǎn)化為VC++可識(shí)別的文件;接著,通過創(chuàng)建VC++工程,將所需文件加入工程目錄中。
本文將針對(duì)某國產(chǎn)自動(dòng)檔車型的振動(dòng)問題,分析基于遺傳算法的動(dòng)力總成懸置系統(tǒng)多目標(biāo)剛度優(yōu)化,優(yōu)化的目標(biāo)為9個(gè)剛度設(shè)計(jì)變量,以解耦度最大為最佳優(yōu)化目標(biāo),此平臺(tái)采用加權(quán)系數(shù)法對(duì)6自由度解耦度進(jìn)行加權(quán),形成適應(yīng)度函數(shù)如下:
式中 w1,w2,…,w6為權(quán)值,且 w1+w2+…+w6=1,digi表示 i方向上最大解耦度(i=1,2,…,6)。
基于遺傳算法,優(yōu)化的目標(biāo)是使得f適應(yīng)度值最大,交叉概率和變異概率分別取0.3、0.2,種群染色體個(gè)數(shù)設(shè)置為30,優(yōu)化代數(shù)設(shè)置為400,約束條件設(shè)置固有頻率在6 Hz~18 Hz之間,相鄰固有頻率最小為1 Hz。為了便于動(dòng)態(tài)分析和實(shí)現(xiàn)混合編程,同時(shí)給出了懸置系統(tǒng)的基本參數(shù)。表1是動(dòng)力總成質(zhì)量和慣性參數(shù),表2為懸置系統(tǒng)位置和安裝方向角參數(shù)。
表1 懸置系統(tǒng)的慣性參數(shù)
表2 懸置系統(tǒng)的位置和安裝方向角
實(shí)現(xiàn)方法是運(yùn)用MATCOM生成動(dòng)態(tài)鏈接庫文件,這種方法在實(shí)際工程中使用較多,運(yùn)用也比較靈活,易于實(shí)現(xiàn)MATLAB與VC++之間的函數(shù)、參數(shù)之間的傳遞。最好的情況是能直接使用MATCOM編譯生成cpp文件,而不是直接使用dll文件[4]。下面以懸置系統(tǒng)優(yōu)化為例進(jìn)行說明,步驟如下:
(1)在 MATLAB中生成 m源文件,通過 MATCOM編譯器在當(dāng)前目錄文件夾中生成三種4個(gè)VC++可識(shí)別的文件,然后添加到VC++工程目錄下。在實(shí)現(xiàn)混合編程之前,根據(jù)MATLAB編程規(guī)則,在軟件中實(shí)現(xiàn)編寫求解固有頻率和解耦度的m程序文件,其程序主要部分如下所示:
其中,m2、X、U、r、J為輸入數(shù)組,是從 VC++編輯框輸入傳給jieoudu函數(shù)的要進(jìn)行求解固有頻率和解耦度的參數(shù),特別需要注意的是逆矩陣函數(shù)和eig函數(shù),如果這兩個(gè)函數(shù)在C++中實(shí)現(xiàn),需要編輯大量的語句才能實(shí)現(xiàn)。
(2)創(chuàng)建一個(gè)名為 youhuapingtai,基于對(duì)話框的 MFC(exe)工程。
(3)將MATCOM編譯器生成的4個(gè)文件拷貝到建立的工程youhuapingtai目錄下。然后將拷貝的4個(gè)文件加入到VC工程中:工程→添加工程→文件。
(4)在youhuapingtaiDlg.cpp中進(jìn)行主要程序編輯,其主要代碼如下所示:
在函數(shù) static void initialization()中,傳遞一個(gè) cyunxingdlg類型的指針變量 ,編寫了如下主要隨機(jī)生成初始數(shù)據(jù)的子程序:
(5)一般在這種情況下編譯會(huì)出現(xiàn)下列錯(cuò)誤:fatal error C1010:unexpected end of file while looking for precompiled header directive。因此,需要進(jìn)行下列設(shè)置:工程→設(shè)置→C/C++,選擇precompiled headers選擇第一或第二項(xiàng):自動(dòng)選擇預(yù)補(bǔ)償頁眉。執(zhí)行即可通過編譯。
(6)運(yùn)行程序,輸入?yún)?shù),點(diǎn)擊“優(yōu)化計(jì)算”按鈕,再點(diǎn)擊“顯示優(yōu)化結(jié)果”,出現(xiàn)計(jì)算結(jié)果顯示平臺(tái)。
應(yīng)用MATCOM轉(zhuǎn)化法改進(jìn)MATLAB和VC++的混合編程的不足,如對(duì)class數(shù)據(jù)類型部分支持eval、feval等語句不能在C++中實(shí)現(xiàn)、圖形窗口有些不盡人意等問題,在編程過程中,已經(jīng)避免了運(yùn)行出現(xiàn)以上的問題。
軟件平臺(tái)是基于MATCOM轉(zhuǎn)化法的混合編程,在運(yùn)算時(shí),明顯能感到其計(jì)算速度和效率的提高。結(jié)果中,固有頻率和解耦度的輸出結(jié)果也是相當(dāng)滿意的,在6個(gè)固有頻率下,各模態(tài)的能量解耦度都能占到90%以上。
本文通過懸置系統(tǒng)優(yōu)化平臺(tái)無縫結(jié)合的實(shí)踐運(yùn)用,以及平臺(tái)的穩(wěn)定測(cè)試,解決了VC++在解決矩陣處理問題上的弊端,簡化了編寫程序的復(fù)雜性,同時(shí)也有效地提高了MATLAB在可移植性的底層編程功能和界面開發(fā)能力,對(duì)復(fù)雜算法的系統(tǒng)開發(fā)提供了一種強(qiáng)有力的技術(shù)支持?;贛ATCOM轉(zhuǎn)化法的VC++與MATLAB混合編程,其程序代碼在編譯后封裝于鏈接庫中,因此也有利于保護(hù)軟件的著作權(quán)。
[1]繩曉玲,萬書亭.MATLAB與VC混合編程及在振動(dòng)故障分析中的應(yīng)用[J].儀器儀表與分析監(jiān)測(cè),2011(2):25-27.
[2]龐劍,何華.汽車噪聲與振動(dòng)-理論與應(yīng)用[M].北京:北京理工大學(xué)出版社,2006:280-283.
[3]王毅,樊明,何聯(lián).基于 Matcom的 MATLAB與 VC++混合編程分析[J].哈爾濱商業(yè)大學(xué)學(xué)報(bào),2007,23(3):311-314.
[4]聞斌,崔建昆.MATLAB與Visual C++的聯(lián)合應(yīng)用[J].計(jì)算機(jī)與現(xiàn)代化,2004(2):14-15.
[5]劉維.精通 MATLAB與 C/C++混合程序設(shè)計(jì)[M].北京:北京航空航天大學(xué)出版社,2008:257-315.