《电子技术应用》
您所在的位置:首页 > 嵌入式技术 > 设计应用 > MATLAB与VC++混合编程在悬置系统优化平台中的应用
MATLAB与VC++混合编程在悬置系统优化平台中的应用
来源:微型机与应用2012年第4期
雷芳华,孙 宁,刘博良
(桂林电子科技大学 机电工程学院,广西 桂林541004)
摘要: 首先分析了MATLAB与VC++在悬置系统优化设计编程方面的优缺点,接着阐述了悬置系统的优化设计和MATCOM转化法的基本原理,给出了求解固有特性的m文件,通过创建优化平台,结合算例和操作步骤进行混合编程,详细地提出了一种高效的优化设计编程方法。通过在系统平台的应用,表明MATCOM转化法混合编程能无缝结合,大大缩短了优化设计的周期,提高了效率。
Abstract:
Key words :

摘  要: 首先分析了MATLABVC++在悬置系统优化设计编程方面的优缺点,接着阐述了悬置系统的优化设计和MATCOM转化法的基本原理,给出了求解固有特性的m文件,通过创建优化平台,结合算例和操作步骤进行混合编程,详细地提出了一种高效的优化设计编程方法。通过在系统平台的应用,表明MATCOM转化法混合编程能无缝结合,大大缩短了优化设计的周期,提高了效率。
关键词: MATLAB;VC++;混合编程;优化设计;解耦

    在工程计算中,多数工程的实现几乎都要涉及多目标函数的优化,常规的解决办法是运用MATLAB或VC++软件进行编程计算,但目前这些软件都还存在一些不足。一方面MATLAB虽有强大的计算能力和强大的数据处理能力,但是由于程序不能脱离其MATLAB环境运行,限制了程序的通用性和应用开发,不利于后续编程;另一方面Visual C++程序的代码运行效率高,界面设置交互性也比较好,但是由于在函数计算能力方面的不足,很大程度上加大了编程人员对一般数学函数和算法的工作量。通过合适的编译器,结合MATLAB和Visual C++混合编程能有助于界面开发和代码重用,而且算法精确度高,可扩展性强,混合编程连接性较好[1]。
    近年来随着动力总成悬置系统设计工程的发展,绝大部分研发人员在系统设计时以系统的固有频率和解耦程度为合理设计目标,运用MATLAB的GUI界面实现优化面板设计,这在一定程度上可以很好地提高运算能力,但却制约了程序升级和改进的可扩展性能力。针对这些工程问题,本文提出了一种基于MATCOM转换法的VC++与MATLAB混合编程。传统的VC++与MATLAB混合编程一般是在VC++环境下调用MATLAB编写的函数,在函数参数传递方面多用MATLAB编写优化算法函数,总是将目标函数的匿名函数作为其参数之一,以此来达到优化目标函数的目的。然而在C++语言中是不能将函数作为参数调用的,关于VC++与MATLAB混编参数调用这方面的文章也相当少,本文提出了一种解决上述参数调用的方法。由于混编后的程序可以脱离MATLAB运行,程序的速度和效率都得到了极大的提升。本文充分发挥MATCOM转换法的优势,将高难度的算法研究与实际应用结合在一起,达到了程序简洁、编程效率提高和算法更易实现的目的。
1 悬置系统优化分析
1.1 悬置系统优化原理分析

    一般情况下,都是把动力总成视为刚体,同时把动力总成悬置系统视为有3个移动自由度和3个转动自由度的一个空间6自由度振动系统,对应6个模态,包括前后移动模态、左右移动模态、上下移动模态、横向转动模态、纵向转动模态和左右转动模态,悬置系统模型如图1所示。

 
    目前应用比较普遍的模态解耦度评价指标是用模态的能量比值概念来表示的。第j阶振型中第k个自由度的振动能量占该阶运动总能量的百分比可以表示为:
    

    采用第二种MATCOM转化法,结合算例,将MATLAB中计算函数的m文件转化为VC++可识别的文件;接着,通过创建VC++工程,将所需文件加入工程目录中。
2 VC++与MATLAB混合编程的实现

 


2.1 算例分析

    本文将针对某国产自动档车型的振动问题,分析基于遗传算法的动力总成悬置系统多目标刚度优化,优化的目标为9个刚度设计变量,以解耦度最大为最佳优化目标,此平台采用加权系数法对6自由度解耦度进行加权,形成适应度函数如下:
    
    基于遗传算法,优化的目标是使得f适应度值最大,交叉概率和变异概率分别取0.3、0.2,种群染色体个数设置为30,优化代数设置为400,约束条件设置固有频率在6 Hz~18 Hz之间,相邻固有频率最小为1 Hz。为了便于动态分析和实现混合编程,同时给出了悬置系统的基本参数。表1是动力总成质量和惯性参数,表2为悬置系统位置和安装方向角参数。


2.2 实现混合编程
    实现方法是运用MATCOM生成动态链接库文件,这种方法在实际工程中使用较多,运用也比较灵活,易于实现MATLAB与VC++之间的函数、参数之间的传递。最好的情况是能直接使用MATCOM编译生成cpp文件,而不是直接使用dll文件[4]。下面以悬置系统优化为例进行说明,步骤如下:
    (1)在MATLAB中生成m源文件,通过MATCOM编译器在当前目录文件夹中生成三种4个VC++可识别的文件,然后添加到VC++工程目录下。在实现混合编程之前,根据MATLAB编程规则,在软件中实现编写求解固有频率和解耦度的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为系统的刚度矩阵,其中 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++中实现,需要编辑大量的语句才能实现。
    (2)创建一个名为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中定义了的常量,它保证了动态链接库与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循环来处理约束条件
          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)一般在这种情况下编译会出现下列错误:fatal error C1010:unexpected end of file while looking for precompiled header directive。因此,需要进行下列设置:工程→设置→C/C++,选择precompiled headers 选择第一或第二项:自动选择预补偿页眉。执行即可通过编译。
    (6)运行程序,输入参数,点击“优化计算”按钮,再点击“显示优化结果”,出现计算结果显示平台。
    应用MATCOM转化法改进MATLAB和VC++的混合编程的不足,如对class数据类型部分支持eval、feval等语句不能在C++中实现、图形窗口有些不尽人意等问题,在编程过程中,已经避免了运行出现以上的问题。
    软件平台是基于MATCOM转化法的混合编程,在运算时,明显能感到其计算速度和效率的提高。结果中,固有频率和解耦度的输出结果也是相当满意的,在6个固有频率下,各模态的能量解耦度都能占到90%以上。
    本文通过悬置系统优化平台无缝结合的实践运用,以及平台的稳定测试,解决了VC++在解决矩阵处理问题上的弊端,简化了编写程序的复杂性,同时也有效地提高了MATLAB在可移植性的底层编程功能和界面开发能力,对复杂算法的系统开发提供了一种强有力的技术支持。基于MATCOM转化法的VC++与MATLAB混合编程,其程序代码在编译后封装于链接库中,因此也有利于保护软件的著作权。
参考文献
[1] 绳晓玲,万书亭.MATLAB与VC混合编程及在振动故障分析中的应用[J].仪器仪表与分析监测,2011(2):25-27.
[2] 庞剑,何华.汽车噪声与振动-理论与应用[M].北京:北京理工大学出版社,2006:280-283.
[3] 王毅,樊明,何联.基于Matcom的MATLAB与VC++混合编程分析[J].哈尔滨商业大学学报,2007,23(3):311-314.
[4] 闻斌,崔建昆.MATLAB与Visual C++的联合应用[J].计算机与现代化,2004(2):14-15.
[5] 刘维.精通MATLAB与C/C++混合程序设计[M].北京:北京航空航天大学出版社,2008:257-315.

此内容为AET网站原创,未经授权禁止转载。