|
楼主 |
发表于 2017-7-8 09:47:53
|
显示全部楼层
本帖最后由 ngsxngtd 于 2017-7-8 09:51 编辑
图没啥好看的,看核心部分代码好了。
//===================Motor Output Torque Function=====================
double Motor::MotTorFun(double VRotSpe)
{
double SliRat;
double OutTor;
SliRat=(SynRotSpe-VRotSpe)/SynRotSpe;
OutTor=2*MaxTor/(SliRat/CriSliRat+CriSliRat/SliRat);
return OutTor;
};
Motor自定义类的一个成员函数Motor Torque Function ,
variable rotary speed,
output Torque,
slip ratio,
synchronous rotary speed,
maximum torque,
critical slip ratio;
命名基本上做到见名知意,很普通的实用方程。电机的临界转差率,最大转矩啥的,不说了,是个人都能写。
=================================================================
//========================Load Torque Function=====================================
double Load:: LoaTorFun(double VRotSpe)
{
//return 1.25672*pow(10,-4.0)*pow(VRotSpe,2);
return 0;
};
负载转矩方程,本来想用平衡方程,按平方率计算,T=9550*350/2985=1119.77 N*m,K=1119.77/2985^2=1.25672*10^-4,结果拖不起来,注释掉了,哈哈。
==============================================================
//========================Accerlation Torque Function=====================================
double AccTorFun(Motor VMotor,Load VLoad,double VRotSpe)
{
return VMotor.MotTorFun(VRotSpe)-VLoad.LoaTorFun(VRotSpe);
};
加速转矩方程,是个人都能写,不说了。
===============================================================
//======================Simpson solving Function===================================
double SimpsonSolTim(Motor VMotor,Load VLoad)
{
VMotor.ParInp();
VMotor.ParCal();
VMotor.ParOut();
VLoad.ParInp();
VLoad.ParOut();
int EveNum;
cout<<"Please input the even number of Simpson way.The larger the better!"<<endl;
cin>>EveNum;
double StaTim;
double Vi;
double Vh;
Vh=VMotor.NomRotSpe/EveNum;
for(StaTim=0,Vi=0;Vi<=EveNum;Vi++)
{
StaTim+=Vh/6*(1/AccTorFun(VMotor,VLoad,Vi*Vh)+4/AccTorFun(VMotor,VLoad,(Vi+1/2)*Vh)+1/AccTorFun(VMotor,VLoad,(Vi+1)*Vh));
};
return VLoad.LoaRotIne*atan(1)*4/30*StaTim;
};
这部分应该是最核心的东西了。调用类的函数,先建立辛普森积分式;even number ,要求必须是偶数;vh s是步长;积分式是转矩方程的倒数,这个别弄错了;然后循环迭加,初始转速为0,所以各个转速就是Vi*Vh。load rotary inertia ,负载转动惯量;电机的转动惯量,谁也不知道,计算时设为0了。
=================================================================
int main()
{
Motor Motor1;
Load Load1;
double time1;
//double VRotSpe;
time1=SimpsonSolTim(Motor1,Load1);
cout<<"The motor total start time with unit s is "<<endl;
cout<<time1<<endl;
//cout<<"please input the time with unit s:"<<endl;
//cin>>time1;
//VRotSpe=RonKutSolRotSpe(Motor1,Load1,time1);
//cout<<"The rotatory speed with unit r/min @ "<<time1<<"s is:"<<endl;
//cout<<VRotSpe<<endl;
return 0;
};
主函数位于金字塔上方作为总控制,只发布命令,不参与具体数据处理;四阶龙格库塔无用武之地,注释掉了。
==============================================================
//======================Ronge-Kutta solving Function===================================
double RonKutSolRotSpe(Motor VMotor,Load VLoad,double Vtim)
{
VMotor.ParInp();
VMotor.ParCal();
VMotor.ParOut();
VLoad.ParInp();
VLoad.ParOut();
int Num;
cout<<"Please input the number of Ronge-Kutta way.The larger the better!"<<endl;
cin>>Num;
double RotSpe;
int Vi;
double Vh;
Vh=Vtim/Num;
double VF1,VF2,VF3,VF4;
for(Vi=0;Vi<=Num;Vi++)
{
VF1=Vh*AccTorFun(VMotor,VLoad,RotSpe);
VF2=Vh*AccTorFun(VMotor,VLoad,(RotSpe+0.5*VF1));
VF3=Vh*AccTorFun(VMotor,VLoad,(RotSpe+0.5*VF2));
VF4=Vh*AccTorFun(VMotor,VLoad,(RotSpe+VF3));
RotSpe+=(VF1+2*VF2+2*VF3+VF4)/6.0;
};
return RotSpe/VLoad.LoaRotIne/atan(1)/4*30;
};
四阶龙格库塔,为计算输出功做的一个准备工作。
=================================================================
main 函数无限循环,可以让控制台永久停留,除非手动关了它。上传个EXE给大家乐一乐。编译器用的gcc,完全开源,这个在任何公司都不会有法律问题,好像也有手机版的,不过没跑过。 |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册
x
|