📄 fueleconomyview.cpp
字号:
}
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//做曲线
void CFuelEconomyView::DengQuXian()//等速工况曲线
{
int j;
double i=0.0,uamax,uamin,uabox;
uamax=0.377*R*Nmax/(i0*ig[ZHIJIE]);
uamin=0.377*R*Nmin/(i0*ig[ZHIJIE]);
uabox=uamax*90/100;
if(uamin<20)
{i=20;
for(j=0;j<=(uabox-20);j++){
poix[j]=i;
poiy[j]=DengGongKuang(i,ZHIJIE);
i++;
J=j;
}
}
else if(uamin>20)
{i=30;
for(j=0;j<=(uabox-30);j++){
poix[j]=i;
poiy[j]=DengGongKuang(i,ZHIJIE);
i++;
J=j;
}
}
}
void CFuelEconomyView::HuaDengTu(CDC *pDC)
{
DengXY(pDC);
DengQuXian();
for(int i=0;i<J;i++){
Line0(pDC,poix[i]/2,(poiy[i]*5/4)-25,poix[i+1]/2,(poiy[i+1]*5/4)-25,6,RGB(255,0,0));
}
Fontstr(pDC,-140,1600,"楷体_GB2312",40.0f,"40km/h的百公里油耗:");
CString str;
double box;
box=DengGongKuang(40,ZHIJIE);
str.Format("%f",box);
pDC->TextOut(260,1600,str,strlen(str));
Fontstr(pDC,560,1600,"楷体_GB2312",40.0f,"50km/h的百公里油耗:");
box=DengGongKuang(50,ZHIJIE);
str.Format("%f",box);
pDC->TextOut(960,1600,str,strlen(str));
Fontstr(pDC,1260,1600,"楷体_GB2312",40.0f,"60km/h的百公里油耗:");
box=DengGongKuang(60,ZHIJIE);
str.Format("%f",box);
pDC->TextOut(1660,1600,str,strlen(str));
Fontstr(pDC,-140,1500,"楷体_GB2312",40.0f,"70km/h的百公里油耗:");
box=DengGongKuang(70,ZHIJIE);
str.Format("%f",box);
pDC->TextOut(260,1500,str,strlen(str));
Fontstr(pDC,560,1500,"楷体_GB2312",40.0f,"80km/h的百公里油耗:");
box=DengGongKuang(80,ZHIJIE);
str.Format("%f",box);
pDC->TextOut(960,1500,str,strlen(str));
Fontstr(pDC,1260,1500,"楷体_GB2312",40.0f,"90km/h的百公里油耗:");
box=DengGongKuang(90,ZHIJIE);
str.Format("%f",box);
pDC->TextOut(1660,1500,str,strlen(str));
}
//////////////////////??????????????????//////////////
int n_num=20;
double QQbox=0;
void CFuelEconomyView::LiuQuXian()//六工况
{ //左
DengDUAN(40,0,11.3,1,ZHIJIE);
QQbox+=DengGK(40,ZHIJIE,125);
JiaDUAN(40,11.3,25.3,2,ZHIJIE,0.2);
QQbox+=JiaGK(40,50,ZHIJIE,0.2);
DengDUAN(50,25.3,43.3,3,ZHIJIE);
QQbox+=DengGK(50,ZHIJIE,250);
JiaDUAN(50,43.3,59.6,4,ZHIJIE,0.17);
QQbox+=JiaGK(50,60,ZHIJIE,0.17);
DengDUAN(60,59.6,74.6,5,ZHIJIE);
QQbox+=DengGK(60,ZHIJIE,250);
DaiDUAN(74.6,100.1,6);
QQbox+=DaiGK(21.5);
/////////////////////////////////////////////////////////
//右
DengDUAN0(40,0,11.3,1,ZHIJIE);
JiaDUAN0(40,11.3,25.3,2,ZHIJIE,0.2);
DengDUAN0(50,25.3,43.3,3,ZHIJIE);
JiaDUAN0(50,43.3,59.6,4,ZHIJIE,0.17);
DengDUAN0(60,59.6,74.6,5,ZHIJIE);
DaiDUAN0(74.6,100.1,6);
}
void CFuelEconomyView::HuaLiuTu(CDC *pDC)
{
LiuXY(pDC);
LiuQuXian();
for(int i=0;i<120;i++){
Line0(pDC,poix[i]*6.5/20,poiy[i]/24+5,poix[i+1]*6.5/20,poiy[i+1]/24+5,5,RGB(255,0,0));
}
for(i=0;i<120;i++){
Line0(pDC,poix0[i]*6.5/20+40,poiy0[i]*5/2+5,poix0[i+1]*6.5/20+40,poiy0[i+1]*5/2+5,5,RGB(255,0,0));
}
double box;
CString str;
box=LiuGongKuang(ZHIJIE);
str.Format("%f",box);
pDC->TextOut(900,1600,str,strlen(str));
Fontstr(pDC,60,1600,"楷体_GB2312",40.0f,"此车六工况试验下的百公里油耗是(L/100km):");
QQbox=0;
}
void CFuelEconomyView::DengDUAN(double v,double t0,double tt,int duan,int DangW)
{
double t,s,chi,tbox;
t=tt-t0;
chi=t/n_num;
tbox=t0;
for(int i=0;i<n_num;i++){
s=v*(tbox-t0)/3.6;
poix[(duan-1)*n_num+i]=tbox;
poiy[(duan-1)*n_num+i]=QQbox+DengGK(v,DangW,s);
tbox+=chi;
}
}
void CFuelEconomyView::JiaDUAN(double v,double t0,double tt,int duan,int DangW,double aj)
{
double t,chi,tbox,v0,vt;
t=tt-t0;
chi=t/n_num;
tbox=t0;
for(int i=0;i<n_num;i++){
v0=v;vt=v0+aj*(tbox-t0);
poix[(duan-1)*n_num+i]=tbox;
poiy[(duan-1)*n_num+i]=QQbox+JiaGK(v0,vt,DangW,aj);
tbox+=chi;
}
}
void CFuelEconomyView::DaiDUAN(double t0,double tt,int duan)
{
double t,chi,tbox;
t=tt-t0;
chi=t/n_num;
tbox=t0;
for(int i=0;i<=n_num;i++){
poix[(duan-1)*n_num+i]=tbox;
poiy[(duan-1)*n_num+i]=QQbox+DaiGK(tbox-t0);
tbox+=chi;
}
}
int n_num0=20;
void CFuelEconomyView::DengDUAN0(double v,double t0,double tt,int duan,int DangW)
{ float n;
double p,Gee;
n=BaseN(v,DangW);
p=BasePe(v,DangW,0);
Gee=gee(p,n);
double t,chi,tbox;
t=tt-t0;
chi=t/n_num0;
tbox=t0;
for(int i=0;i<n_num0;i++){
poix0[(duan-1)*n_num0+i]=tbox;
poiy0[(duan-1)*n_num0+i]=Qt(p,Gee);
tbox+=chi;
}
}
void CFuelEconomyView::JiaDUAN0(double v,double t0,double tt,int duan,int DangW,double aj)
{
double t,chi,tbox,v0,vt,vv;
t=tt-t0;
double Qq=0;
chi=t/n_num0;
tbox=t0;
v0=v;
vt=v;
for(int i=0;i<n_num0;i++){
v0=vt;vt=v0+aj*chi;
vv=(v0+vt)/2;
Qq=Qt(BasePe(vv,DangW,aj),gee(BasePe(vv,DangW,aj),BaseN(vv,DangW)));
poix0[(duan-1)*n_num0+i]=tbox;
poiy0[(duan-1)*n_num0+i]=Qq;
tbox+=chi;
}
}
void CFuelEconomyView::DaiDUAN0(double t0,double tt,int duan)
{
extern double be0;
double t,chi,tbox;
t=tt-t0;
chi=t/n_num0;
tbox=t0;
for(int i=0;i<=n_num0;i++){
poix0[(duan-1)*n_num0+i]=tbox;
poiy0[(duan-1)*n_num0+i]=be0;
tbox+=chi;
}
}
/////////////////////////////////////////////////////////////////?????????///
void CFuelEconomyView::SiQuXian()
{
extern int DangWShu;
if(DangWShu<5){
JiaDUAN(0,0,5.6,1,1,(7-0)/(3.6*5.6));
QQbox+=JiaGK(0,7,1,(7-0)/(3.6*5.6));
JiaDUAN(7,5.6,14.4,2,2,((14-7)/(3.6*8.8)));
QQbox+=JiaGK(7,14,2,(14-7)/(3.6*8.8));
JiaDUAN(14,14.4,26.2,3,3,(20-14)/(3.6*11.8));
QQbox+=JiaGK(14,20,3,(20-14)/(3.6*11.8));
JiaDUAN(20,26.2,37.6,4,4,(25-20)/(3.6*11.4));
QQbox+=JiaGK(20,25,4,(25-20)/(3.6*11.4));
DengDUAN(25,37.6,54.8,5,4);
QQbox+=DengGK(25,4,270);
JiaDUAN(25,54.8,72.5,6,4,(40-25)/(3.6*17.7));
QQbox+=JiaGK(25,40,4,(40-25)/(3.6*17.7));
DaiDUAN(72.5,(3.6*270)/40+72.5,7);
QQbox+=DaiGK((3.6*270)/40);
////////////////////////////////////
JiaDUAN0(0,0,5.6,1,1,(7-0)/(3.6*5.6));
JiaDUAN0(7,5.6,14.4,2,2,(14-7)/(3.6*8.8));
JiaDUAN0(14,14.4,26.2,3,3,(20-14)/(3.6*11.8));
JiaDUAN0(20,26.2,37.6,4,4,(25-20)/(3.6*11.4));
DengDUAN0(20,37.6,54.8,5,4);
JiaDUAN0(25,54.8,72.5,6,4,(40-25)/(3.6*17.7));
DaiDUAN0(72.5,(3.6*270)/40+72.5,7);
}
else{
JiaDUAN(0,0,5.6,1,2,(7-0)/(3.6*5.6));
QQbox+=JiaGK(0,7,2,(7-0)/(3.6*5.6));
JiaDUAN(7,5.6,14.4,2,3,(14-7)/(3.6*8.8));
QQbox+=JiaGK(7,14,3,(14-7)/(3.6*8.8));
JiaDUAN(14,14.4,26.2,3,4,(20-14)/(3.6*11.8));
QQbox+=JiaGK(14,20,4,(20-14)/(3.6*11.8));
JiaDUAN(20,26.2,37.6,4,5,(25-20)/(3.6*11.4));
QQbox+=JiaGK(20,25,5,(25-20)/(3.6*11.4));
DengDUAN(25,37.6,54.8,5,5);
QQbox+=DengGK(25,5,270);
JiaDUAN(25,54.8,72.5,6,5,(40-25)/(3.6*17.7));
QQbox+=JiaGK(25,40,5,(40-25)/(3.6*17.7));
DaiDUAN(72.5,(3.6*270)/40+72.5,7);
QQbox+=DaiGK((3.6*270)/40);
////////////////////////////////////
JiaDUAN0(0,0,5.6,1,2,(7-0)/(3.6*5.6));
JiaDUAN0(7,5.6,14.4,2,3,(14-7)/(3.6*8.8));
JiaDUAN0(14,14.4,26.2,3,4,(20-14)/(3.6*11.8));
JiaDUAN0(20,26.2,37.6,4,5,(25-20)/(3.6*11.4));
DengDUAN0(20,37.6,54.8,5,5);
JiaDUAN0(25,54.8,72.5,6,5,(40-25)/(3.6*17.7));
DaiDUAN0(72.5,(3.6*270)/40+72.5,7);
}
}
void CFuelEconomyView::HuaSiTu(CDC *pDC)
{
extern int DangWShu;
SiXY(pDC);
SiQuXian();
for(int i=0;i<140;i++){
Line0(pDC,poix0[i]*6.5/20+40,poiy0[i]*5/1.4+5,poix0[i+1]*6.5/20+40,poiy0[i+1]*5/1.4+5,6,RGB(255,0,0));
}
for(i=0;i<140;i++){
Line0(pDC,poix[i]*6.5/20,poiy[i]/14+5,poix[i+1]*6.5/20,poiy[i+1]/14+5,6,RGB(255,0,0));
}
double box;
CString str;
box=SiGongKuang(DangWShu);
str.Format("%f",box);
pDC->TextOut(900,1600,str,strlen(str));
Fontstr(pDC,60,1600,"楷体_GB2312",40.0f,"此车四工况试验下的百公里油耗是(L/100km):");
QQbox=0;
}
///////////////////////////////////////////////////////////////////////////////////////////////////////////////
//万有特性拟合
void CFuelEconomyView::OnDuru()
{
// TODO: Add your command handler code here
extern double PpP[],GgG[];
extern float NnN[];
extern int DuQv;
CDataDuruDlg dlg;
if(dlg.DoModal()==IDOK){
float n_min=0,n_max=0;
n_min=NnN[0];
n_max=NnN[0];
for(int i=1;i<K;i++)
{ if(n_max<NnN[i])
n_max=NnN[i];
if(n_min>NnN[i])
n_min=NnN[i];
}
for(i=0;i<DangWShu;i++)
{ ua_max[i]=0.377*R*(double)n_max/ig[i]/i0;
ua_min[i]=0.377*R*(double)n_min/ig[i]/i0;
}
for(i=0;i<K;i++){NN[i]=NnN[i]/100;}
for(i=0;i<K;i++){P[i]=PpP[i];}
for(i=0;i<K;i++){G[i]=GgG[i];}
Qmnh(K);
CDataShuChuDlg dlgg;
if(dlgg.DoModal()==IDOK){
TeDone=1;}
}
UpdateData(false);
}
void CFuelEconomyView::OnShoudongluru()
{
// TODO: Add your command handler code here
extern double PpP[],GgG[];
extern float NnN[];
extern int DuQv;
CDataLuruDlg dlg;
if(dlg.DoModal()==IDOK){
double pe[100],ge[100];
float ne[100];
if(DuQv==0){
K=25;
UpdateData(true);
ne[0]=dlg.m_ne_1;
ne[1]=dlg.m_ne_2;
ne[2]=dlg.m_ne_3;
ne[3]=dlg.m_ne_4;
ne[4]=dlg.m_ne_5;
ne[5]=dlg.m_ne_6;
ne[6]=dlg.m_ne_7;
ne[7]=dlg.m_ne_8;
ne[8]=dlg.m_ne_9;
ne[9]=dlg.m_ne_10;
ne[10]=dlg.m_ne_11;
ne[11]=dlg.m_ne_12;
ne[12]=dlg.m_ne_13;
ne[13]=dlg.m_ne_14;
ne[14]=dlg.m_ne_15;
ne[15]=dlg.m_ne_16;
ne[16]=dlg.m_ne_17;
ne[17]=dlg.m_ne_18;
ne[18]=dlg.m_ne_19;
ne[19]=dlg.m_ne_20;
ne[20]=dlg.m_ne_21;
ne[21]=dlg.m_ne_22;
ne[22]=dlg.m_ne_23;
ne[23]=dlg.m_ne_24;
ne[24]=dlg.m_ne_25;
pe[0]=dlg.m_pe_1;
pe[1]=dlg.m_pe_2;
pe[2]=dlg.m_pe_3;
pe[3]=dlg.m_pe_4;
pe[4]=dlg.m_pe_5;
pe[5]=dlg.m_pe_6;
pe[6]=dlg.m_pe_7;
pe[7]=dlg.m_pe_8;
pe[8]=dlg.m_pe_9;
pe[9]=dlg.m_pe_10;
pe[10]=dlg.m_pe_11;
pe[11]=dlg.m_pe_12;
pe[12]=dlg.m_pe_13;
pe[13]=dlg.m_pe_14;
pe[14]=dlg.m_pe_15;
pe[15]=dlg.m_pe_16;
pe[16]=dlg.m_pe_17;
pe[17]=dlg.m_pe_18;
pe[18]=dlg.m_pe_19;
pe[19]=dlg.m_pe_20;
pe[20]=dlg.m_pe_21;
pe[21]=dlg.m_pe_22;
pe[22]=dlg.m_pe_23;
pe[23]=dlg.m_pe_24;
pe[24]=dlg.m_pe_25;
ge[0]=dlg.m_ge_1;
ge[1]=dlg.m_ge_2;
ge[2]=dlg.m_ge_3;
ge[3]=dlg.m_ge_4;
ge[4]=dlg.m_ge_5;
ge[5]=dlg.m_ge_6;
ge[6]=dlg.m_ge_7;
ge[7]=dlg.m_ge_8;
ge[8]=dlg.m_ge_9;
ge[9]=dlg.m_ge_10;
ge[10]=dlg.m_ge_11;
ge[11]=dlg.m_ge_12;
ge[12]=dlg.m_ge_13;
ge[13]=dlg.m_ge_14;
ge[14]=dlg.m_ge_15;
ge[15]=dlg.m_ge_16;
ge[16]=dlg.m_ge_17;
ge[17]=dlg.m_ge_18;
ge[18]=dlg.m_ge_19;
ge[19]=dlg.m_ge_20;
ge[20]=dlg.m_ge_21;
ge[21]=dlg.m_ge_22;
ge[22]=dlg.m_ge_23;
ge[23]=dlg.m_ge_24;
ge[24]=dlg.m_ge_25;
/////估算车速的最大和最小值//////
float n_min=0,n_max=0;
n_min=ne[0];
n_max=ne[0];
for(int i=1;i<25;i++)
{ if(n_max<ne[i])
n_max=ne[i];
if(n_min>ne[i])
n_min=ne[i];
}
for(i=0;i<DangWShu;i++)
{ ua_max[i]=0.377*R*(double)n_max/ig[i]/i0;
ua_min[i]=0.377*R*(double)n_min/ig[i]/i0;
}
for(i=0;i<K;i++){NN[i]=ne[i]/100;}
for(i=0;i<K;i++){P[i]=pe[i];}
for(i=0;i<K;i++){G[i]=ge[i];}
Qmnh(K);
}
CDataShuChuDlg dlgg;
if(dlgg.DoModal()==IDOK){
TeDone=1;}
}
UpdateData(false);
}
void CFuelEconomyView::Qmnh(int K)
{
for(int i=0;i<K;i++){Z[i]=P[i]*NN[i];}
for(i=0;i<K;i++){X[i][0]=1;}
for(i=0;i<K;i++){X[i][1]=NN[i];}
for(i=0;i<K;i++){X[i][2]=NN[i]*NN[i];}
for(i=0;i<K;i++){X[i][3]=NN[i]*NN[i]*NN[i];}
for(i=0;i<K;i++){X[i][4]=NN[i]*NN[i]*NN[i]*NN[i];}
for(i=0;i<K;i++){X[i][5]=NN[i]*NN[i]*NN[i]*NN[i]*NN[i];}
for(i=0;i<K;i++){X[i][6]=P[i];}
for(i=0;i<K;i++){X[i][7]=P[i]*P[i];}
for(i=0;i<K;i++){X[i][8]=P[i]*P[i]*P[i];}
for(i=0;i<K;i++){X[i][9]=Z[i];}
for(i=0;i<K;i++){X[i][10]=Z[i]*Z[i];}
for(i=0;i<K;i++){X[i][11]=Z[i]*Z[i]*Z[i];}
for(i=0;i<K;i++){X[i][12]=Z[i]*Z[i]*Z[i]*Z[i];}
for(i=0;i<K;i++){X[i][13]=1/P[i];}
for(i=0;i<K;i++){X[i][14]=1/(P[i]*P[i]);}
for(i=0;i<K;i++){X[i][15]=1/(P[i]*P[i]*P[i]);}//线性化系数矩阵X[K][M+1]
for(i=0;i<K;i++){Y[i]=G[i];}//Y[K]
int m,n;
for(m=0;m<=MM;m++)
for(n=0;n<=MM;n++)
for(i=0;i<K;i++)
{XTX[m][n]+=X[i][m]*X[i][n];}//XTX[M+1][M+1];
for(m=0;m<=MM;m++)
for(i=0;i<K;i++)
{XTY[m]+=X[i][m]*Y[i];}//XTY[M+1]
for(m=0;m<=MM;m++){AA[m][MM+1]=XTY[m];}
for(m=0;m<=MM;m++)
for(n=0;n<=MM;n++)
{AA[m][n]=XTX[m][n];}//增广矩阵AA[M+1][M+2]
gauss(AA,16,17,x);
for(m=0;m<=MM;m++)
for(n=0;n<=MM;n++){
XTX[m][n]=0;}
for(m=0;m<=MM;m++){XTY[m]=0;}
for(m=0;m<=MM;m++){AA[m][MM+1]=XTY[m];}
for(m=0;m<=MM;m++)
for(n=0;n<=MM;n++)
{AA[m][n]=XTX[m][n];}
}
void CFuelEconomyView::gauss(double a[][17],int S,int T,double x[16])
{
int i,j,l,n,m,k=0,L;
double temp[16];
L=S-1;
/*第一个do-while是将增广矩阵消成上三角形式*/
do{n=0;
for(l=k;l<L;l++)temp[n++]=a[l+1][k]/a[k][k];
for(m=0,i=k;i<S;i++,m++)
for(j=k;j<T;j++)a[i+1][j]-=temp[m]*a[k][j];
k++;
}while(k<S) ;
/*第二个do-while是将矩阵消成对角形式,并且重新给k赋值*/
k=L-1;
do{n=0;
for(l=k;l>=0;l--)temp[n++]=a[k-l][k+1]/a[k+1][k+1];
for(m=0,i=k;i>=0;i--,m++)
for(j=k;j<T;j++)a[k-i][j]-=temp[m]*a[k+1][j];
k--;
}while(k>=0) ;
/*下一个for是解方程组*/
for(i=0;i<S;i++)x[i]=a[i][S]/a[i][i];
}
double CFuelEconomyView::gee(double pe,float n)
{
double a[16],z,ge=0;
z=pe*(n/100);
a[0]=1;
a[1]=(n/100);
a[2]=(n/100)*(n/100);
a[3]=(n/100)*(n/100)*(n/100);
a[4]=(n/100)*(n/100)*(n/100)*(n/100);
a[5]=(n/100)*(n/100)*(n/100)*(n/100)*(n/100);
a[6]=pe;
a[7]=pe*pe;
a[8]=pe*pe*pe;
a[9]=z;
a[10]=z*z;
a[11]=z*z*z;
a[12]=z*z*z*z;
a[13]=1/pe;
a[14]=1/(pe*pe);
a[15]=1/(pe*pe*pe);
for(int i=0;i<16;i++){
ge+=a[i]*x[i];
}
return ge;
}
///////////////////////////////////////////////////////////////////////////////////////////
///////////////////////////参数敏感性分析
void CFuelEconomyView::OnMenI0()
{
// TODO: Add your command handler code here
if(CheXing==0){
CGongKAnsysDlg dlggg;
if(dlggg.DoModal()==IDOK){
menuItem=5;
if(dlggg.m_AnsysChoice==1){GKAnsys=2;}
else{GKAnsys=0;}
vbox=dlggg.m_SuDu;
InvalidateRect(NULL,FALSE);
}
}
else{
CGongKuangAnsys1Dlg dlggg;
if(dlggg.DoModal()==IDOK){
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -