哈工大机械原理凸轮机构大作业

题目要求

在这里插入图片描述

公式推导和计算

![在这里插入图片描述](https://img-blog.csdnimg.cn/20210610210803488.jpg?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NjM3NjE4OA==,size_16,color_FFFFFF,t_70#pic_center在这里插入图片描述
在这里插入图片描述

计算流程图

在这里插入图片描述

pyhton代码

from abc import ABCMeta, abstractmethod
from mpl_toolkits import axisartist
import math
from matplotlib import pyplot as plt
import matplotlib.font_manager as font_manager
from matplotlib.pyplot import MultipleLocator
import numpy as np

class travel():
    __mata_class_=ABCMeta
    def __init__(self,**kwargs):
        self.h=kwargs.get("h")
        self.Phi=kwargs.get("Phi")
    @abstractmethod
    def state_phi(self):
        pass

class sin_travel(travel):
    def __init__(self,**kwargs):
        super().__init__(**kwargs)
        self.push_travel=kwargs.get("push_travel")

    def state_phi(self,phi):
        Phi=self.Phi*math.pi/180
        phi=phi*math.pi/180
        if (self.push_travel):
            return [self.h*(phi/Phi-math.sin(2*math.pi*phi/Phi)/(2*math.pi)),
                    self.h*(1-math.cos(2*math.pi*phi/Phi))/Phi,
                    self.h*2*math.pi*math.sin(2*math.pi*phi/Phi)/Phi**2]
        else:
            return [self.h*(1-phi/Phi+math.sin(2*math.pi*phi/Phi)/(2*math.pi)),
                    -self.h*(1-math.cos(2*math.pi*phi/Phi))/Phi,
                    -self.h*2*math.pi*math.sin(2*math.pi*phi/Phi)/Phi**2]

class pause_travel(travel):
    def state_phi(self,phi):
        return [self.h,0,0]

class cam():
    def __init__(self,Law_of_motion:list,**kwarg):
        self.travel=Law_of_motion
        self.e=kwarg.get("e")
        self.r_0=kwarg.get("r_0")
        self.r_r=kwarg.get("r_r")
        self.omega=kwarg.get("omega")
        if(self.r_0!=None and self.e!=None):
            self.s0=math.sqrt(self.r_0**2+self.e**2)

        #求位移类速度类加速度
    def get_motion_state_phi(self,phi)->list:
        i=0
        while(phi>self.travel[i].Phi):
            phi-=self.travel[i].Phi
            i+=1
        return self.travel[i].state_phi(phi)
    
    def get_motion_state(self,phi)->list:
        def tf(i):
            i+=1 
            return i-1
        i=0
        return list(map(lambda x:x*self.omega**tf(i),self.get_motion_state_phi(phi)))
    
    def get_pressure_angle(self,phi):
        state_phi=self.get_motion_state_phi(phi)
        return math.atan(abs(state_phi[1]-self.e)/\
                        (self.s0+state_phi[0]))*180/math.pi

    def get_theoretical_outline(self,phi)->tuple:
        t=self.s0+self.get_motion_state_phi(phi)[0]
        phi=phi*math.pi/180
        return (-t*math.sin(phi)-self.e*math.cos(phi),
                 t*math.cos(phi)-self.e*math.sin(phi))

    def get_theoretical_outline_dphi(self,phi)->tuple:
        state=self.get_motion_state_phi(phi)
        t1=self.s0+state[0]
        t2=state[1]-self.e
        phi=phi*math.pi/180
        return (-t1*math.cos(phi)-t2*math.sin(phi),
                -t1*math.sin(phi)+t2*math.cos(phi))

    def get_theoretical_outline_ddphi(self,phi)->tuple:
        state=self.get_motion_state_phi(phi)
        phi=phi*math.pi/180
        t1=2*state[1]-self.e
        t2=state[2]-self.s0-state[0]
        return (-t1*math.cos(phi)-t2*math.sin(phi),
                -t1*math.sin(phi)+t2*math.cos(phi))

    def get_rho(self,phi):
        (dx,dy)=self.get_theoretical_outline_dphi(phi)
        (ddx,ddy)=self.get_theoretical_outline_ddphi(phi)
        return math.sqrt(dx**2+dy**2)**3/(dx*ddy-dy*ddx)

    def get_partical_outline(self,phi)->tuple:
        t=math.sqrt(self.get_theoretical_outline_dphi(phi)[0]**2+\
                    self.get_theoretical_outline_dphi(phi)[1]**2)
        t1=self.get_theoretical_outline_dphi(phi)[1]/t
        t2=self.get_theoretical_outline_dphi(phi)[0]/t
        return (self.get_theoretical_outline(phi)[0]-self.r_r*t1,\
                self.get_theoretical_outline(phi)[1]+self.r_r*t2)

def set_co_axis(ax:axisartist.Subplot,title="",xlabel="",ylabel="",pxl=(0,0),pyl=(0,0)):
    ax.axis[:].set_visible(False)
    ax.axis["x"] = ax.new_floating_axis(0,0)
    ax.axis["x"].set_axisline_style("->", size = 1.0)
    ax.axis["y"] = ax.new_floating_axis(1,0)
    ax.axis["y"].set_axisline_style("-|>", size = 1.0)
    ax.axis["x"].set_axis_direction("top")
    ax.axis["y"].set_axis_direction("right")
    ax.set_xticks([ 0, np.pi/2, np.pi, 3*np.pi/2, 2*np.pi])
    ax.set_xticklabels([ "", 'π/2', 'π', '3π/2', '2π' ])
    ax.text(pxl[0],pxl[1],xlabel,ha="center",va="center")
    ax.text(pyl[0],pyl[1],ylabel,ha="center",va="center")
    ax.set_title(title)

if (__name__=="__main__"):
    h=55
    Phi_0_1=115
    Phi_0_2=135
    Phi_s_1=80
    Phi_s_2=30
    alpha_1=30
    alpha_2=70
    omega=1
    Law_of_motion=[sin_travel(h=h,Phi=Phi_0_1,push_travel=True),
                   pause_travel(h=h,Phi=Phi_s_1),
                   sin_travel(h=h,Phi=Phi_0_2,push_travel=False),
                   pause_travel(h=0,Phi=Phi_s_2)]
    Cam=cam(Law_of_motion,omega=1)
    mo_data=[[],[],[]]
    mo_dphi_data=[[],[],[]]
    for i in range(0,360):
        mo_dphi_data=list(map(lambda x,y:x+[y],
                              mo_dphi_data,Cam.get_motion_state_phi(i)))
        mo_data=list(map(lambda x,y:x+[y],
                              mo_data,Cam.get_motion_state(i)))
        y1=mo_dphi_data[0][i]-math.tan((90-alpha_1)*math.pi/180)*mo_dphi_data[1][i]
        y2=mo_dphi_data[0][i]-math.tan((90+alpha_2)*math.pi/180)*mo_dphi_data[1][i]
        if (i==0):
            py1,py2,f1,f2=y1,y2,0,0
        else:
            if(f1!=-1):
                if(f1==1 and py1<y1):
                    f1,s_1,x_1=-1,mo_dphi_data[0][i-1],mo_dphi_data[1][i-1]
                elif(f1==0 and y1<py1):
                    f1=1
                py1=y1
            if(f2!=-1):
                if(f2==1 and py2<y2):
                    f2,s_2,x_2=-1,mo_dphi_data[0][i-1],mo_dphi_data[1][i-1]
                elif(f2==0 and y2<py2):
                    f2=1
                py2=y2            

    fig1=plt.figure(figsize=(10,10),dpi=80)

    phi_x=np.linspace(0,2*math.pi,360)
    s_phi=axisartist.Subplot(fig1,3,1,1)
    v_phi=axisartist.Subplot(fig1,3,1,2)
    a_phi=axisartist.Subplot(fig1,3,1,3)
    s_phi.plot(phi_x,mo_data[0])
    v_phi.plot(phi_x,mo_data[1])
    a_phi.plot(phi_x,mo_data[2])
    set_co_axis(s_phi,"s(φ)","φ","s",(2.15*math.pi,3),(0.1,60))
    set_co_axis(v_phi,"v(φ)","φ","v",(2.15*math.pi,3),(0.1,65))
    set_co_axis(a_phi,"a(φ)","φ","a",(2.15*math.pi,3),(0.1,100))
    fig1.add_axes(s_phi)
    fig1.add_axes(v_phi)
    fig1.add_axes(a_phi)

    X_Phi=[0,Phi_0_1,Phi_0_1+Phi_s_1,Phi_0_1+Phi_s_1+Phi_0_2,360]
    for i in range(0,4):
        a_phi.arrow((X_Phi[i+1]+X_Phi[i])*math.pi/360, -100, 
                    (X_Phi[i+1]-X_Phi[i])*math.pi/360, 0,
                width=0.01,
                length_includes_head=True, 
                head_width=3,
                head_length=0.1,
                fc='r',
                color='b',
                ec='b')

        a_phi.arrow((X_Phi[i+1]+X_Phi[i])*math.pi/360, -100, 
                    -(X_Phi[i+1]-X_Phi[i])*math.pi/360, 0,
                width=0.01,
                length_includes_head=True, 
                head_width=3,
                head_length=0.1,
                fc='r',
                color='b',
                ec='b') 
    for X in [Phi_0_1,Phi_0_1+Phi_s_1,Phi_0_1+Phi_s_1+Phi_0_2,360]:
        a_phi.plot([X*math.pi/180,X*math.pi/180],[-105,0],c="black",linewidth=1)
    a_phi.text((X_Phi[0]+X_Phi[1])*math.pi/360,-108,r"$Φ_0$",ha='center',va='center')
    a_phi.text((X_Phi[2]+X_Phi[1])*math.pi/360,-108,r"$Φ_s$",ha='center',va='center')
    a_phi.text((X_Phi[2]+X_Phi[3])*math.pi/360,-108,r"${Φ_0}^{'}$",ha='center',va='center')
    a_phi.text((X_Phi[3]+X_Phi[4])*math.pi/360,-108,r"${Φ_s}^{'}$",ha='center',va='center')

    fig2=plt.figure(figsize=(10,10),dpi=80)

    ds_dphi_s=axisartist.Subplot(fig2,1,1,1)
    set_co_axis(ds_dphi_s,"","ds/dφ","s",(67,3),(3,65))

    ds_dphi_s.set_xticks(np.linspace(-40,60,11))
    ds_dphi_s.set_yticks(np.linspace(-100,60,17))

    x1=np.linspace(0,60,600)
    x2=np.linspace(-50,50,1000)
    x3=x1

    s1=math.tan((90-alpha_1)*math.pi/180)*(x1-x_1)+s_1
    s2=math.tan((90+alpha_2)*math.pi/180)*(x2-x_2)+s_2
    s3=-math.tan((90-alpha_1)*math.pi/180)*x3

    ds_dphi_s.plot(mo_dphi_data[1],mo_dphi_data[0])
    ds_dphi_s.plot(x1,s1)
    ds_dphi_s.plot(x2,s2)
    ds_dphi_s.plot(x3,s3)
    ds_dphi_s.text(67,3,"ds/dφ",ha="center",va="center")
    ds_dphi_s.text(3,65,"s",ha="center",va="center")
    e=-(s_1-math.tan((90-alpha_1)*math.pi/180)*x_1)/(2*math.tan((90-alpha_1)*math.pi/180))
    s_0=(s_1-math.tan((90-alpha_1)*math.pi/180)*x_1)/2

    ds_dphi_s.plot(e,s_0,marker='o')
    ds_dphi_s.annotate("(%.2f,%.2f)" % (e,s_0), 
                        xy=(e,s_0),
                        xytext=(5,0),
                        textcoords='offset points')
    ds_dphi_s.set_aspect(1)
    ds_dphi_s.grid()
    fig2.add_axes(ds_dphi_s)
    Cam.e,Cam.s0,Cam.r_0=e,-s_0,math.sqrt(e**2+s_0**2)
    alpha_data=[]
    rho_data=[]
    for i in range(0,360):
        alpha_data.append(Cam.get_pressure_angle(i))
        rho_data.append(Cam.get_rho(i))
        if(i==0 or (rho_data[i]>0 and rho_data[i]<rho_min)):
            rho_min=rho_data[i]
    fig3=plt.figure(figsize=(10,10),dpi=80)
    alpha_phi=axisartist.Subplot(fig3,2,1,1)
    rho_phi=axisartist.Subplot(fig3,2,1,2)
    set_co_axis(alpha_phi,R"e=%.2f $r_0$=%.2f"%(e,math.sqrt(e**2+s_0**2)),
                "φ","α",(2.15*math.pi,0.5),(0.1,53))
    set_co_axis(rho_phi,'ρ(φ)',"φ","ρ",(2.15*math.pi,0.5),(0.1,1200))
    alpha_phi.plot(phi_x,alpha_data)
    rho_phi.plot(phi_x,rho_data)
    fig3.add_axes(alpha_phi)
    fig3.add_axes(rho_phi)

    Cam.r_r=rho_min*0.4
    x_data=[]
    y_data=[]
    px_data=[]
    py_data=[]
    for i in range(0,360):
        x_data.append(Cam.get_theoretical_outline(i)[0])
        y_data.append(Cam.get_theoretical_outline(i)[1])
        px_data.append(Cam.get_partical_outline(i)[0])
        py_data.append(Cam.get_partical_outline(i)[1])
    fig4=plt.figure(figsize=(10,10),dpi=80)
    x_y=plt.subplot(1,1,1)
    x_y.set_aspect(1)
    x_y.grid()
    x_y.xaxis.set_major_locator(MultipleLocator(10))
    x_y.yaxis.set_major_locator(MultipleLocator(10))
    l1,=x_y.plot(x_data,y_data,label="理论廓线",linestyle='--')
    l2,=x_y.plot(px_data,py_data,label='实际廓线')
    x_y.set_title(r'${ρ}_{min}=$'+'%.2f\n'%(rho_min)+r'${r}_{r}={ρ}_{min}*0.4=$'+'%.2f\n'%(rho_min*0.4))
    font=font_manager.FontProperties(fname='C:\Windows\Fonts\simsun.ttc')
    fig4.legend(handles=[l1,l2],labels=['理论廓线','实际廓线'],loc=[0.15,0.72],prop=font)
    fig4.add_axes(x_y)
    plt.show()

生成图表一览

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

  • 8
    点赞
  • 47
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值