Вы находитесь на странице: 1из 6

СЕ. Лабораторная работа №3.

Система ДУ:

2
φ̈ + 2δφ̇ + ω φ = 0
{
φ̇ = φ̇ + p
+ −

где φ - угол отклонения маятника от вертикали, δ - коэффициент вязкого трения, ω -


частота свободных колебаний, φ̇ - угловая скорость до удара, φ̇ - угловая скорость
+ −

после удара (удар - при φ = α ).

Пусть ψ = φ̇, тогда:

⎧ φ̇ = ψ

2
⎨ ψ̇ = −2δψ − ω φ


φ̇ = φ̇ + p
+ −

Зададим параметры и начальные условия.

Параметры: ω = 3, δ = 0.2, p = 1.5, α = 0 .

Начальные условия: φ 0 = 0, ψ0 = 10 .

Состояние системы: u = (φ, ψ)

In [80]: import matplotlib as mpl


from matplotlib import pyplot as plt
import numpy as np
import math

In [81]: omega = 3
delta = 0.2
p = 1.5
alpha = 0

phi_0, psi_0 = 0, 10
u0 = np.array([phi_0, psi_0])

def f(u, omega=3, delta=0.2):


return np.array([u[1], -2 * delta * u[1] - omega * omega * u[0]])

Зададим функции метода Эйлера и построения фазового портрета:

In [82]: def euler(u, h=0.01, p=1.5, alpha=0, omega=3, delta=0.2):


u_next = u + h * f(u, omega=omega, delta=delta)

if u_next[0] > alpha and u[0] < alpha:


u_next[1] += p
return u_next

def phase_portrait(u0, h=0.01, p=1.5, alpha=0, omega=3, delta=0.2, do_draw=True):


t_space = np.linspace(0, 30, num=int(30/h))
u_values = []
u = u0
for t in t_space:
u_values.append(u)
u0 = u
u = euler(u0, h=h, p=p, alpha=alpha, omega=omega, delta=delta)
phi_values = list(map(lambda u: u[0], u_values))
psi_values = list(map(lambda u: u[1], u_values))

periods = []
ix_p = 0
for i in range (1, len(phi_values)):
if phi_values[i] > alpha and phi_values[i-1] < alpha:
periods.append(t_space[i] - t_space[ix_p])
ix_p = i
if (do_draw):
plt.figure(figsize=(10, 10))
plt.plot(phi_values, psi_values)
plt.grid()
plt.xlabel("phi")
plt.ylabel("psi")
plt.show()

print("T = {}".format(2 * np.pi / np.sqrt(omega * omega - delta * delta)))


print("u* = {}".format(p / (1 - np.exp(-2 * np.pi * delta / np.sqrt(omega *

return sum(periods)/float(len(periods))

Построим фазовый портрет с нашими параметрами и начальными условиями:

In [83]: h = 0.01
print("Средний период по колебаниям: {}".format(phase_portrait(u0, h=h, p=p, alpha=a
T = 2.099064885453392
u* = 4.375342732996142
Средний период по колебаниям: 2.0978421378554755
Здесь T - период колебаний,

=
Ω

p
u

=
−2πδ
- неподвижная точка, соответствующая автоколебаниям часов,
Ω
1−e

Ω = √ω
2
− δ
2
.

Изменим начальные условия: φ 0 ,


= π ψ = 1 .

In [84]: u0 = np.array([np.pi, 1])


print("Средний период по колебаниям: {}".format(phase_portrait(u0, h=h, p=p, alpha=a

T = 2.099064885453392
u* = 4.375342732996142
Средний период по колебаниям: 2.0642595150764538
Видим, что изменение начальных условий никак не повлияло на T и u . ∗

Изменим параметр удара: p = 1 .

In [85]: p = 1
print("Средний период по колебаниям: {}".format(phase_portrait(u0, h=h, p=p, alpha=a
T = 2.099064885453392
u* = 2.916895155330761
Средний период по колебаниям: 2.0642595150764538
Изменение p влияет на u , но не на T .

Изменим частоту свободных колебаний: ω = 2 .

In [86]: omega = 2
print("Средний период по колебаниям: {}".format(phase_portrait(u0, h=h, p=p, alpha=a
T = 3.1574194169982763
u* = 2.135848886916229
Средний период по колебаниям: 3.0810270090030007
Изменились и T , и u .

Построим график зависимости среднего периода по колебаниям от p.

In [87]: p_space = np.linspace(0.1, 5, num=int(5/0.05))


T_mean_values = [phase_portrait(u0, h=h, p=p_, alpha=alpha, omega=omega, delta=delta

plt.plot(p_space, T_mean_values)
plt.grid()
plt.xlabel("p")
plt.ylabel("Средний период")
plt.show()
Видим, что средний период изменяется только в пределах погрешности вычислений и
никак не зависит от p.