- •Лабораторная работа №1 «Определение корня уравнения»
- •Лабораторная работа №2 «Определение корня уравнения методом хорд»
- •«Определение корня уравнения методом деления отрезка пополам»
- •Лабораторная работа №3 «Построение графиков функции, производной и первообразной»
- •Лабораторная работа №4 «Определение максимума функции одной переменной»
- •«Определение максимума функции 2-х переменных»
- •Лабораторная работа №5 «Определение минимума функции одной переменной»
- •«Определение минимума функции нескольких переменных»
- •Лабораторная работа №6 «Полином»
- •Лабораторная работа №7 «Модель подвески трёх масс»
- •3. Граф динамической модели
- •4. Тексты программы «Динамического анализа станка 16к20»
- •8. Результаты расчета по программе
3. Граф динамической модели
4. Тексты программы «Динамического анализа станка 16к20»
agregat_obj.py – Модуль, создающий файлы gif с графиками
# -*- coding: utf-8 -*-
from Tkinter import *
import math
import sys
from StringIO import StringIO
from PIL import Image,ImageDraw,ImageFont
from math import *
#=================================================
def mashtab1(mx,mmy,x,y,by=0.0):
max_x,min_x=max(mx),min(mx)
dx=(max_x-min_x)/x
if by==0:
max_y,min_y=None,None
for my in mmy:
max_ay,min_ay=max(my),min(my)
if max_y==None or max_y<max_ay: max_y=max_ay
if min_y==None or min_y>min_ay: min_y=min_ay
dy=(max_y-min_y)/y
mmi=[]
for my in mmy:
mi=[]
if by:
max_y,min_y=max(my),min(my)
dy=(max_y-min_y)/y*by
for i in range(len(mx)):
ix,iy=int((mx[i]-min_x)/dx),y-int((my[i]-min_y)/dy)
if ix<1: ix=1
if iy<1: iy=1
if ix>x-1: ix=x-1
if iy>y-1: iy=y-1
kort=(ix,iy)
mi.append(kort)
mmi+=[mi]
return mmi,max_x,min_x,max_y,min_y
def desine(name,a=400,b=300,rgb=(255,255,255),fil=[(0,0,0)],lt=[],lx=[],by=0,mes='proba',dix=50,diy=50):
fill=(0,0,0)
ab=[(1,1),(a-1,1),(a-1,b-1),(1,b-1),(1,1)]
imp = Image.new('RGB',(a,b),rgb)
draw = ImageDraw.Draw(imp, mode='RGB')
x,y,ix,iy=a,b,0,0
if x and y:
mi,max_x,min_x,max_y,min_y=mashtab1(lt,lx,x,y,by)
l=len(lx)
dl=255/l
(r,g,bl)=fill
k=0
kl=len(fil)-1
for i in mi:
draw.line(i,fil[k])
if k<kl:
k+=1
else:
k=0
if mes:
s='%8.5f;%8.5f' % (max_y,min_y)
draw.text((10,5),mes+s, fill=(1,100,250))
draw.line(ab,fill)
while iy<y:
iy+=diy
draw.line([(1,iy),(x,iy)],fill)
while ix<x:
ix+=dix
draw.line([(ix,1),(ix,y)],fill)
imp.save(name,'gif')
object_lib.py – описаны все объекты: объект движения (М) объект двигателя (Д)
объект упругого взаимодействия класс (С)
class M:
def __init__(self,m=0.0):
self.m,self.x,self.f,self.l=m,[0.0,0.0,0.0],0.0,[[0.0],[0.0],[0.0]]
def step(self,dt):
if self.m == 0.0:
self.x=[0.0,0.0,0.0]
return
else:
self.x[2]=self.f/self.m
self.x[0]+=0.5*self.x[1]*dt
self.x[1]+=self.x[2]*dt
self.x[0]+=0.5*self.x[1]*dt
def add(self):
for i in xrange(3):
self.l[i]+=[self.x[i]]
Uo, Lpr, Rpr = 1.0, 0.01, 0.01
class D:
def __init__(self):
"""Ke:=1;Tg:=0.05;Upr:=0;Upr=0.0;w=0.0;Ke=1.0;Tg=0.05;x=0.0;y=0.0"""
self.Upr=0.0
self.w=0.0
self.Ke=1.0
self.Tg=0.05
self.x=0.0
self.y=0.0
def step(self,dt):
self.y=((self.Upr-self.Ke*self.w)-self.x)/self.Tg;
self.x+=self.y*dt
class C:
def __init__(self,c=0.0, r=0.0):
self.c, self.r=c, r
def F(self,ds,dv):
return self.c*ds+self.r*dv
agregat_p.py – главный модуль программы, в котором производятся расчеты
from objects_lib import* – импорт данных из файла objects_lib
from agregat_obj import * -импорт данных из файла agregat_obj
затем расчет силы резания
#1 определяются параметры модели Д - основной двигатель Дс - двигатель подачи
затем ротор, коробка, шпиндель, стойка-корпус.
Мх, Му, Мз - описывают упругие колебания суппорта, приведенные к кромке резца
Срк..... жесткости узлов, Сх, Су, -жесткости крепления резца
Т-время,
дТ - шаг интегрирования
Ткон - конечное время
R-требуем радиус детали
Тно - глубина резания
#2 интегрирование на шаге
Фр - сила резания
d.w =Jr.x[1]/150.0 - отправляется в объект двигателя, 150 = 1500 оборотов
Jr.f =d.x*1500.0 - момент на валу ротора, который появляется при подаче электроэнергии
#3 вывод графика
desine(name1,400,400,white,[red,blue,green,black,green],lt,[Jr.l[1],Jr.l[2],lf,Js.l[2],mx.l[0]],1,'')
name1 - файл куда писать
400,400 - размеры окна
white - цвет подложки фон
red, blue, green, black .... – цвета линий графика
lt - массив значений времени
Список в квадр. скобках: скорость ротора, момент, список значений силы резания
Js.l[2] -момент на влу двигат
mx.l[0] -колебания кромки резца по х
1 - признак того, что все графики в одном масшт.
«» - надпись на графике
desine(name2,400,400,white,[blue],Jr.l[2],[Jr.l[1]],0,'') - динамич. характеристика двигателя
#4 операторы вывода на экран
# -*- coding: utf-8 -*-
from Tkinter import *
import math
import sys
from objects_lib import *
from agregat_obj import *
def rez(v=0.0,t=0.0, s=0.0):
"""Сила резания при точении"""
x, y, n, Kp, Cp = 1.0, 1.0, 1.0, 1.0, 0.01
rez = 0.0
s=0.1
t=5.0
if v>0.0 and t>0.0 and s>0.0:
rez=-10.0*Cp*pow(t,x)*pow(s,y)*pow(v,n)*Kp*1.0
return rez
# 1 =================================================
d,ds=D(),D()
Jr,Jk,Js=M(0.50),M(0.30),M(0.10)
stoyka=M(0.0)
mx,my,mz=M(100.0),M(100.0),M(100.0)
ms=M(100.0)
crk,cks=C(4000.0, 1.7),C(5000.0, 1.7)
cx,cy,cz=C(5000.0, 500.7),C(5000.0, 500.7),C(2000.0, 10.7)
J=[Jr,Jk,Js,mx,my,mz,ms]
c=[crk,cks,cx,cy,cz]
l = [(crk,Jr,Jk),(cks,Jk,Js),(cx,stoyka,mx),(cy,stoyka,my),(cz,ms,mz)] #graf
t, dt, tkon, Fr = 0.0, 0.0001, 3.2, 0.0
R,tho=0.05,2.0
lt, lf =[t], [Fr] #lines
kout=15
kkout=kout
# 2 =================================================
while t<tkon:
for i in J: i.f=0.0
d.Upr=Uo-d.x*Rpr-d.y*Lpr
d.w =Jr.x[1]/150.0
Jr.f =d.x*1500.0
ds.Upr=Uo-ds.x*Rpr-ds.y*Lpr
ds.w =ms.x[1]/0.10
ms.f =ds.x*10.0
dx=mx.x[0]-stoyka.x[0]
dy=my.x[0]-stoyka.x[0]
Ro=pow(dy*dy+(dx+R)*(dx+R),0.5)
dR=Ro-R
th=tho-dR*1000.0
Fr=rez(Js.x[1]*Ro, th, mz.x[0])
Fy=Fr*(R+dx)/Ro
Fx=Fr*dy/Ro
Fz=Fr*0.01
mx.f+=Fx
my.f+=Fy
mz.f+=Fz
Js.f+=Fr*Ro
d.step(dt)
ds.step(dt)
for (c, m1, m2) in l:
f=c.F(m1.x[0]-m2.x[0], m1.x[1]-m2.x[1])
m2.f+=f
m1.f-=f
for i in J: i.step(dt)
if kout>=kkout:
for i in J: i.add()
lt +=[t]
lf +=[Fr]
kout=1
kout+=1
t+=dt
# 3 =================================================
white,black,blue,red,green=(255,255,255),(0,0,0),(2,5,200),(200,5,2),(2,200,2)
name1,name2="dvig1.gif","dvig2.gif"
desine(name1,400,400,white,[red,blue,green,black,green],lt,[Jr.l[1],Jr.l[2],lf,Js.l[2],mx.l[0]],1,'')
desine(name2,400,400,white,[blue],Jr.l[2],[Jr.l[1]],0,'')
# 4 =================================================
A,B=800,500
tk = Tk()
tk.title("Токарный станок")
f = Frame(tk)
f.pack()
c = Canvas(f, bg="White", width=A, height=B)
c.pack(expand=1, fill=BOTH)
img1, img2 = PhotoImage(file=name1), PhotoImage(file=name2)
c.create_image(1, 1, image=img1, anchor=NW)
c.create_image(401,1, image=img2, anchor=NW)
s1='Скорость: от %10.2f до %10.2f об/мин' % (0.0,max(Jr.l[1]))
s2='Момент: от %10.2f до %10.2f Нм' % (min(Jr.l[2]),max(Jr.l[2]))
s3='Время: от %10.2f до %10.2f с' % (0.0,tkon)
s4='Сила резания: от %10.5f до %10.5f Н' % (0.0,max(lf))
c.create_text(150, B-90, text=s1, fill="red")
c.create_text(150, B-75, text=s2, fill="blue")
c.create_text(150, B-60, text=s3, fill="black")
c.create_text(150, B-40, text=s4, fill="black")
widget = Label(c, text='Модель', fg='black', bg='white')
widget.pack()
c.create_window(25, B-10, window=widget)
tk.mainloop(1)
