Форум сайта python.su
Здравствуйте!
Помогите пожалуйста с заданием где надо написать код для реализации математического маятника в grahpics. Не понимаю с чего начинать и как это реализовать.
Задание взято на сайте http://judge.mipt.ru/mipt_cs_on_python3/ (Тимофей Хирьянов лекция №5)
Офлайн
ElmarBВот пример похожей задачи на физические процессы (груз на резинке)
Не понимаю с чего начинать и как это реализовать.
Офлайн
Хорошо посмотрю, спасибо.
Может тут есть кто-то, кто сталкивался с этим заданием? До этого было задание переписать код солнечной системы, используя метод move, с ним я справился а вот с маятником беда.
Не понимаю как сделать так что бы шарик/мячик совершал колебания с права на лева и обратно.
Офлайн
Здравствуйте коллеги!
Помогите с решением задачи мат. маятника по лекции №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)
Офлайн
Нет отрисовки веревки
import graphics as gr import math as m SIZE_X = 800 SIZE_Y = 800 window = gr.GraphWin("Mayatnik", SIZE_X, SIZE_Y) length = 300 # Длина рычага G = 0.01 # Сила притяжения mass = 10 # Масса тела angle = 3 # Устанавливаем начальный угол angle_velocity = 0 # Ускорение angle_accelaration = -G * m.sin(angle) # Начальное ускорени center_point = gr.Point(SIZE_X / 2, SIZE_Y / 2) # Центр холста coords = gr.Point(center_point.x + length*m.sin(angle), center_point.y + length*m.cos(angle)) # Начальные координаты шара # Фон rectangle = gr.Rectangle(gr.Point(0, 0), gr.Point(SIZE_X, SIZE_Y)) rectangle.setFill('white') rectangle.draw(window) # Рисуем центр center = gr.Circle(center_point, 20) center.setFill('black') center.draw(window) # Рисуем шар ball = gr.Circle(gr.Point(coords.x, coords.y), mass*5) ball.setFill('grey') ball.draw(window) def update_coords(coords): new_point = gr.Point(center_point.x + length*m.sin(angle), center_point.y + length*m.cos(angle)) velocity = gr.Point(new_point.x - coords.x, new_point.y - coords.y) return velocity def get_angle(angle, angle_accelaration, angle_velocity): angle_accelaration = -G * m.sin(angle) angle += angle_velocity angle_velocity += angle_accelaration angle_velocity *= 0.99 return angle, angle_accelaration, angle_velocity while True: angle, angle_accelaration, angle_velocity = get_angle(angle, angle_accelaration, angle_velocity) velocity = update_coords(ball.getCenter()) ball.move(velocity.x, velocity.y) gr.time.sleep(0.03) if window.checkMouse(): break window.close()
Офлайн
+ веревка:
import graphics as gr import math as m SIZE_X = 800 SIZE_Y = 800 window = gr.GraphWin("Mayatnik", SIZE_X, SIZE_Y) length = 300 # Длина рычага G = 0.01 # Сила притяжения mass = 10 # Масса тела angle = 3 # Устанавливаем начальный угол angle_velocity = 0 # Ускорение angle_accelaration = -G * m.sin(angle) # Начальное ускорени center_point = gr.Point(SIZE_X / 2, SIZE_Y / 2) # Центр холста coords = gr.Point(center_point.x + length * m.sin(angle), center_point.y + length * m.cos(angle)) # Начальные координаты шара # Фон rectangle = gr.Rectangle(gr.Point(0, 0), gr.Point(SIZE_X, SIZE_Y)) rectangle.setFill('white') rectangle.draw(window) # Рисуем центр center = gr.Circle(center_point, 20) center.setFill('black') center.draw(window) # Рисуем шар ball = gr.Circle(gr.Point(coords.x, coords.y), mass * 5) ball.setFill('grey') ball.draw(window) def update_coords(coords): new_point = gr.Point(center_point.x + length * m.sin(angle), center_point.y + length * m.cos(angle)) velocity = gr.Point(new_point.x - coords.x, new_point.y - coords.y) return velocity def get_angle(angle, angle_accelaration, angle_velocity): angle_accelaration = -G * m.sin(angle) angle += angle_velocity angle_velocity += angle_accelaration angle_velocity *= 0.99 return angle, angle_accelaration, angle_velocity while True: angle, angle_accelaration, angle_velocity = get_angle(angle, angle_accelaration, angle_velocity) velocity = update_coords(ball.getCenter()) ball.move(velocity.x, velocity.y) line = gr.Line(center_point, ball.getCenter()) line.draw(window) gr.time.sleep(0.03) line.undraw() if window.checkMouse(): break window.close()
Офлайн