Проект. Рух тіла, кинутого під кутом до горизонту

Моделювання фізичного явища: рух тіла, кинутого під кутом до горизонту
Фізична задача формулюється наступним чином:
Тіло кинуто під кутом α до горизонту з початковою висоти 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. З допомогою якого класу створили шкалу кутів ?

Комментариев нет:

Отправить комментарий