Вынужденные колебания цепочки в вязкой среде
Материал из Department of Theoretical and Applied Mechanics
Курсовой проект по Механике дискретных сред
Исполнитель: Шпетный Даниил
Группа: 3630103/60101
Семестр: осень 2019
Содержание
Постановка задачи
Исследовать вынужденные колебания в вязкой среде. Построить график перемещений частиц от времени.
Построение модели
Процесс моделируется как одномерные колебания цепочки частиц.
Теоретическая сводка
Парное взаимодействие определяется формулой:
где
— сила взаимодействия, — жесткость связи, — перемещение частицы, — номер частицы.Уравнение скорости частиц
и :где
— сила взаимодействия, — масса частицы, — коэффициент вязкости, — скорость частицы.Граничные и начальные условия
Начальные условия нулевые
Периодические граничные условия:
где
— амплитуда возмущающей силы, — частота возмущающей силы, — количество частиц.Визуализация
Текст программы на языке Python (среда разработки PyCharm):
1 import numpy as np
2 import math
3 import matplotlib.pyplot as plt
4 from matplotlib.patches import Circle
5 from matplotlib.collections import PatchCollection
6 from celluloid import Camera
7
8
9 def Plotting(X, rad, u):
10 n = np.shape(X)[1]
11 patches = []
12 for it in range(n):
13 circle = Circle((X[0, it], 0), rad)
14 patches.append(circle)
15 p = PatchCollection(patches)
16 ax_1 = plt.subplot(2, 1, 1)
17 plt.plot()
18 ax_1.add_collection(p)
19
20 plt.xlim([-1, N])
21 plt.ylim([-4, 4])
22 plt.grid(True)
23
24
25 ax_2 = plt.subplot(2, 1, 2)
26 plt.plot(np.arange(0, N), u.T, '*-k')
27 plt.xlim([-3, (n + 2) * a])
28 plt.ylim([-1, 1])
29 plt.grid(True)
30 plt.xlabel("x_i")
31 plt.ylabel("Amplitude")
32
33 plt.pause(0.01)
34 plt.delaxes(ax_1)
35 plt.delaxes(ax_2)
36
37
38
39 #Constants
40 N = 20
41 mu = 0.05
42 c = 1
43 a = 1
44 dt = 0.2
45 m = 1
46 rad = 0.4
47 q = -0.1
48 ST = 1000
49
50
51 #Creating arrays
52 X = np.zeros((1, N))
53 U = np.zeros((N, ST))
54 X0 = np.arange(N)
55 X[0, :] = [it*a for it in range(N)]
56
57 V = np.zeros((1, N))
58
59 #fig = plt.figure()
60 #fig, axes = plt.subplots(2)
61 #camera = Camera(fig)
62
63 for st in range(ST):
64 #print(st)
65 for sp in range(0, N-1): #loop for springs
66
67 F = c*(X[0, sp+1] - X[0, sp] - 1)
68 V[0, sp] += F / m * dt - 2*mu*V[0, sp]
69 V[0, sp+1] += -F / m * dt - 2*mu*V[0, sp+1]
70
71 #Periodical Boundary cond
72 V[0, N-1] += c * (X[0, 0] + a * N - X[0, N-1] - 1) * dt / m - 2*mu*V[0, N-1] + q*math.cos((st)*2*math.pi/100)
73 V[0, 0] += -c * (X[0, 0] + a * N - X[0, N-1] - 1) * dt / m - 2*mu*V[0, 0]
74 #Positions
75 X[0, :] += V[0, :]*dt
76
77 Plotting(X, rad, X-X0)
78 #camera.snap()
79 #anim = camera.animate(blit=True)
80 #anim.save('MDS.gif')