Здравствуйте коллеги!
Помогите с решением задачи мат. маятника по лекции №5 Тимофея Хирьянова.
Не получается реализовать затухание колебаний.
Тут дело уже даже не в программировании, а в понимании физики процесса.
Как я понял затухание можно реализовать 2 способами:
1. Реализовать силу трения через коэф. затухания.
2. Реализовать влияние массы и силы тяжести.
Если без затухания, то нужно как то реализовать отсечение и зеркальный возврат маятника при достижении каких то углов (например - Пи/3 до Пи/3).
К сожалению, не один из способов я не реализовал.
Проблема усугубляется тем, что при изменении параметров маятника (длины, амплитуды и ,главное, приращения шага времени получается полностью разные картины колебаний.
Мой не работающий толком код:
import graphics as gr
import math as m
SIZE_X = 2000
SIZE_Y = 1000
window = gr.GraphWin("Model", SIZE_X, SIZE_Y)
# Начальные условия
l = 100 # длина маятника
w0 = m.sqrt(9.81/l) # круговая (собственная) частота колебаний
Ax = 20 # амплитуда колебаний по Х
fix0 = m.pi # начальная фаза.
fi = 0 # угол отклонения маятника
t = 0 # начальный момент времени
coords = gr.Point(1000, 500) # начальные координаты маятника в пикселях
x0 = 1000
y0 = 500
def fi(t):
# вычисляем угол fi отклонение маятника
fi = (Ax * m.sin(w0 * t + fix0))
return fi
def new_coords(t):
'''Вычисляем текущие координаты точки'''
x = l * m.sin(fi(t)) + x0 # координата по Х
y = l * m.cos(fi(t)) + y0 # координата по Y
return gr.Point(x, y)
def add(point_1, point_2):
'''сумма координат точек'''
new_point = gr.Point(point_1.x + point_2.x,
point_1.y + point_2.y)
return new_point
def sub (point_1, point_2):
'''разность координат точек'''
new_point = gr.Point(point_1.x - point_2.x,
point_1.y - point_2.y)
return new_point
# рисуем саму точку на поле с начальными координатами
circle = gr.Circle(coords, 10)
circle.setFill('red')
circle.draw(window)
# устареваем текущие координаты
pref_coords = gr.Point(coords.x, coords.y)
# запускаем сам цикл
while True:
t += 0.1 # шаг времени
q = add(new_coords(t), pref_coords) # сумма координат точек
p = sub(new_coords(t), pref_coords) # разность координат точек
circle.move(p.x, p.y) # двигаемся на эту разницу
# устареваем новые координаты
pref_coords= gr.Point(coords.x, coords.y)
gr.time.sleep(0.1)
Пока решал эту задачу, случайно построил фигуры Лиссажу. Угол фи вычислять не надо, остальное как в предыдущем.
# Начальные условия
wx = 2 # циклическая частота (число полных колебаний за 2ПИ секунд)
wy = 3 # циклическая частота (число полных колебаний за 2ПИ секунд), частоты по Х и У д.б. равны для окружности
Ax = 20 # амплитуда колебаний по Х
Ay = 20 # амплитуда колебаний по Y, д.б. равны для окружности
fix0 = 1.5*m.pi # начальная фаза.
fiy0 = 3*m.pi # Для уравнения окружности необходимо чтобы fiy0 - fix0 = pi/2
dfi = fiy0 - fix0
t = 0 # начальный момент времени
coords = gr.Point(500, 500) # начальные координаты маятника в пикселях
x0 = 500
y0 = 500
def new_coords(t):
'''Вычисляем текущие координаты точки'''
x = (Ax * m.cos(wx * t)) + x0 # координата по Х
y = (Ay * m.cos((wy * t) + dfi)) + y0 # координата по Y
return gr.Point(x, y)