-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathsolution1.py
More file actions
40 lines (32 loc) · 1.25 KB
/
solution1.py
File metadata and controls
40 lines (32 loc) · 1.25 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
from numpy import sin, cos, linspace
from scipy.integrate import solve_ivp
from scipy.interpolate import interp1d
# Константы
RELATIVE_TOLERANCE = 1e-10
ABSOLUTE_TOLERANCE = 1e-13
def solve(start_angle, b, g, l, m, T):
"""
Решает заданную систему дифференциальных уравнений.
"""
def dSdt(t, S):
"""
Функция, представляющая систему дифференциальных уравнений.
"""
x1, x2 = S # x1 представляет положение, x2 представляет скорость
return [x2, - (g / l) * sin(x1) - (b / (m * l)) * x2]
S0 = (start_angle, 0) # начальные условия: положение 'a', скорость 0
t = linspace(0, T, T * 1000 + 1)
sol = solve_ivp(
dSdt,
t_span=(0, max(t)),
y0=S0,
t_eval=t,
method="DOP853",
rtol=RELATIVE_TOLERANCE,
atol=ABSOLUTE_TOLERANCE,
)
time_range = tuple(sol.t)
return (
interp1d(time_range, sol.y[0], kind="linear"), # Интерполяция положения
interp1d(time_range, sol.y[1], kind="linear"), # Интерполяция скорости
)