Untitled

 avatar
unknown
python
2 years ago
3.9 kB
10
Indexable
import matplotlib.pyplot as plt
import numpy as np
from matplotlib.animation import FuncAnimation
from scipy.integrate import odeint

def SystDiffEq(y, t, m1, m2, a, b, l0, c, g):
    # y = [phi, psi, phi', psi'] -> dy = [phi', psi', phi'', psi'']
    dy = np.zeros_like(y)
    dy[0] = y[2]
    dy[1] = y[3]

    phi = y[0]
    psi = y[1]
    dphi = y[2]
    dpsi = y[3]

    # a11 * phi'' + a12 * psi'' = b1
    # a21 * phi'' + a22 * psi'' = b2

    l = np.sqrt(8 * a ** 2 * (1 - np.cos(phi)) + l0 * (l0 - 4 * a * np.sin(phi)))
    a11 = ((4/3) * m1 + m2) * a
    a12 = m2 * np.sin(psi - phi)
    b1 = (-(m1 + m2) * g * np.cos(phi) 
         + c * ((l0 / l) - 1) * (4 * a * np.sin(phi) - 2 * l0 * np.cos(phi))
         - m2 * b * dpsi ** 2 * np.cos(psi - phi))
    
    a21 = a * np.sin(psi - phi)
    a22 = b
    b2 = - g * np.sin(psi) + a * dphi ** 2 * np.cos(psi - phi)

    detA = a11 * a22 - a12 * a21
    detA1 = b1 * a22 - a12 * b2
    detA2 = a11 * b2 - b1 * a21

    dy[2] = detA1 / detA
    dy[3] = detA2 / detA

    return dy
    

# Дано:
a = b = l0 = 1
DE = 2 * a
g = 9.8
m1 = 50
m2 = 0.5
a = b = l0 = 1
c = 250
t0 = 0
phi0 = 0
psi0 = np.pi / 18
dphi0 = 0
dpsi0 = 0

# Задаю функции phi(t) и psi(t) 

step = 1000

t = np.linspace(0, 10, step)

y0 = np.array([phi0, psi0, dphi0, dpsi0])

Y = odeint(SystDiffEq, y0, t, (m1, m2, a, b, l0, c, g))

phi = Y[:,0]
psi = Y[:,1]
dphi = Y[:,2]
dpsi = Y[:,3]

ddphi = np.zeros_like(t)
for i in np.arange(len(t)):
    ddphi[i] = SystDiffEq(Y[i], t[i], m1, m2, a, b, l0, c, g)[2]


N = m2 * (g * np.cos(psi) 
          + b * dpsi ** 2
          + a * (ddphi * np.cos(psi - phi)
                 + dphi ** 2 * np.sin(psi - phi)))

fgrt = plt.figure()
phiplt = fgrt.add_subplot(3, 1, 1)
plt.title("phi(t)")
phiplt.plot(t, phi, color = 'r')
psiplt = fgrt.add_subplot(3, 1, 2)
plt.title("psi(t)")
psiplt.plot(t, psi)
nplt = fgrt.add_subplot(3, 1, 3)
plt.title("N(t)")
nplt.plot(t, N)
fgrt.show()


fig = plt.figure()
gr = fig.add_subplot(1, 1, 1)
gr.axis('equal')


# Балка DE
Xd = 0
Yd = 0

Xe = Xd + DE * np.cos(phi)
Ye = Yd + DE * np.sin(phi)

balkaDE = gr.plot([Xd, Xe[0]], [Yd, Ye[0]], color='black', linewidth=5)[0]
pD = gr.plot(Xd, Yd, marker='o', color='r')[0]
pE = gr.plot(Xe, Ye, marker='o', color='r')[0]

# Пружина

Xc = DE
Yc = l0

pC = gr.plot(Xc, Yc, marker='o', color='r')[0]

def get_spring(coils, width, start, end):
    start, end = np.array(start).reshape((2,)), np.array(end).reshape((2,))
    len = np.linalg.norm(np.subtract(end, start))
    u_t = np.subtract(end, start) / len
    u_n = np.array([[0, -1], [1, 0]]).dot(u_t)
    spring_coords = np.zeros((2, coils + 2))
    spring_coords[:,0], spring_coords[:,-1] = start, end
    normal_dist = np.sqrt(max(0, width ** 2 - (len ** 2 / coils ** 2))) / 2
    for i in np.arange(1, coils + 1):
        spring_coords[:,-i] = (start 
                               + ((len * (2 * i - 1) * u_t) / (2 * coils)) 
                               + (normal_dist * (-1) ** i * u_n))
    return spring_coords[0,2:], spring_coords[1,2:]



pS = gr.plot(*get_spring(70, 0.1, [Xe[0], Ye[0]], [Xc, Yc]), color='black')[0]

# Стержень AB

Xa = Xd + DE / 2 * np.cos(phi)
Ya = Yd + DE / 2 * np.sin(phi)

Xb = Xa + b * np.cos(psi - np.pi / 2)
Yb = Ya + b * np.sin(psi - np.pi / 2)

sterjenAB = gr.plot([Xa[0], Xb[0]], [Ya[0], Yb[0]], color='black', linewidth=1)[0]
pA = gr.plot(Xa, Ya, marker='o', color='r')[0]
pB = gr.plot(Xb, Yb, marker='o', color='black', markersize = 20)[0]


def run(i):
    balkaDE.set_data([Xd, Xe[i]], [Yd, Ye[i]])
    pE.set_data(Xe[i], Ye[i])
    pS.set_data(*get_spring(70,0.1, [Xe[i], Ye[i]], [Xc, Yc]))
    pA.set_data(Xa[i],Ya[i])
    pB.set_data(Xb[i], Yb[i])
    sterjenAB.set_data([Xa[i], Xb[i]], [Ya[i], Yb[i]])

anim = FuncAnimation(fig, run, frames = step, interval = 1)

plt.show()

Editor is loading...
Leave a Comment