Нужно смоделировать маятник на языке Python

Мне нужно смоделировать колебание маятника(без всякой крутой графики и тд, достаточно просто и линии(оси) которая будет перемещаться). С помощью каких библиотек и т.д. проще всего это сделать?


Ответы (2 шт):

Автор решения: vp_arth

ASCII графика подойдёт? =)

import time
import math
import os
def cls():
    os.system('cls' if os.name=='nt' else 'clear')


FPS=10
PERIOD = 5 # sec
start = time.time()

d = 10
l = 30
f = 2*math.pi/PERIOD

def draw(dt):
    cos_dt = math.cos(dt*f)

    cls()
    for a in range(l):
        x = d * a/l * cos_dt
        i = round(x) + d
        s = ' '*(2*d+1)
        s = s[:i] + '*' + s[i+1:]
        print(s)



while True:
    draw(time.time() - start)
    time.sleep(1/FPS)
→ Ссылка
Автор решения: Serg Bocharov

Вот с затуханием. Библиотека graphics.py Документация ну и стандартная math

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()
→ Ссылка