Уведомления

Группа в Telegram: @pythonsu

#1 Март 9, 2020 21:06:57

ElmarB
Зарегистрирован: 2020-02-24
Сообщения: 19
Репутация: +  0  -
Профиль   Отправить e-mail  

Математический маятник в graphics

Здравствуйте!
Помогите пожалуйста с заданием где надо написать код для реализации математического маятника в grahpics. Не понимаю с чего начинать и как это реализовать.

Задание взято на сайте http://judge.mipt.ru/mipt_cs_on_python3/ (Тимофей Хирьянов лекция №5)

Офлайн

#2 Март 9, 2020 23:42:32

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 9726
Репутация: +  843  -
Профиль   Отправить e-mail  

Математический маятник в graphics

ElmarB
Не понимаю с чего начинать и как это реализовать.
Вот пример похожей задачи на физические процессы (груз на резинке)
https://www.youtube.com/watch?v=pUC3AOyMkWA&t=9m45s

Видимо, в задании Тимофея нужно сделать маятник, который с каждым махом затормаживается и в конце встаёт ровно. Это нужно реализовать гравитацию, которая тянет маятник вниз и из-за этого его амплитуда колебаний уменьшается.

Если не понимаешь, как это сделать, то начни с задач попроще.



Офлайн

#3 Март 10, 2020 17:49:31

ElmarB
Зарегистрирован: 2020-02-24
Сообщения: 19
Репутация: +  0  -
Профиль   Отправить e-mail  

Математический маятник в graphics

Хорошо посмотрю, спасибо.

Может тут есть кто-то, кто сталкивался с этим заданием? До этого было задание переписать код солнечной системы, используя метод move, с ним я справился а вот с маятником беда.
Не понимаю как сделать так что бы шарик/мячик совершал колебания с права на лева и обратно.

Офлайн

#4 Май 20, 2020 21:43:45

Viktor85
Зарегистрирован: 2020-04-25
Сообщения: 1
Репутация: +  0  -
Профиль   Отправить e-mail  

Математический маятник в graphics

Здравствуйте коллеги!
Помогите с решением задачи мат. маятника по лекции №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)

Офлайн

#5 Окт. 18, 2020 22:05:40

some000
Зарегистрирован: 2020-10-18
Сообщения: 6
Репутация: +  0  -
Профиль   Отправить e-mail  

Математический маятник в graphics

Нет отрисовки веревки

 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()

Офлайн

#6 Окт. 20, 2020 07:54:57

Vigi
От: Курья, Алтай
Зарегистрирован: 2015-02-07
Сообщения: 144
Репутация: +  8  -
Профиль   Отправить e-mail  

Математический маятник в graphics

+ веревка:

 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()

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version