摘 要: 首先分析了MATLAB與VC++在懸置系統(tǒng)優(yōu)化設計編程方面的優(yōu)缺點,接著闡述了懸置系統(tǒng)的優(yōu)化設計和MATCOM轉化法的基本原理,,給出了求解固有特性的m文件,,通過創(chuàng)建優(yōu)化平臺,結合算例和操作步驟進行混合編程,,詳細地提出了一種高效的優(yōu)化設計編程方法,。通過在系統(tǒng)平臺的應用,表明MATCOM轉化法混合編程能無縫結合,,大大縮短了優(yōu)化設計的周期,,提高了效率。
關鍵詞: MATLAB,;VC++,;混合編程;優(yōu)化設計,;解耦
在工程計算中,,多數工程的實現(xiàn)幾乎都要涉及多目標函數的優(yōu)化,常規(guī)的解決辦法是運用MATLAB或VC++軟件進行編程計算,,但目前這些軟件都還存在一些不足,。一方面MATLAB雖有強大的計算能力和強大的數據處理能力,但是由于程序不能脫離其MATLAB環(huán)境運行,,限制了程序的通用性和應用開發(fā),,不利于后續(xù)編程;另一方面Visual C++程序的代碼運行效率高,,界面設置交互性也比較好,,但是由于在函數計算能力方面的不足,很大程度上加大了編程人員對一般數學函數和算法的工作量,。通過合適的編譯器,,結合MATLAB和Visual C++混合編程能有助于界面開發(fā)和代碼重用,,而且算法精確度高,可擴展性強,,混合編程連接性較好[1],。
近年來隨著動力總成懸置系統(tǒng)設計工程的發(fā)展,絕大部分研發(fā)人員在系統(tǒng)設計時以系統(tǒng)的固有頻率和解耦程度為合理設計目標,,運用MATLAB的GUI界面實現(xiàn)優(yōu)化面板設計,,這在一定程度上可以很好地提高運算能力,但卻制約了程序升級和改進的可擴展性能力,。針對這些工程問題,,本文提出了一種基于MATCOM轉換法的VC++與MATLAB混合編程。傳統(tǒng)的VC++與MATLAB混合編程一般是在VC++環(huán)境下調用MATLAB編寫的函數,,在函數參數傳遞方面多用MATLAB編寫優(yōu)化算法函數,,總是將目標函數的匿名函數作為其參數之一,以此來達到優(yōu)化目標函數的目的,。然而在C++語言中是不能將函數作為參數調用的,,關于VC++與MATLAB混編參數調用這方面的文章也相當少,本文提出了一種解決上述參數調用的方法,。由于混編后的程序可以脫離MATLAB運行,,程序的速度和效率都得到了極大的提升。本文充分發(fā)揮MATCOM轉換法的優(yōu)勢,,將高難度的算法研究與實際應用結合在一起,,達到了程序簡潔、編程效率提高和算法更易實現(xiàn)的目的,。
1 懸置系統(tǒng)優(yōu)化分析
1.1 懸置系統(tǒng)優(yōu)化原理分析
一般情況下,,都是把動力總成視為剛體,同時把動力總成懸置系統(tǒng)視為有3個移動自由度和3個轉動自由度的一個空間6自由度振動系統(tǒng),,對應6個模態(tài),,包括前后移動模態(tài)、左右移動模態(tài),、上下移動模態(tài),、橫向轉動模態(tài)、縱向轉動模態(tài)和左右轉動模態(tài),,懸置系統(tǒng)模型如圖1所示,。
目前應用比較普遍的模態(tài)解耦度評價指標是用模態(tài)的能量比值概念來表示的。第j階振型中第k個自由度的振動能量占該階運動總能量的百分比可以表示為:
采用第二種MATCOM轉化法,,結合算例,,將MATLAB中計算函數的m文件轉化為VC++可識別的文件;接著,通過創(chuàng)建VC++工程,,將所需文件加入工程目錄中,。
2 VC++與MATLAB混合編程的實現(xiàn)
2.1 算例分析
本文將針對某國產自動檔車型的振動問題,分析基于遺傳算法的動力總成懸置系統(tǒng)多目標剛度優(yōu)化,,優(yōu)化的目標為9個剛度設計變量,以解耦度最大為最佳優(yōu)化目標,,此平臺采用加權系數法對6自由度解耦度進行加權,,形成適應度函數如下:
基于遺傳算法,優(yōu)化的目標是使得f適應度值最大,,交叉概率和變異概率分別取0.3,、0.2,種群染色體個數設置為30,,優(yōu)化代數設置為400,,約束條件設置固有頻率在6 Hz~18 Hz之間,相鄰固有頻率最小為1 Hz,。為了便于動態(tài)分析和實現(xiàn)混合編程,,同時給出了懸置系統(tǒng)的基本參數。表1是動力總成質量和慣性參數,,表2為懸置系統(tǒng)位置和安裝方向角參數,。
2.2 實現(xiàn)混合編程
實現(xiàn)方法是運用MATCOM生成動態(tài)鏈接庫文件,這種方法在實際工程中使用較多,,運用也比較靈活,,易于實現(xiàn)MATLAB與VC++之間的函數、參數之間的傳遞,。最好的情況是能直接使用MATCOM編譯生成cpp文件,,而不是直接使用dll文件[4]。下面以懸置系統(tǒng)優(yōu)化為例進行說明,,步驟如下:
(1)在MATLAB中生成m源文件,,通過MATCOM編譯器在當前目錄文件夾中生成三種4個VC++可識別的文件,然后添加到VC++工程目錄下,。在實現(xiàn)混合編程之前,,根據MATLAB編程規(guī)則,在軟件中實現(xiàn)編寫求解固有頻率和解耦度的m程序文件,,其程序主要部分如下所示:
function[P,v,s,t]=jieoudu(m2,X,U,r,J)
%定義輸入輸出函數 jieoudu,,P,v,s,t為輸出數組,m2,X,U,r,J為輸入數組
K1=f1′ * t1′ * k1 * t1 * f1;
%K為系統(tǒng)的剛度矩陣,,其中 f1′為求逆矩陣
K2=f2′ * t2′ * k2 * t2 * f2;
K3=f3′ * t3′ * k3 * t3 * f3;
K=K1+K2+K3;
[v,d]=eig(inv(M)*K);
%求特征向量,、特征值
…
其中,m2、X,、U,、r、J為輸入數組,,是從VC++編輯框輸入傳給jieoudu函數的要進行求解固有頻率和解耦度的參數,,特別需要注意的是逆矩陣函數和eig函數,如果這兩個函數在C++中實現(xiàn),,需要編輯大量的語句才能實現(xiàn),。
(2)創(chuàng)建一個名為youhuapingtai,基于對話框的MFC(exe)工程,。
(3)將MATCOM編譯器生成的4個文件拷貝到建立的工程youhuapingtai目錄下,。然后將拷貝的4個文件加入到VC工程中:工程→添加工程→文件。
(4)在youhuapingtaiDlg.cpp中進行主要程序編輯,,其主要代碼如下所示:
#include "matlib.h"
#include "jieoudu.h"
//添加jieoudu函數頭文件static void
initialization(CYouhuapingtaiDlg* dlg);//初始化種群
…
其中,,添加頭文件#include"matlib.h"和#include"jieoudu.h",用于調用由MATLAB編譯的jieoudu庫文件,。
void CYouhuapingtaiDlg::diaoyong()
//定義diaoyong函數
{
dMm (X);dMm (U);dMm (r);dMm (J);dMm (P);dMm (v);
dMm (s);dMm (t);//用Mm來定義矩陣變量[5]
M_VECTOR(X,data1);
//M_VECTOR宏將控件中的矩陣數據傳給函數輸入變量
…
initM(MATCOM_VERSION); //初始化matlib庫,,MATCOM_VERSION是一個在matlib. h中定義了的常量,它保證了動態(tài)鏈接庫與matlib. h相匹配
jieoudu(m2,X,U,r,J,i_o,P,v,s,t);//調用編譯好的MATLAB
程序jieoudu, i_o為分隔符,,前為輸入,,后為輸出
…
exitM(); //調用結束
}
在函數static void initialization()中,傳遞一個cyunxingdlg類型的指針變量 ,,編寫了如下主要隨機生成初始數據的子程序:
static void initialization(CYouhuapingtaiDlg*dlg)
//初始化種群函數
{ for(i=1; i<=POP_SIZE; i++)
{
mark: //運用mark循環(huán)來處理約束條件
x[1]=myu(dlg->m_x11,dlg->m_x12);
//參數取隨機值(染色體賦約束條件
范圍隨機值,,能減少程序計算量)
…
if(constraint_check(x,dlg)==0)
goto mark;
//if語句調用處理約束條件函數
for(j=1; j<=N; j++)
CHROMOSOME[i][j]=x[j];//染色體賦初始值
}
}
(5)一般在這種情況下編譯會出現(xiàn)下列錯誤:fatal error C1010:unexpected end of file while looking for precompiled header directive。因此,,需要進行下列設置:工程→設置→C/C++,,選擇precompiled headers 選擇第一或第二項:自動選擇預補償頁眉。執(zhí)行即可通過編譯,。
(6)運行程序,,輸入參數,點擊“優(yōu)化計算”按鈕,,再點擊“顯示優(yōu)化結果”,,出現(xiàn)計算結果顯示平臺。
應用MATCOM轉化法改進MATLAB和VC++的混合編程的不足,,如對class數據類型部分支持eval,、feval等語句不能在C++中實現(xiàn)、圖形窗口有些不盡人意等問題,,在編程過程中,,已經避免了運行出現(xiàn)以上的問題,。
軟件平臺是基于MATCOM轉化法的混合編程,在運算時,,明顯能感到其計算速度和效率的提高,。結果中,固有頻率和解耦度的輸出結果也是相當滿意的,,在6個固有頻率下,,各模態(tài)的能量解耦度都能占到90%以上。
本文通過懸置系統(tǒng)優(yōu)化平臺無縫結合的實踐運用,,以及平臺的穩(wěn)定測試,,解決了VC++在解決矩陣處理問題上的弊端,簡化了編寫程序的復雜性,,同時也有效地提高了MATLAB在可移植性的底層編程功能和界面開發(fā)能力,對復雜算法的系統(tǒng)開發(fā)提供了一種強有力的技術支持,?;贛ATCOM轉化法的VC++與MATLAB混合編程,其程序代碼在編譯后封裝于鏈接庫中,,因此也有利于保護軟件的著作權,。
參考文獻
[1] 繩曉玲,萬書亭.MATLAB與VC混合編程及在振動故障分析中的應用[J].儀器儀表與分析監(jiān)測,,2011(2):25-27.
[2] 龐劍,,何華.汽車噪聲與振動-理論與應用[M].北京:北京理工大學出版社,2006:280-283.
[3] 王毅,,樊明,,何聯(lián).基于Matcom的MATLAB與VC++混合編程分析[J].哈爾濱商業(yè)大學學報,2007,,23(3):311-314.
[4] 聞斌,,崔建昆.MATLAB與Visual C++的聯(lián)合應用[J].計算機與現(xiàn)代化,2004(2):14-15.
[5] 劉維.精通MATLAB與C/C++混合程序設計[M].北京:北京航空航天大學出版社,,2008:257-315.