平面六杆机构的运动分析.docx
《平面六杆机构的运动分析.docx》由会员分享,可在线阅读,更多相关《平面六杆机构的运动分析.docx(28页珍藏版)》请在冰豆网上搜索。
平面六杆机构的运动分析
机械原理大作业
(一)
平面六杆机构的运动分析
班级:
学号:
姓名:
同组者:
完成时间:
一.题目
1.1说明
如图所示为一片面六杆机构各构件尺寸如表格1所示,又知原动件1以等角速度ω=1rad/s沿逆时针方向回转,试求各从动件的角位移、角加速度以及E点的位移、速度及加速度的变化情况。
1.2数据
组号
L1
L2
L’2
L3
L4
L5
L6
xG
yG
1-A
26.5
105.6
65.0
67.5
87.5
34.4
25.0
600
153.5
41.7
表格1条件数据
1.3要求
三人一组,编程计算出原动件从0~360º时(计算点数N=36)所要求各运动变量的大小,并绘制运动线图及点的轨迹曲线。
二.解题步骤
由封闭图形ABCD可得:
由封闭图形AGFECD可得
于是有:
对以上1到4导可得-
写做矩阵形式:
对上述矩阵求导可得:
E点横坐标及对应的速度和加速度:
E点纵坐标及对应的速度和加速度:
三.计算程序框图
四.源程序
1.#include"stdlib.h"
#include"math.h"
#include"stdio.h"
intagaus(a,b,n)
intn;
doublea[],b[];
{int*js,l,k,i,j,is,p,q;
doubled,t;
js=malloc(n*sizeof(int));
l=1;
for(k=0;k<=n-2;k++)
{d=0.0;
for(i=k;i<=n-1;i++)
for(j=k;j<=n-1;j++)
{t=fabs(a[i*n+j]);
if(t>d){d=t;js[k]=j;is=i;}
}
if(d+1.0==1.0)l=0;
else
{if(js[k]!
=k)
for(i=0;i<=n-1;i++)
{p=i*n+k;q=i*n+js[k];
t=a[p];a[p]=a[q];a[q]=t;
}
if(is!
=k)
{for(j=k;j<=n-1;j++)
{p=k*n+j;q=is*n+j;
t=a[p];a[p]=a[q];a[q]=t;
}
t=b[k];b[k]=b[is];b[is]=t;
}
}
if(l==0)
{free(js);printf("fail\n");
return(0);
}
d=a[k*n+k];
for(j=k+1;j<=n-1;j++)
{p=k*n+j;a[p]=a[p]/d;}
b[k]=b[k]/d;
for(i=k+1;i<=n-1;i++)
{for(j=k+1;j<=n-1;j++)
{p=i*n+j;
a[p]=a[p]-a[i*n+k]*a[k*n+j];
}
b[i]=b[i]-a[i*n+k]*b[k];
}
}
d=a[(n-1)*n+n-1];
if(fabs(d)+1.0==1.0)
{free(js);printf("fail\n");
return(0);
}
b[n-1]=b[n-1]/d;
for(i=n-2;i>=0;i--)
{t=0.0;
for(j=i+1;j<=n-1;j++)
t=t+a[i*n+j]*b[j];
b[i]=b[i]-t;
}
js[n-1]=n-1;
for(k=n-1;k>=0;k--)
if(js[k]!
=k)
{t=b[k];b[k]=b[js[k]];b[js[k]]=t;}
free(js);
return
(1);
}
2.程序二求解各杆的角度和E点坐标(杆四的角度始终为零,程序中不再求解)
/*输出文件Output.txt*/
#include"stdio.h"
#include
#include"dnetn.c"
#include"agaus.c"
#include
#definePI3.14159265358979
#defineANGLE(PI/180)
#defineALPHA(PI*60/180)
/*初始杆长:
*/
staticdoubledLen[7]={65.0,26.5,105.6,67.5,87.5,34.4,25.0};
/*G点的坐标*/
staticdoubledGxy[2]={153.5,41.7};
staticdoublex0=0*ANGLE;
main()
{
inti,k;
doubleeps,t,h,xe,ye;
intnTemp=0;
FILE*pf;
/*各角位移的初始估计值*/
staticdouble
x[4]={36.80*ANGLE,69.57*ANGLE,119.00*ANGLE,48.92*ANGLE};
pf=fopen("Output.txt","w");
t=0.1;h=0.1;eps=0.00000001;k=100;
for(nTemp=0;nTemp<=36;nTemp++)
{
x0=nTemp*10*ANGLE;
i=dnetn(4,eps,t,h,x,k);
printf("\ni=%d\n",i);
printf("x0=%lf\n",x0);
fprintf(pf,"%d\t",10*nTemp);
for(i=0;i<=3;i++)
{
printf("x(%d)=%13.7lf\n",i,x[i]/ANGLE);
fprintf(pf,"%lf\t",x[i]/ANGLE);
}
xe=dLen[1]*cos(x0)+dLen[2]*cos(x[0])+dLen[0]*cos(ALPHA-(x[0]));
ye=dLen[1]*sin(x0)+dLen[2]*sin(x[0])-dLen[0]*sin(ALPHA-(x[0]));
printf("xe=%13.7lf\nye=%13.7lf\n",xe,ye);
fprintf(pf,"\n");
printf("\n");
}
fclose(pf);
getch();
}
/*建立牛顿法矩阵*/
voiddnetnf(x,y,n)intn;
doublex[],y[];
{
y[0]=dLen[1]*cos(x0)+dLen[2]*cos(x[0])-dLen[3]*cos(x[1])
-dLen[4];
y[1]=dLen[1]*sin(x0)+dLen[2]*sin(x[0])-dLen[3]*sin(x[1]);
y[2]=dLen[1]*cos(x0)+dLen[2]*cos(x[0])+dLen[5]
*cos(x[2])-dLen[6]*cos(x[3])-dGxy[0]+dLen[0]*cos(ALPHA-(x[0]));
y[3]=dLen[1]*sin(x0)+dLen[2]*sin(x[0])+dLen[5]
*sin(x[2])-dLen[6]*sin(x[3])-dGxy[1]-dLen[0]*sin(ALPHA-(x[0]));
n=n;
return;
}
3.程序三求解各杆的角速度和E点速度(杆四的角速度始终为零,程序中不再求解)
/*输出文件Output2.txt*/
#include"stdio.h"
#include"math.h"
#include"agaus.c"
#include
#definePI3.14159265358979
#defineANGLE(PI/180)
#defineALPHA(PI*35/180)
/*初始杆长:
依次为*/
staticdoubledLen[7]={65.0,26.5,105.6,67.5,87.5,34.4,25.0};
/*G点的坐标*/
staticdoubledGxy[2]={153.5,41.7};
staticdoublex0=0*ANGLE;
staticdoublew1=1.0;
doubleVex,Vey;
main()
{
inti,j,nTime;
FILE*fInput;
FILE*fOutput2;
intnX0,nCounter;
doubledTemp[4]={0};
staticdoublea[4][4]={0.};
staticdoubleb[4]={0.};
/*将agu_01.C的输出文件output.txt作为输入文件,继续计算*/
fInput=fopen("output.txt","r");
fOutput2=fopen("output2.txt","w");
for(nTime=0;nTime<=36;nTime++)
{
fscanf(fInput,"%d",&nX0);
x0=nX0*ANGLE;
printf("x0=%lf\n",x0);
for(nCounter=0;nCounter<4;nCounter++)
{
fscanf(fInput,"%lf",&dTemp[nCounter]);
}
for(nCounter=0;nCounter<4;nCounter++)
{
dTemp[nCounter]=dTemp[nCounter]*ANGLE;
}
/*建立高斯方程组矩阵*/
a[0][0]=-dLen[2]*sin(dTemp[0]);
a[0][1]=dLen[3]*sin(dTemp[1]);
a[0][2]=0.;
a[0][3]=0.;
a[1][0]=dLen[2]*cos(dTemp[0]);
a[1][1]=-dLen[3]*cos(dTemp[1]);
a[1][2]=0.;
a[1][3]=0.;
a[2][0]=dLen[2]*sin(dTemp[0])-dLen[0]*sin(ALPHA-(dTemp[0]));
a[2][1]=0.;
a[2][2]=dLen[5]*sin(dTemp[2]);
a[2][3]=-dLen[6]*sin(dTemp[3]);
a[3][0]=dLen[2]*cos(dTemp[0])+dLen[0]*cos(ALPHA-(dTemp[0]));
a[3][1]=0.;
a[3][2]=dLen[5]*cos(dTemp[2]);
a[3][3]=-dLen[6]*cos(dTemp[3]);
b[0]=dLen[1]*sin(x0)*w1;
b[1]=-dLen[1]*cos(x0)*w1;
b[2]=-dLen[1]*sin(dTemp[0])*w1;
b[3]=-dLen[1]*cos(dTemp[0])*w1;
if(agaus(a,b,4)!
=0)
for(i=0;i<=3;i++)
{
printf("w%d=%lf\n",i,b[i]);
fprintf(fOutput2,"%lf",b[i]);
Vex=-dLen[1]*sin(x0)*w1-dLen[2]*sin(dTemp[0])*b[0]+
dLen[0]*sin(ALPHA-(dTemp[0]))*b[0];
Vey=dLen[1]*cos(x0)*w1+dLen[2]*cos(dTemp[0])*b[0]+
dLen[0]*cos(ALPHA-(dTemp[0]))*b[0];}
printf("Vex=%lf\nVey=%lf\n",Vex,Vey);
fprintf(fOutput2,"\n");
printf("\n");
}
fclose(fInput);
fclose(fOutput2);
getch();
}
4.程序四求解各杆和点E的角加速度(杆四角加速度始终为零,这里不再求解)
/*输出文件Output3.txt*/
#include"stdio.h"
#include"math.h"
#include"agaus.c"
#include
#definePI3.14159265358979
#defineANGLE(PI/180)
#defineALPHA(PI*35/180)
/*初始杆长:
依次为*/
staticdoubledLen[7]={65.0,26.5,105.6,67.5,87.5,47.2,37.8};
/*G点的坐标*/
staticdoubledGxy[2]={153.5,41.7};
staticdoublex0=0*ANGLE;
staticdoublew1=1.0;
main()
{
inti,nTime;
FILE*fInput2;
FILE*fOutput3;
intnX0,nCounter;
doubleAex,Aey;
doubledSeta[5]={0.};
doubledOmiga[4]={0.};
staticdoublea[4][4]={0.};
staticdoubleb[4]={0.};
/*将agu_02.C的输出文件output2.txt作为输入文件,继续计算*/
fInput2=fopen("output2.txt","r");
fOutput3=fopen("output3.txt","w");
for(nTime=0;nTime<=36;nTime++)
{
fscanf(fInput2,"%d",&nX0);
/*读入角度值*/
for(nCounter=0;nCounter<5;nCounter++)
{
fscanf(fInput2,"%lf",&dSeta[nCounter]);
}
/*读入角速度值*/
for(nCounter=0;nCounter<4;nCounter++)
{
fscanf(fInput2,"%lf",&dOmiga[nCounter]);
}
/*建立高斯方程组矩阵,dSeta[0]=x1(角度我们草稿的),dSeta[1]=x2,dSeta[2]=x3,dSeta[3]=x5,dSeta[4]=x6
dOmiga[0]=w2,dOmiga[1]=w3,dOmiga[2]=w5,dOmiga[3]=w6*/
a[0][0]=-dLen[2]*sin(dSeta[1]);
a[0][1]=dLen[3]*sin(dSeta[2]);
a[0][2]=0.;
a[0][3]=0.;
a[1][0]=dLen[2]*cos(dSeta[1]);
a[1][1]=-dLen[3]*cos(dSeta[2]);
a[1][2]=0.;
a[1][3]=0.;
a[2][0]=-dLen[0]*sin(ALPHA-(dSeta[1]))+dLen[2]*sin(dSeta[1]);
a[2][1]=0.;
a[2][2]=dLen[5]*sin(dSeta[3]);
a[2][3]=-dLen[6]*sin(dSeta[4]);
a[3][0]=dLen[0]*cos(ALPHA-(dSeta[1]))+dLen[2]*cos(dSeta[1]);
a[3][1]=0.;
a[3][2]=dLen[5]*cos(dSeta[3]);
a[3][3]=-dLen[6]*cos(dSeta[4]);
b[0]=-(-dLen[2]*cos(dSeta[1])*dOmiga[0]*dOmiga[0]
+dLen[3]*cos(dSeta[2])*dOmiga[1]*dOmiga[1])+dLen[1]*
cos(dSeta[0])*w1*w1;
b[1]=-(-dLen[2]*sin(dSeta[1])*dOmiga[0]*dOmiga[0]
+dLen[3]*sin(dSeta[2])*dOmiga[1]*dOmiga[1])+dLen[1]*
sin(dSeta[0])*w1*w1;
b[2]=-w1*w1*dLen[1]*cos(dSeta[0])-dOmiga[0]*
dOmiga[0]*(dLen[2]*cos(dSeta[1])+dLen[0]*cos(ALPHA-(dSeta[1])))+dOmiga[3]*
dOmiga[3]*dLen[6]*cos(dSeta[4])-dLen[5]*
cos(dSeta[3])*dOmiga[2]*dOmiga[2];
b[3]=w1*w1*dLen[1]*sin(dSeta[0])-dOmiga[0]*
dOmiga[0]*(dLen[2]*sin(dSeta[1])-dLen[0]*sin(ALPHA-(dSeta[1])))-dOmiga[3]*
dOmiga[3]*dLen[6]*sin(dSeta[4])+dLen[5]*
sin(dSeta[3])*dOmiga[2]*dOmiga[2];
if(agaus(a,b,4)!
=0)
for(i=0;i<=3;i++)
{printf("a[%d]=%lf\n",i,b[i]);
fprintf(fOutput3,"%lf",b[i]);
Aex=-dLen[2]*sin(dSeta[1])*b[0]+dLen[0]*sin(ALPHA-(dSeta[1]))*b[0]-dLen[1]*cos(dSeta[0])*w1*
w1-dLen[2]*cos(dSeta[1])*dOmiga[0]*dOmiga[0]-dLen[0]*cos(ALPHA-(dSeta[1]))*dOmiga[0]*dOmiga[0];
Aey=dLen[2]*cos(dSeta[1])*b[0]+dLen[0]*cos(ALPHA-(dSeta[1]))*b[0]-dLen[1]*sin(dSeta[0])*w1*
w1-dLen[2]*sin(dSeta[1])*dOmiga[0]*dOmiga[0]+dLen[0]*sin(ALPHA-(dSeta[1]))*dOmiga[0]*dOmiga[0];
};
printf("Aex=%lf\nAey=%lf",Aex,Aey);
fprintf(fOutput3,"%lf%lf",Aex,Aey);
printf("\n\n");
fprintf(fOutput3,"\n");
}
fclose(fInput2);
fclose(fOutput3);
getch();
}
5.#include"stdlib.h"
#include"math.h"
#include"stdio.h"
intdnetn(n,eps,t,h,x,k)
intn,k;
doubleeps,t,h,x[];
{externvoiddnetnf();
externintagaus();
inti,j,l;
doubleam,z,beta,d,*y,*a,*b;
y=malloc(n*sizeof(double));
a=malloc(n*n*sizeof(double));
b=malloc(n*sizeof(double));
l=k;am=1.0+eps;
while(am>=eps)
{dnetnf(x,b,n);
am=0.0;
for(i=0;i<=n-1;i++)
{z=fabs(b[i]);
if(z>am)am=z;
}
if(am>=eps)
{l=l-1;
if(l==0)
{free(y);free(b);free(a);
printf("fail\n");return(0);
}
for(j=0;j<=n-1;j++)
{z=x[j];x[j]=x[j]+h;
dnetnf(x,y,n);
for(i=0;i<=n-1;i++)a[i*n+j]=y[i];
x[j]=z;
}
if(agaus(a,b,n)==0)
{free(y);free(a);free(b);return(-1);}
beta=1.0;
for(i=0;i<=n-1;i++)beta=beta-b[i];
if(fabs(beta)+1.0==1.0)
{free(y);free(a);free(b);
printf("fail\n");return(-2);
}
d=h/beta;
for(i=0;i<=n-1;i++)x[i]=x[i]-d*b[i];
h=t*h;
}
}
free(y);free(a);free(b);
return(k-l);
}
五.计算结果
Ø1(单位:
度)
Ø2(单位:
度)
Ø3(单位:
度)
Ø5(单位:
度)
Ø6(单位:
度)
0
36.79905
69.57313
122.46277
92.66544
10
32.70947
66.00299
106.49971
67.79857
20
29.27761
64.07317
97.17544
52.86279
30
26.59737
63.73103
90.38343
44.24919
40
24.63591
64.75511
84.24782
39.67266
50
23.30108
66.86468
77.84116
37.31607
60
22.49012
69.79004
70.48144
35.41957
70
22.11297
73