Материал: Орещенко Николай 8391 отчет 2

Внимание! Если размещение файла нарушает Ваши авторские права, то обязательно сообщите нам

#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

Источник: https://studfile.net/preview/16676708/