Моделювання фізичного явища: рух тіла, кинутого під кутом до горизонту
Фізична задача формулюється наступним чином:
Тіло кинуто під кутом α до горизонту з початковою висоти h0 = 0 і з початковою швидкістю v0. Визначити величину кута α при якій дальність польоту тіла буде максимальною. Опором повітря знехтувати.
Основні позначення для вирішення завдання показані на рис.
Напишемо формули, за якими визначаються координати тіла x і y залежно від часу.
Виразимо координату х через t:
і підставивши вираз для часу в формулу для координати y, отримаємо рівняння траєкторії y (x):
Оскільки опір при русі тіла відсутній, горизонтальна складова швидкості змінюватися не буде, а зміна вертикальної складової визначається впливом прискорення вільного падіння.
Час t0, через яке буде досягнута найвища точка траєкторії, знайдемо з умови vверт = 0.
Максимальну висоту підйому H знайдемо з рівняння вертикального руху в момент часу t0.
Повний час польоту T, очевидно, дорівнює 2*t0, тому дальність польоту S визначимо як
Всі ці формули знадобляться для обчислення координат точок траєкторії і параметрів траєкторії при моделюванні.
Текст програми з процедурами наведено нижче.
# Рух тіла, кинутого під кутом до горизонту
#
from tkinter import*
import math
def plot_xy_axe():
x_axe=[]
xx=(x0,y0); x_axe.append(xx)
xx=(x1,y0); x_axe.append(xx)
c.create_line(x_axe, fill="black",width=2, arrow=LAST)
#
y_axe=[]
yy=(x0,y0); y_axe.append(yy)
yy=(x0,y1); y_axe.append(yy)
c.create_line(y_axe, fill="black",width=2, arrow=LAST)
def clear():
c.delete("all")
def drawGraph():
# отримуємо і перераховуємо параметри
dta=sc.get()
alpha=dta*math.pi/180
dtlbl=clist.get()
# очищаємо область для тексту
c.create_rectangle(x1i-90, y1i-50, x1i+50, y1i+10, fill="#eeeeff")
g=10.0
v0=63
S=int((v0**2)*math.sin(2*alpha)/g)
H=int(((v0**2)*(math.sin(alpha))**2)/(2*g))
points=[] #
for x in range(x0i, x1i):
xx=(x-x0)
y=(xx*math.tan(alpha))-((xx**2)*g/(2*(v0**2)*(math.cos(alpha)**2)))
if y>0:
yy=int(y0-y)
else:
yy=y0i
pp=(x,yy)
points.append(pp)
c.create_line(points, fill= dtlbl, smooth=1)
plot_xy_axe()
# Параметри графіка
dtext="Дальність: "+str(S)
vtext="Висота: "+str(H)
dalnost=c.create_text(x1i-70, y1i-30, text=dtext, fill=dtlbl, anchor="w")
vysota=c.create_text(x1i-70, y1i-10, text=vtext, fill=dtlbl, anchor="w")
root=Tk()
root.title("Моделювання польоту тіла")
menuf=Frame(root)
menuf.pack({"side":"top","fill":"x"})
lbl=Label(menuf, text="Вибір кольору")
lbl.pack({"side":"left","fill":"x"})
clist=StringVar(menuf)
clist.set('black')
cspis=OptionMenu(menuf, clist,
'red',
'green',
'blue',
'cyan',
'magenta',
'purple',
'black'
)
cspis.pack(side=LEFT)
btnOk=Button(menuf, text="Нарисувати", padx=2, command=drawGraph)
btnOk.pack(side=LEFT)
btnClear=Button(menuf, text="Очистити", padx=2, command=clear)
btnClear.pack(side=LEFT)
btnClose=Button(menuf, text="Закрити", padx=2,command=root.destroy)
btnClose.pack(side=LEFT)
#Надпис для шкали кутів
lbl2=Label(root, text='Кут в градусах:', font=('Arial',12))
lbl2.pack(side=TOP)
# Шкала кутів
sc=Scale(root, from_=0, to=90, orient="horizontal")
sc.pack({"side":"top","fill":"x"})
c=Canvas(root, height=420, width=520, background="#eeeeff", borderwidth=10)
c.pack(side=BOTTOM)
x0=50.0; y0=300.0; x1=450.0; y1=50.0
x0i=int(x0); x1i=int(x1); y0i=int(y0); y1i=int(y1)
plot_xy_axe()
root.mainloop()
Реалізація моделі має ряд особливостей.
По перше, величина прискорення вільного падіння (g) прийнята як 10.
По-друге, модуль початкової швидкості обраний так, щоб при будь-яких значеннях кута вся траєкторія потрапляла в область графіка.
Не зовсім правильно з точки зору принципу поділу програм і даних установка значень для g і v0 прямо в коді, але таке рішення значно спрощує роботу з моделлю.
«Повзунок» на шкалі установки кутів показує значення в градусах, а для правильних обчислень в тригонометричних функціях ці значення потрібно перевести в радіани.
Висота і дальність «польоту» пишуться для кожної траєкторії відповідним кольором в прямокутнику в верхньому правому куті. Для кожної наступного траєкторії цей прямокутник малюється заново і текст
Завдання
1. Виконати код програми і дослідити при якому куті дальність польоту тіла буде найбільшою.
2. Навести кілька значень пар кутів, коли дальність польоту однакова.
3. Доповнити код програми коментарями
Додатково
1. У моделі тіла, кинутого під кутом до горизонту, напишіть процедури виведення мітки «точки падіння» і мітки максимальної висоти для кожної точки траєкторії.
2. Модифікуйте код для «моделювання польоту» так, щоб можна було змінювати початкову швидкість, а графік автоматично масштабувати в області малювання.
Запитання
1. Чому під час руху тіла, яке кинули під кутом до горизонту, горизонтальна складова швидкості не змінюється, залишається сталою ?
2. Чому рух тіла вздовж вертикальної осі є спочатку рівносповільненим, а потім рівноприскореним ?
3. З допомогою якої вказівки будуються осі координат та точки графіка ?
4. З допомогою якої вказівки виводять на екран текстові написи ?
5. Як назвали список, в який занесли координати точок графіка ?
6. Навіщо імпортували модуль math ?
7. Яке призначення модуля tkinter ?
8. З допомогою якого класу створили шкалу кутів ?
Фізична задача формулюється наступним чином:
Тіло кинуто під кутом α до горизонту з початковою висоти h0 = 0 і з початковою швидкістю v0. Визначити величину кута α при якій дальність польоту тіла буде максимальною. Опором повітря знехтувати.
Основні позначення для вирішення завдання показані на рис.
Виразимо координату х через t:
і підставивши вираз для часу в формулу для координати y, отримаємо рівняння траєкторії y (x):
Оскільки опір при русі тіла відсутній, горизонтальна складова швидкості змінюватися не буде, а зміна вертикальної складової визначається впливом прискорення вільного падіння.
Час t0, через яке буде досягнута найвища точка траєкторії, знайдемо з умови vверт = 0.
Максимальну висоту підйому H знайдемо з рівняння вертикального руху в момент часу t0.
Повний час польоту T, очевидно, дорівнює 2*t0, тому дальність польоту S визначимо як
Всі ці формули знадобляться для обчислення координат точок траєкторії і параметрів траєкторії при моделюванні.
Текст програми з процедурами наведено нижче.
# Рух тіла, кинутого під кутом до горизонту
#
from tkinter import*
import math
def plot_xy_axe():
x_axe=[]
xx=(x0,y0); x_axe.append(xx)
xx=(x1,y0); x_axe.append(xx)
c.create_line(x_axe, fill="black",width=2, arrow=LAST)
#
y_axe=[]
yy=(x0,y0); y_axe.append(yy)
yy=(x0,y1); y_axe.append(yy)
c.create_line(y_axe, fill="black",width=2, arrow=LAST)
def clear():
c.delete("all")
def drawGraph():
# отримуємо і перераховуємо параметри
dta=sc.get()
alpha=dta*math.pi/180
dtlbl=clist.get()
# очищаємо область для тексту
c.create_rectangle(x1i-90, y1i-50, x1i+50, y1i+10, fill="#eeeeff")
g=10.0
v0=63
S=int((v0**2)*math.sin(2*alpha)/g)
H=int(((v0**2)*(math.sin(alpha))**2)/(2*g))
points=[] #
for x in range(x0i, x1i):
xx=(x-x0)
y=(xx*math.tan(alpha))-((xx**2)*g/(2*(v0**2)*(math.cos(alpha)**2)))
if y>0:
yy=int(y0-y)
else:
yy=y0i
pp=(x,yy)
points.append(pp)
c.create_line(points, fill= dtlbl, smooth=1)
plot_xy_axe()
# Параметри графіка
dtext="Дальність: "+str(S)
vtext="Висота: "+str(H)
dalnost=c.create_text(x1i-70, y1i-30, text=dtext, fill=dtlbl, anchor="w")
vysota=c.create_text(x1i-70, y1i-10, text=vtext, fill=dtlbl, anchor="w")
root=Tk()
root.title("Моделювання польоту тіла")
menuf=Frame(root)
menuf.pack({"side":"top","fill":"x"})
lbl=Label(menuf, text="Вибір кольору")
lbl.pack({"side":"left","fill":"x"})
clist=StringVar(menuf)
clist.set('black')
cspis=OptionMenu(menuf, clist,
'red',
'green',
'blue',
'cyan',
'magenta',
'purple',
'black'
)
cspis.pack(side=LEFT)
btnOk=Button(menuf, text="Нарисувати", padx=2, command=drawGraph)
btnOk.pack(side=LEFT)
btnClear=Button(menuf, text="Очистити", padx=2, command=clear)
btnClear.pack(side=LEFT)
btnClose=Button(menuf, text="Закрити", padx=2,command=root.destroy)
btnClose.pack(side=LEFT)
#Надпис для шкали кутів
lbl2=Label(root, text='Кут в градусах:', font=('Arial',12))
lbl2.pack(side=TOP)
# Шкала кутів
sc=Scale(root, from_=0, to=90, orient="horizontal")
sc.pack({"side":"top","fill":"x"})
c=Canvas(root, height=420, width=520, background="#eeeeff", borderwidth=10)
c.pack(side=BOTTOM)
x0=50.0; y0=300.0; x1=450.0; y1=50.0
x0i=int(x0); x1i=int(x1); y0i=int(y0); y1i=int(y1)
plot_xy_axe()
root.mainloop()
Реалізація моделі має ряд особливостей.
По перше, величина прискорення вільного падіння (g) прийнята як 10.
По-друге, модуль початкової швидкості обраний так, щоб при будь-яких значеннях кута вся траєкторія потрапляла в область графіка.
Не зовсім правильно з точки зору принципу поділу програм і даних установка значень для g і v0 прямо в коді, але таке рішення значно спрощує роботу з моделлю.
«Повзунок» на шкалі установки кутів показує значення в градусах, а для правильних обчислень в тригонометричних функціях ці значення потрібно перевести в радіани.
Висота і дальність «польоту» пишуться для кожної траєкторії відповідним кольором в прямокутнику в верхньому правому куті. Для кожної наступного траєкторії цей прямокутник малюється заново і текст
Завдання
1. Виконати код програми і дослідити при якому куті дальність польоту тіла буде найбільшою.
2. Навести кілька значень пар кутів, коли дальність польоту однакова.
3. Доповнити код програми коментарями
Додатково
1. У моделі тіла, кинутого під кутом до горизонту, напишіть процедури виведення мітки «точки падіння» і мітки максимальної висоти для кожної точки траєкторії.
2. Модифікуйте код для «моделювання польоту» так, щоб можна було змінювати початкову швидкість, а графік автоматично масштабувати в області малювання.
Запитання
1. Чому під час руху тіла, яке кинули під кутом до горизонту, горизонтальна складова швидкості не змінюється, залишається сталою ?
2. Чому рух тіла вздовж вертикальної осі є спочатку рівносповільненим, а потім рівноприскореним ?
3. З допомогою якої вказівки будуються осі координат та точки графіка ?
4. З допомогою якої вказівки виводять на екран текстові написи ?
5. Як назвали список, в який занесли координати точок графіка ?
6. Навіщо імпортували модуль math ?
7. Яке призначення модуля tkinter ?
8. З допомогою якого класу створили шкалу кутів ?
Комментариев нет:
Отправить комментарий