机械原理大作业.docx
《机械原理大作业.docx》由会员分享,可在线阅读,更多相关《机械原理大作业.docx(15页珍藏版)》请在冰点文库上搜索。
机械原理大作业
机械与电子工程学院
《机械原理》
大作业
(一)
平面连杆机构的运动分析
(题号:
牛头刨床9A)
班级:
学号:
姓名:
同组其他人员:
完成日期:
题目、原始数据及要求1
一平面连杆机构运动分析方程1
1.1位置方程
1.2速度计算公式2
1.3加速度计算公式2
二程序3
2.1计算程序框图3
2.2计算源程序4
三3.1(一组数据Lab=200mm)计算结果9
3.2运动线图10
3.3体会12
四4.1(第二组数据Lab=150mm)计算结果12
4.2运动线图13
4.3体会15
五5.1(第三组数据Lab=220mm)计算结果16
5.2运动线图17
5.3体会21
六参考资料21
题目及原始数据
如图所示,为一牛头刨床(Ⅲ级机构)。
假设已知各构件的尺寸如下表所示,原东件1以等角速度
沿着逆时针方向回转,试求各从动件的角位移、角速度和角加速度以及刨头C点位移、速度和加速度的变化。
题号
h
9A
200
960
160
900
500
120
平面连杆机构运动分析方程
先建立一直角坐标系,标出各杆矢量及其方位角。
设各杆的夹角为
,其中GE段记为
BD段记为
建立投影方程:
1.1
机构运动位置分析方程
1.2
机构运动速度分析方程(以矩阵形式写出)
1.3机构运动加速度分析方程(以矩阵形式写出
采用高斯消去法可得角加速度
。
计算流程图
计算源程序
#include
#include
#include
#definePI3.1415926
#defineN4
#defineE0.0001
#defineT1000
voidSolutionangle(double[12],double);/*迭代法求角位移*/
voidSolutionspeed(double[N][N],double[N],double[12],double);
/*角速度求解*/
voidSolutionacceleration(double[N][N],double[N][N],double[N],
double[12]);/*角加速度求解*/
voidGaussianE(double[N][N],double[N],double[N]);/*高斯消去*/
voidFoundmatrixA(double[12],double[N][N]);//创建系数矩阵A
voidFoundmatrixB(double[12],double,double[N]);//创建系数矩阵B
voidFoundmatrixDA(double[12],double[N][N]);//创建矩阵DA
voidFoundmatrixDB(double[12],double,double[N]);//创建矩阵DB
//定义全局变量
doublel1=200,l3=960,l4=160,h=900,h1=500,h2=120,as1=1.0;
//主函数
voidmain()
{
inti,j;
FILE*fp;
doubleshuju[36][12];
doublepsvalue[12],a[N][N],da[N][N],b[N],db[N],ang1;
//建立文件,并制表头
if((fp=fopen("shuju","w"))==NULL)
{
printf("Cann'topenthisfile.\n");
exit(0);
}
fprintf(fp,"\nL1=%lf",l1);
fprintf(fp,"\ns3ang3ang4s5");
fprintf(fp,"s3'as3as4s5'");
fprintf(fp,"s3''aas3aas4s5''\n");
//计算数据并写入文件
psvalue[0]=480;psvalue[1]=65*PI/180;psvalue[2]=10*PI/180;
psvalue[3]=500;
for(i=0;i<36;i++)
{
ang1=i*PI/18;
Solutionangle(psvalue,ang1);
FoundmatrixB(psvalue,ang1,b);
FoundmatrixA(psvalue,a);
Solutionspeed(a,b,psvalue,ang1);
FoundmatrixDA(psvalue,da);
FoundmatrixDB(psvalue,ang1,db);
Solutionacceleration(a,da,db,psvalue);
for(j=1;j<3;j++)
psvalue[j]=psvalue[j]*180/PI;
for(j=0;j<12;j++)
{shuju[i][j]=psvalue[j];}
fprintf(fp,"\n");
for(j=0;j<12;j++)
fprintf(fp,"%12.3f",shuju[i][j]);
for(j=1;j<3;j++)
psvalue[j]=psvalue[j]*PI/180;
for(j=0;j<4;j++)
psvalue[j]+=psvalue[j+4];
}
fclose(fp);
//输出数据
for(i=0;i<36;i++)
{
ang1=i*PI/18;
printf("\n输出ang1=%d时的求解\n",i*10);
printf("angleangspeedangacceleration:
\n");
for(j=0;j<4;j++)
printf("%lf\t",shuju[i][j]);
printf("\n");
for(j=4;j<8;j++)
printf("%lf\t",shuju[i][j]);
printf("\n");
for(j=8;j<12;j++)
printf("%lf\t",shuju[i][j]);
printf("\n");
}
}
/*矢量法求角位移*/
voidSolutionangle(doublevalue[12],doubleang1)
{
doubleae,s3,ang3,ang4,s5,t=0;
s3=value[0];ang3=value[1];ang4=value[2];s5=value[3];
doublexb,yb,xd,yd,xc,yc;
while(t{
xb=h2+l1*cos(ang1);yb=h1+l1*sin(ang1);
xd=l4*cos(ang4);yd=l4*sin(ang4);
s3=sqrt((xd-xb)*(xd-xb)+(yd-yb)*(yd-yb));
xc=xd+l3*(xb-xd)/s3;
yc=yd+l3*(yb-yd)/s3;
ang3=atan2(yc-yd,xc-xd);
s5=xc;
ae=sqrt(h1*h1+h2*h2);
if(fabs(yc-h)return;
else
ang4=atan((yd-yc+h)/(l4*cos(ang4)));
value[0]=s3;value[1]=ang3;value[2]=ang4;value[3]=s5;
while(value[1]>2*PI)
value[1]-=2*PI;
while(value[1]<0)
value[1]+=2*PI;
while(value[2]>PI)
value[2]-=2*PI;
while(value[2]<-PI)
value[2]+=2*PI;
t+=1;
if(t>=T)
{
printf("%f迭代失败.\n",ang1*180/PI);exit(0);}
}
}
/*角速度求解*/
voidSolutionspeed(doublea2[N][N],doubleb2[N],doublevalue[12],
doubleang1)
{
doublep2[N];
GaussianE(a2,b2,p2);
value[4]=p2[0];
value[5]=p2[1];
value[6]=p2[2];
value[7]=p2[3];
}
/*角加速度求解*/
voidSolutionacceleration(doublea3[N][N],doubleda3[N][N],
doubledb3[N],doublevalue[12])
{
inti,j;
doublebk[N]={0};
doublep3[N];
for(i=0;i{
for(j=0;j{
bk[i]+=-da3[i][j]*value[4+j];
}
bk[i]+=db3[i]*as1;
}
GaussianE(a3,bk,p3);
value[8]=p3[0];
value[9]=p3[1];
value[10]=p3[2];
value[11]=p3[3];
}
/*高斯消去法解矩阵方程*/
voidGaussianE(doublea4[N][N],doubleb4[N],doublep4[N])
{
inti,j,k;
doublea4g[N][N],b4g[N],t;
for(i=0;ifor(j=0;ja4g[i][j]=a4[i][j];
for(i=0;ib4g[i]=b4[i];
//施主对角线上的值尽可能大
if(a4g[0][0]a4g[1][1])
{
for(j=0;j{t=a4g[0][j];a4g[0][j]=a4g[1][j];a4g[1][j]=t;}
t=b4g[0];b4g[0]=b4g[1];b4g[1]=t;
}
if(a4g[2][2]a4g[3][3])
{
for(j=0;j{t=a4g[2][j];a4g[2][j]=a4g[3][j];a4g[3][j]=t;}
t=b4g[2];b4g[2]=b4g[1];b4g[3]=t;
}
//初等行变换
for(j=0;jfor(i=0;i{
if(i!
=j)
{
for(k=0;kif(k!
=j)
{a4g[i][k]-=a4g[i][j]/a4g[j][j]*a4g[j][k];}
b4g[i]-=b4g[j]*a4g[i][j]/a4g[j][j];
a4g[i][j]=0;
}
}
for(i=0;ib4g[i]/=a4g[i][i];
p4[0]=b4g[0];
p4[1]=b4g[1];
p4[2]=b4g[2];
p4[3]=b4g[3];
}
//创建系数矩阵A
voidFoundmatrixA(doublevalue5[12],doublea5[N][N])
{
doubles3,ang3,ang4,s5;
s3=value5[0];ang3=value5[1];ang4=value5[2];s5=value5[3];
a5[0][0]=cos(ang3);a5[0][1]=-s3*sin(ang3);a5[0][2]=-l4*sin(ang4);
a5[1][0]=sin(ang3);a5[1][1]=s3*cos(ang3);a5[1][2]=l4*cos(ang4);
a5[2][1]=-l3*sin(ang3);a5[2][2]=-l4*sin(ang4);a5[2][3]=-1;
a5[3][1]=l3*cos(ang3);a5[3][2]=l4*cos(ang4);
a5[0][3]=a5[1][3]=a5[2][0]=a5[3][0]=a5[3][3]=0;
}
//创建系数矩阵B
voidFoundmatrixB(doublevalue6[12],doubleang1,doubleb6[N])
{
b6[0]=-l1*sin(ang1)*as1;
b6[1]=l1*cos(ang1)*as1;
b6[2]=b6[3]=0;
}
//创建矩阵DA
voidFoundmatrixDA(doublevalue7[12],doubleda7[N][N])
{
doubles3,ang3,ang4,s5,s3g,as3,as4,s5g;
s3=value7[0];ang3=value7[1];ang4=value7[2];s5=value7[3];
s3g=value7[4];as3=value7[5];as4=value7[6];s5g=value7[7];
da7[0][0]=-as3*sin(ang3);
da7[0][1]=-s3g*sin(ang3)-s3*cos(ang3)*as3;
da7[0][2]=-l4*cos(ang4)*as4;
da7[1][0]=as3*cos(ang3);
da7[1][1]=s3g*cos(ang3)-s3*sin(ang3)*as3;
da7[1][2]=-l4*sin(ang4)*as4;
da7[2][1]=-l3*cos(ang3)*as3;da7[2][2]=-l4*cos(ang4)*as4;
da7[3][1]=-l3*sin(ang3)*as3;da7[3][2]=-l4*sin(ang4)*as4;
da7[0][3]=da7[1][3]=da7[2][0]=da7[2][3]=da7[3][0]=da7[3][3]=0;
}
//创建矩阵DB
voidFoundmatrixDB(doublevalue8[12],doubleang1,doubledb8[N])
{
db8[0]=-l1*as1*cos(ang1);
db8[1]=-l1*as1*sin(ang1);
db8[2]=db8[3]=0;
}