#2
#x, y = Y
#def dead_zone_scalar(x, width=0.5):
#if np.abs(x) < width:
#return 0
#elif x > 0:
#return x - width
#else:
#return x + width
#dead_zone = np.vectorize(dead_zone_scalar, otypes=[np.float], excluded=['width'])
#dydt = [y, -y - np.sign(dead_zone(x, 0.2 * var + 0.2))]
#3
# m = 0.2 |
* |
var |
# масса |
||||
# |
l |
= |
5 / var |
# длинна |
маятника |
||
# |
b |
= |
0.1 |
+ |
0.015 * var |
# коэф. трения |
|
#theta, omega = Y
#3.1
#dydt = [omega, - m * 9.81 * l * np.sin(theta)]
#3.2
#dydt = [omega, -b * omega - m * 9.81 * l * np.sin(theta)]
4 |
|
|
x, y = Y |
|
|
# U = var |
# |
4.1 |
U = var / 2 |
# 4.2 |
|
# U = 2 * var |
# |
4.3 |
dydt = [y, U * (1 - x * x) * y - x] return dydt
#Функцию для получения решения ОДУ с заданными начальными условиями:
#args - параметры ОДУ (см. определение функции с ОДУ),
#y0 - начальные условия для первой переменной состояния,
#dy0 - начальные условия для второй переменной состояния
#(или в нашем случае ее производной),
#ts - длительность решения,
21
#nt - число шагов в решении (= время интегрирования * шаг времени). def calcODE(args, y0, dy0, ts = 10, nt = 101):
y0 = [y0, dy0]
t = np.linspace(0, ts, nt) sol = odeint(ode, y0, t, args) return sol
#args - параметры ОДУ (см. шаг 1),
#deltaX - шаг начальных условий по горизонтальной оси
#(переменной состояния),
#deltaDX - шаг начальных условий по вертикальной оси
#(производной переменной состояния),
#startX - начальное значение интервала начальных условий,
#stopX - конечное значение интервала начальных условий,
#startDX - начальное значение интервала начальных условий,
#stopDX - конечное значение интервала начальных условий,
#ts - длительность решения,
#nt - число шагов в решении (= время интегрирования * шаг времени). def drawPhasePortrait(args, deltaX = 1, deltaDX = 1,
startX = 0, stopX = 5, startDX = 0, stopDX = 5, ts = 10, nt = 101): for y0 in range(startX, stopX, deltaX):
for dy0 in range(startDX, stopDX, deltaDX): sol = calcODE(args, y0, dy0, ts, nt) plt.plot(sol[:, 0], sol[:, 1], 'b') plt.xlabel('x')
plt.ylabel('dx/dt')
plt.grid()
plt.show()
#Задание 1. Изучение фазовых портретов типовых особых точек b = 0
c = 0 args=(b, c)
# drawPhasePortrait(args, 1, 1, -5, 5, -4, 4, ts = 0.5, nt = 301)
#Задание 2. Построение фазовых портретов для нелинейных систем
#Задание 3. Построение фазового портрета для маятника
#Задание 4. Построение фазового портрета осциллятора Ван дер Поля.
#Задание 5. Построение фазового портрета аттрактора Лоренца (3 порядок) drawPhasePortrait(args, 1, 1, -5, 5, -4, 4, ts = 20, nt = 301)
22
#################################################################
#main2
import numpy as np
from scipy.integrate import odeint import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
# реализуем функцию ОДУ
def ode(y, t, sigma, r, b): x,y,z = y
dxdt = sigma * (y-x) dydt = x * (r - z) - y dzdt = x*y - b*z
return [dxdt, dydt, dzdt]
#реализуем функцию, реализующую запуск вычисления ОДУ def calcODE(args, x, y, z, ts = 10, nt = 101):
y0 = [x, y, z]
t = np.linspace(0, ts, nt) sol = odeint(ode, y0, t, args) return sol
#реализуем функцию, реализующую расчет и рендер 3D фазового #портрета и его проекций
def drawPhasePortrait3D(args, deltaX=1, deltaY=1, deltaZ=1, startX=0, stopX=5,
startY=0, stopY=5, startZ=0, stopZ=5, ts=10, nt=101): fig = plt.figure()
ax = fig.add_subplot(2, 2, 1, projection='3d') ax.set_title("3D")
plt.subplot(2, 2, 2) plt.title("X-Y") plt.grid() plt.subplot(2, 2, 3) plt.title("X-Z") plt.grid() plt.subplot(2, 2, 4) plt.title("Y-Z") plt.grid()
23
for x in range(startX, stopX, deltaX): for y in range(startY, stopY, deltaY): for z in range(startZ, stopZ, deltaZ): sol = calcODE(args, x, y, z, ts, nt)
ax.plot(sol[:, 0], sol[:, 1], sol[:, 2]) plt.subplot(2, 2, 2)
plt.plot(sol[:, 0], sol[:, 1]) plt.subplot(2, 2, 3) plt.plot(sol[:, 0], sol[:, 2]) plt.subplot(2, 2, 4) plt.plot(sol[:, 1], sol[:, 2])
plt.show()
sigma = 10 r = 10
b = 8 / 3
args = (sigma, r, b) drawPhasePortrait3D(args, deltaX=4, deltaY=4,
deltaZ=4, startX=-10, stopX=10, startY=-10, stopY=10, startZ=-10, stopZ=10, ts=10, nt=1001)
24
ПРОТОКОЛ
В протоколе приводятся результаты измерений, полученные в ходе выполнения экспериментальной части лабораторной работы. Объем данных, заносимых в протокол, определяется соответствующими методиче- скими указаниями и преподавателем. Недопустимо заполнение протокола карандашом. На протоколе должна быть подпись студента, выполнившего лабораторную работу (в случае, если работа выполнялась в составе бригады всех членов бригады) и дата выполнения работы. По завершении выполнения лабораторной работы протокол подписывается преподавателем.
25