Построение фазового портрета
Здравствуйте, мне надо построить фазовый портрет при постоянной энергии равной 0,5. На интервале t от 0,5 до 1 рисует спокойно, но при небольшом увеличении интервала появляется ошибка «ODEintWarning: Excess work done on this call (perhaps wrong Dfun type). Run with full_output = 1 to get quantitative information. warnings.warn(warning_msg, ODEintWarning)» . Из-за чего это может быть?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
#E=0.5 t2=linspace(-1,1,1000) m=1 k=4 beta=1 x0=-sqrt(8) def v0(x0,E0,k,m,beta): v1=np.sqrt((2*(E0-k*x0**2/2+beta*x0**4/4))/m) return v1 def f(y,t): x,v = y return [v, (-k*x+(beta*x**3))/m] result3 = odeint(f,[x0,v0(x0,0.5,k,m,beta)],t2) x3 = result3[:,0] v3 = result3[:,1] plot(x3,v3) xlabel('x') ylabel('v') xlim(-4,4) ylim(-7,7) grid()
Лучшие ответы ( 1 )
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
Ответы с готовыми решениями:
Построение фазового портрета
Доброго времени суток! Мне нужно построить фазовый портрет такого дифференциального уравнения в.
Построение фазового портрета
Необходимо построить фазовый портрет на графике траектории рисуются с множеством кружочков, как их.
Построение фазового портрета
Здравствуйте, уважаемые форумчане. Столкнулась со следующей проблемой: преподаватель задал.
Построение фазового портрета
Всем здравствуйте! Не получается построить фазовый портрет генератора Рулькова. Думаю, проблема с.
Построение фазового портрета
Подскажите пожалуйста как правильно записать команду phaseportrait в моем случае? (для 3 пункта).
4751 / 2643 / 547
Регистрация: 07.11.2019
Сообщений: 4,359

Сообщение было отмечено iSmokeJC как решение
Решение
1. код нерабочий, нет импортов. Если хотите чтобы вам помогали, делитесь таким кодом, который можно просто скопировать и запустить. Хорошо бы привести само описание задачи.
2. Проблема в том что вы не думая о физической основе задачи просто задали в качестве коэффициентов какие-то цифры.
Вот вы фиксируете полную энергию, при этом x0 и k у вас тоже жестко заданы. Ну не может быть энергия такой маленькой, если у вас пружина с большой жесткостью так сжата. Если k (жесткость пружины) стремиться вернуть тело в положение равновесия, то бета — наоборот, вносит в систему элемент неустойчивости.
Вывод: сделать E0 большим (или уменьшить k), бету сделать совсем близкой к нулю.
3. Зачем v0 в виде функции, если она считается только один раз?
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
import numpy as np import matplotlib.pyplot as plt from scipy.integrate import odeint E0=100.5 t2=np.linspace(-1,1,1000) m=1 k=4 beta=0.00003 x0=-np.sqrt(8) v0=np.sqrt((2*(E0-k*x0**2/2+beta*x0**4/4))/m) def f(y,t): x,v = y return [v, (-k*x+(beta*x**3))/m] result3 = odeint(f,[x0,v0],t2) x3 = result3[:,0] v3 = result3[:,1] plt.plot(x3,v3) plt.xlabel('x') plt.ylabel('v') #plt.xlim(-4,4) #plt.ylim(-7,7) plt.grid()
советы
Не знаю, соберусь ли это дело систематизировать, пока буду просто добавлять в этот пост короткие «рецепты» по применению Python в околонаучных целях (создание отчётов, построение графиков и тому подобное). Поживём-увидим.
Преобразование числа из экспоненциальной формы (например, –1.2e+003) в формулу LaTeX (например, -1.2 10³). Регулярное выражение:
>>> import re
>>> re.sub('([\d.+-]+)[Ee]\+?([-]?)0*([\d]+)', '\\1 \\cdot 10^ ','-1.2e+003')
'-1.2 \\cdot 10^ '
Прозрачные/полупрозрачные легенды (подписи) в графиках pylab :
l=legend()
l.get_frame().set_alpha(0.2)
Формулы LaTeX в подписях и надписях в pylab : просто заключить нужный фрагмент надписи в $…$ , например ‘$\rho$’ .
Открытый вопрос — как делать русские подписи в pylab ? Дополнение: вопрос решился сам. См. заметку Русские буквы в matplotlib/pylab.
Произвольная надпись, выровненная по центру — (xlim()[0]+xlim()[1])*0.5 , ha=»center» — нижнего края — lim()[0] , va=»bottom» ) — графика в pylab :
text((xlim()[0]+xlim()[1])*0.5,ylim()[0],"your message",ha="center",va="bottom",fontsize=10)
Дана пара массивов (списков) t и x с временем измерения и измеренной величиной, отобрать только те пары время-значение, которые попадают в заданный временной интервал [t0, t1] (или какому другому условию):
xt=[ pair for pair in zip(x,t) if t0Из полученных пар выделить опять отдельные массивы t и x :
t=[pair[0] for pair in tx]
x=[pair[1] for pair in tx]или с использованием array из scipy :
t,x=array(tx)[:,0],array(tx)[:,1]Кусочно-линейная интерполяция зависимости t → x на другом наборе точек t2 (тоже список, как и t ):
from scipy import interp
interp(t2,t,x)Транспонирование двумерного массива — проще всего array([[1,2,],[3,4]]).transpose() .
Линейная регрессия (аналогично — фиттирование более сложных функций, модифицировать количество параметров и вычисление ошибки в residual() ). Как и прежде, предполагаю, что точки для фиттирования заданы в массивах t и x :
from scipy import array
from scipy.optimize import leastsq
def residual(params,t,x):
a,b=params
x_ab=array([a*x=t_i+b for t_i in t])
return x_ab-x
[a,b],ier=leastsq(residual,(1,1),args=(t,x))Интегрирование системы обыкновенных дифференциальных уравнений (ОДУ):
from scipy import linspace, array
from scipy.integrate import odeint
def dotu(u,t0):
"расчёт производных в момент времени t0"
x,y,z=u # вектор переменных
sigma,rho,beta=10,28,8.0/3 # параметры модели
dotx=sigma*(y-x)
doty=x*(rho-z)-y
dotz=x*y-beta*z
return [dotx,doty,dotz]
t=linspace(0,50,1e4) # точки интегрирования
u0=[-5,-5,1] # начальное условие
u=odeint(dotu,u0,t) # решениеЧтобы построить график полученного решения (2D), транспонируем u и строим как обычно:
from pylab import plot, show
u=array(u).transpose()
plot(u[1],u[2]) # строим фазовый портрет y-z
show()КОМПЬЮТЕРНОЕ МОДЕЛИРОВАНИЕ ЭЛЕМЕНТОВ ДИНАМИЧЕСКИХ СИСТЕМ В PYTHON Текст научной статьи по специальности «Компьютерные и информационные науки»
Аннотация научной статьи по компьютерным и информационным наукам, автор научной работы — Алферова Тамара Викторовна, Трохова Татьяна Анатольевна
ЦЕЛЬ. Исследование возможности применения системы программирования Python при анализе процессов в линейных и нелинейных динамических системах. При создании и исследовании компьютерных моделей часто приходится решать задачу выбора инструментария моделирования. МЕТОДЫ. При решении поставленных задач использовался метод катастроф, учитывающий скачкообразные изменения, возникающие в виде внезапного ответа системы на плавное изменение внешних условий. РЕЗУЛЬТАТЫ В работе представлены результаты апробации системы программирования Python в качестве основы для разработки компьютерных моделей линейных и нелинейных динамических систем. Дана краткая характеристика библиотек и модулей Python, применяемых при разработке систем, описанных дифференциальными уравнениями и передаточными функциями. Дан теоретический обзор возникновения хаотических процессов в нелинейных динамических системах , продемонстрирован механизм перехода к хаосу на примере построения модели, основанной на уравнении Ферхюльста. Реализована математическая модель уравнений Лоренца, которая описывает многообразие хаотических изменений нелинейной динамической системы, построены фазовые портреты выходных параметров модели в виде трехмерных графиков. Сделан вывод о том, что система программирования Python может быть использована в качестве инструментария при разработке компьютерных моделей линейных и нелинейных динамических систем. Апробация данного подхода проводилась при разработке моделей динамических систем в курсе математического моделирования сложных систем.
i Надоели баннеры? Вы всегда можете отключить рекламу.
Похожие темы научных работ по компьютерным и информационным наукам , автор научной работы — Алферова Тамара Викторовна, Трохова Татьяна Анатольевна
Динамические режимы и нелинейные явления в модифицированной автогенераторной системе с частотно-фазовым управлением
Стабилизация состояний равновесия базовых нелинейных моделей с хаотической динамикой
Исследование апериодического режима в новой гибридной модели динамики биологической популяции
Идентификация и моделирование хаотических режимов в электроэнергетических системах
Разработка индуктивного датчика на основе хаотического осциллятора
i Не можете найти то, что вам нужно? Попробуйте сервис подбора литературы.
i Надоели баннеры? Вы всегда можете отключить рекламу.COMPUTER SIMULATION OF DYNAMIC SYSTEMS ELEMENTS IN PYTHON
OBJECTIVE. Investigation of the possibilities of using the Python programming system in the analysis of processes in linear and nonlinear dynamic systems. t is often necessary to solve the problem of choosing modeling tools when creating and researching computer models METHOD The catastrophe method which takes into account abrupt changes arising in the form of a sudden response of the system to a smooth change in external conditions have been used in solving the set tasks. RESULTS The paper presents the results of testing the Python programming system as a basis for the development of computer models of linear and nonlinear dynamic systems. A brief description of the Python libraries and modules used in the development of systems described by differential equations and transfer functions is given. A theoretical review of the occurrence of chaotic processes in nonlinear dynamical systems is given, the mechanism of transition to chaos is demonstrated on the example of constructing a model based on the Verhulst equation. A mathematical model of the Lorentz equations is implemented, which describes the variety of chaotic changes in a nonlinear dynamic system, phase portraits of the model's output parameters are built in the form of three-dimensional graphs. It is concluded that the Python programming system can be used as a toolkit in the development of computer models of linear and nonlinear dynamic systems. The approbation of this approach have been carried out in the development of models of dynamic systems in the course of mathematical modeling of complex systems.
Текст научной работы на тему «КОМПЬЮТЕРНОЕ МОДЕЛИРОВАНИЕ ЭЛЕМЕНТОВ ДИНАМИЧЕСКИХ СИСТЕМ В PYTHON»
ФИЗИЧЕСКОЕ, МАТЕМАТИЧЕСКОЕ, КОМПЬЮТЕРНОЕ И
КОМПЬЮТЕРНОЕ МОДЕЛИРОВАНИЕ ЭЛЕМЕНТОВ ДИНАМИЧЕСКИХ
СИСТЕМ В PYTHON
Т.В. Алферова, Т.А. Трохова Гомельский государственный технический университет имени П.О. Сухого
Аннотация. ЦЕЛЬ. Исследование возможности применения системы программирования Python при анализе процессов в линейных и нелинейных динамических системах. При создании и исследовании компьютерных моделей часто приходится решать задачу выбора инструментария моделирования. МЕТОДЫ. При решении поставленных задач использовался метод катастроф, учитывающий скачкообразные изменения, возникающие в виде внезапного ответа системы на плавное изменение внешних условий. РЕЗУЛЬТАТЫ В работе представлены результаты апробации системы программирования Python в качестве основы для разработки компьютерных моделей линейных и нелинейных динамических систем. Дана краткая характеристика библиотек и модулей Python, применяемых при разработке систем, описанных дифференциальными уравнениями и передаточными функциями. Дан теоретический обзор возникновения хаотических процессов в нелинейных динамических системах, продемонстрирован механизм перехода к хаосу на примере построения модели, основанной на уравнении Ферхюльста. Реализована математическая модель уравнений Лоренца, которая описывает многообразие хаотических изменений нелинейной динамической системы, построены фазовые портреты выходных параметров модели в виде трехмерных графиков. Сделан вывод о том, что система программирования Python может быть использована в качестве инструментария при разработке компьютерных моделей линейных и нелинейных динамических систем. Апробация данного подхода проводилась при разработке моделей динамических систем в курсе математического моделирования сложных систем.
Ключевые слова: динамические модели, компьютерное моделирование, нелинейные динамические системы, инструментарий компьютерного моделирования, система программирования Python.
Введение. При компьютерном моделировании технических устройств и процессов особое внимание уделяется исследованию и анализу динамических систем, одной из актуальных задач при этом является задача выбора инструментария моделирования. Развитые системы компьютерной математики, такие как Matlab, Mathcad, Maple обладают обширным набором функций для построения и исследования как линейных, так и нелинейных динамических систем, однако, это лицензионные, дорогостоящие системы, поэтому необходимо искать компромиссные решения при выборе инструментария. Авторами проведена апробация применения системы программирования Python в качестве инструментария моделирования динамических систем. Python - бесплатная, удобная и простая в освоении система программирования, в которой можно не только создать и
исследовать модели динамических систем, но и разработать удобный для анализа пользовательский интерфейс, позволяющий экспериментировать с моделью. Апробация инструментария проводилась при разработке моделей динамических систем в курсе математического моделирования сложных систем. В настоящее время одним из перспективных направлений расширения данного курса является моделирование нелинейных динамических систем. Анализ таких моделей неразрывно связан с исследованием хаотических процессов в динамических системах и получением в результате набора точек бифуркации.
Цель работы - исследовать возможность применения системы программирования Python при анализе процессов в линейных и нелинейных динамических системах.
Материалы и методы. Язык Python применяется для программирования задач из широкого диапазона предметных областей, подходит для различных платформ (iOS, Android), применяется в серверной разработке [1]. Для исследования динамических моделей Python содержит ряд библиотек и модулей, основными из которых являются следующие:
numpy - позволяет работать с массивами, случайными величинами, полиномами, выполнять быстрое преобразование Фурье и т.д.;
matplotlib - содержит как функции, так и модули, позволяющие строить графики, редактировать их, выполнять сервисные функции для работы с графическими данными;
scipy - библиотека предназначена для выполнения научных и инженерных расчетов и содержит модули и функции для оптимизации; интегрирования; обработки сигналов; решения обыкновенных дифференциальных уравнений и т.д.;
sympy - библиотека, предназначенная для выполнения вычислений в аналитическом виде, когда результат исследований сначала получается в виде формулы, а затем, при необходимости, приводится к числовому виду.
control.matlab - модуль предназначен для исследования динамических систем методами теории автоматического управления. В модуле реализованы: полный набор средств для анализа одномерных и многомерных стационарных систем; временные характеристики: передаточная и переходная функции, реакция на произвольные входные воздействия; частотные характеристики и т.д.
При исследовании динамических моделей, заданных обыкновенными дифференциальными уравнениями (ОДУ) или системами ОДУ качественные результаты дает применение таких функций модуля scipy.integrate Python, как ode() и odeint(). Например, выходные параметры модели механической динамической системы, описанной ОДУ второго порядка, можно получить с помощью следующей программы (рисунок 1).
Библиотека символьных вычислений sympy позволяет не только получать решение ОДУ в аналитическом виде при исследовании параметров динамических систем, но и выполнять структурный синтез моделей. Например, в работе [2] рассмотрен синтез системы управления методами символьной регрессии с применением функций библиотеки sympy.
Если динамическая модель линейной стационарной системы представлена в виде передаточной функции, то для ее исследования применяются следующие функции модуля control.matlab.
W = tf (nom, den) - позволяет создать объект в виде передаточной функции, nom и den - массивы коэффициентов полиномов числителя и знаменателя передаточной функции, расположенных в порядке убывания степеней.
y, t = step(lti-объект) - получает массивы значений переходной характеристики динамической системы.
A,PH,W= Ьоёе(Ш-объект) - предназначена для получения диаграммы Боде - графиков логарифмических амплитудно-частотной и фазо-частотной характеристик (АЧХ и ФЧХ).
ро1е(Ш-объект) - позволяет получить массив корней характеристического уравнения, которые можно использовать для вычисления полюсов модели при анализе ее на устойчивость. # Описание системы ОДУ def dempf(y,t):
return [y[1], -2*n*y[1]-p**2*y[0]] t = np.linspace(0, 1.5, 500) y0=[0.05,0] #Задание начальных условий
#Решение дифференциального уравнения Y= odeint(dempf, y0, t)
#Графики функций перемещения и скорости plt.figure(1) ; plt.plot(t,Y[:,0]); plt.grid() plt.figure (2) ; plt.plot(t,Y[:,1]); plt.grid() plt.show()
Рисунок 1 - Фрагмент программы и результат моделирования с использованием
На рисунке 2 приведен пример построение диаграммы Боде в Python.
from control.matlab import *
import matplotlib.pyplot as plt
mag, phase, omega = bode(w)
Рисунок 2 - Фрагмент программы и результат построения диаграммы Боде с использованием библиотеки control
Результаты и обсуждение. Катастрофами называются скачкообразные изменения, возникающие в виде внезапного ответа системы на плавное изменение внешних условий [3]. При катастрофе под действием управляющих параметров изменяется стационарное состояние системы, т.е. она переходит из одного стационарного состояния в другое. Как проходит переходный процесс - для теории катастроф, в сущности, неважно. Скачкообразное изменение качественного поведения системы при плавном изменении параметра называется бифуркацией [4]. При достижении системой точки бифуркации достаточно сложно предсказать дальнейший путь развития системы, даже слабые воздействия извне могут
привести к резкому изменению не только выходных параметров, но и к качественному изменению внутренних элементов системы.
Обзор бифуркаций динамических систем. Построение фазового портрета динамической системы является одним из удобных инструментов исследования колебательных процессов. Качественное преобразование фазового портрета (бифуркация) происходит при определенных условиях, в зависимости от которых определяется тип бифуркации - седло-узловая; бифуркация Андронова-Хопфа; бифуркация предельного цикла и другие [5]. На тесную связь между теорией катастроф и теорией бифуркаций указывал в своей работе [6] Р. Гилмор. При изучении теории катастроф проще всего иметь компьютерный аппарат исследования простых бифуркаций типа «складка», «камертон», «сборка» и после выявления того, какой из видов бифуркации присущ данной нелинейной системе, можно получать по заданным алгоритмам основные параметры устойчивости системы: область устойчивости, точки устойчивого состояния моделей [4, 7, 8, 9].
Компьютерное моделирование элементов нелинейных динамических систем. При исследовании динамических систем одним из интересных аспектов является анализ изменения поведения системы и возникновения хаоса. Хаотическое поведение означает:
- неустойчивость фазовых траекторий;
- рост малого начального возмущения;
- непредсказуемость поведения системы на больших временах.
Пример возникновения хаоса в нелинейных динамических системах может быть приведен на основе демонстрации влияния коэффициента к на результаты построения модели, основанной на уравнении Ферхюльста [10]. Этот механизм перехода к хаосу был открыт Митчеллом Фейгенбаумом, американским физиком и математиком, одним из пионеров теории хаоса.
Пусть модель динамической системы описывается уравнением вида:
xn = к • xn-1 ■ (1 - xn-1) (1)
- Были выявлены следующие особенности поведения модели при различных значениях к:
- при значениях к, больших 3.54 процесс колебаний носит непредсказуемый характер, наступает хаос.
Рассмотренный пример позволяет сделать заключение о том, что поведение несложных динамических моделей может непредсказуемо изменяться в зависимости от изменения внутренних параметров модели. Графическая иллюстрация возникновения хаотического поведения динамической системы при различных значениях внутреннего параметра приведена на рисунке 3.
■ м a*J ■■■ * + + + р. ^ г. **i iTi л + + Г,
Рисунок 3 - Влияние параметра k на поведение динамической модели (к=2, к=2.7,
Другим примером возникновения хаотического поведения является поведение динамической системы из трех нелинейных уравнений - математическая модель уравнений Лоренца, которая описывает многообразие хаотических изменений:
y2' = -y2 + (r- y3)y1 (2)
Система дифференциальных уравнений решается в Python в численном виде с использованием функции odeint модуля integrate библиотеки scipy, после проведения исследований по модели результирующие фазовые портреты выводятся в виде трехмерных графиков. К хаотическим изменениям приводит не только изменение параметра r, как указано в работе [11], но и незначительное изменение начальных условий выходных параметров модели. На рисунке 4 приводятся фазовые портреты динамической системы при изменении начальных условий для y2, y3. Если исходные начальные условия имели вид массива y = [1, -1, 10] (рисунок 4,а), то после изменения начального условия для y2 на 0.0001 (y = [1, -0.9999, 10]), фазовый портрет имеет вид, приведенный на рисунке 4, б). После изменения начального значения y3 на 0.001 (y0 = [1, -1, 10.001]) фазовый портрет имеет вид, приведенный на рисунке 4, в).
Рисунок 4 - Изменение фазового портрета модели Лоренца при изменении начальных
Исследуем бифуркационные процессы, появляющиеся при изменении внутреннего параметра в нелинейной динамической системе, описанной логистическим уравнением (1). Если внутренний параметр к будет плавно изменяться от начального значения с определенным шагом, и будет выполнено п отображений логистической функции, то можно получить бифуркационную диаграмму заданной функции. Например, если параметр к изменять от начального значения, равного 0.01 с шагом 0.01, то бифуркационная диаграмма будет выглядеть так, как приведено на рисунке 5, а). На рисунке 5,б) приведена диаграмма, построенная с шагом 0.1.
Рисунок 5 - Бифуркационная диаграмма нелинейной динамической модели
Выводы. Проведена апробация применения системы программирования Python в качестве инструментария моделирования динамических систем. Показана возможность использования библиотек Python при моделировании линейных динамических систем как в виде ОДУ, так и в виде передаточных функций. Применение компьютерного моделирования с использованием Python позволило продемонстрировать и исследовать хаотические свойства простых нелинейных систем. Совмещение изучения элементов теории катастроф с компьютерной реализацией моделей нелинейных систем, позволяет повысить наглядность полученных результатов.
Список использованных источников
1. Сысоева, М.В. Программирование для «нормальных» с нуля на языке Python: Учебник. В двух частях. Часть1./ Сысоева М.В., Сысоев И.В. - М.:БазальтСПО; МАКСПресс, 2018.
2. Дивеев А.И., Доценко А.В. Библиотека Python для синтеза интеллектуальных систем управления // Вестник Российского университета дружбы народов. Серия: Инженерные исследования. 2018. Т. 19. № 2.
3. Бекман, И.Н. Катастрофы. Курс лекций. [Электронный ресурс] / И.Н. Бекман. -Режим доступа http://beckuniver.ucoz.ru/Katastrofy/Katastrofy.htm.
4. Бушуев, А.Б. Математическое моделирование процессов технического творчества. / А.Б. Бушуев- СПб: СПбГУ ИТМО, 2010.
5. Антипов, О.И. Бифуркации, катастрофы, синергетика, фракталы и нейронные сети в физических, биологических и экономических системах./ Антипов О.И., Неганов В.А. -Самара: ПГУТИ, 2013.
6. Гилмор, Р. Прикладная теория катастроф. / Р. Гилмор - М.: Мир, 1984.
7. Цветков, В.И. Теория катастроф и фрактальная модель кризисных социально-экономических процессов. / И.В. Цветков // Вестник ТвГУ. Серия: «Прикладная математика». - 2010.
8. Kapanski, A., Hruntovich, N., Bakhur, S., Markaryants, L., & Dolomanyak, L. (2020). Optimize the cost of paying for electricity in the water supply system by using accumulating tanks. In E3S Web of Conferences (Vol. 178, p. 01065). EDP Sciences.
9. Hruntovich, N. V., Kapanski, A. A., Baczynski, D., Vagapov, G. V., & Fedorov, O. V. (2019). Optimization of a variable frequency drive pump working on a water tower. In E3S Web of Conferences (Vol. 124, p. 05060). EDP Sciences.
10. Соколов, С.В. Модели динамики популяций: учеб. пособие/ С.В. Соколов. -СПб:СПбГЭТУ «ЛЭТИ», 2018.
11. Хазова, Ю. А. Элементы теории бифуркаций. Часть 2. Теория хаоса: учебно-методическое пособие / Ю. А. Хазова - ФГАОУ ВО «Крымский федеральный университет имени В. И. Вернадского». — Симферополь, 2019.
Алферова Тамара Викторовна, кандидат технических наук, доцент, alferowa.tam@yandex.ru, Республика Беларусь, Гомель, Гомельский технический университет имени П. О. Сухого, Сухого Татьяна Анатольевна Трохова, кандидат технических наук, доцент, trohova77@rambler.ru Республика Беларусь, Гомель, Гомельский технический университет
имени П.О. Сухого
COMPUTER SIMULATION OF DYNAMIC SYSTEMS ELEMENTS IN PYTHON
Alferova T.B., Trohova T.A. Annotation. OBJECTIVE. Investigation of the possibilities of using the Python programming system in the analysis of processes in linear and nonlinear dynamic systems.
t is often necessary to solve the problem of choosing modeling tools when creating and researching computer models METHOD The catastrophe method which takes into account abrupt changes arising in the form of a sudden response of the system to a smooth change in external conditions have been used in solving the set tasks. RESULTS The paper presents the results of testing the Python programming system as a basis for the development of computer models of linear and nonlinear dynamic systems. A brief description of the Python libraries and modules used in the development of systems described by differential equations and transfer functions is given. A theoretical review of the occurrence of chaotic processes in nonlinear dynamical systems is given, the mechanism of transition to chaos is demonstrated on the example of constructing a model based on the Verhulst equation. A mathematical model of the Lorentz equations is implemented, which describes the variety of chaotic changes in a nonlinear dynamic system, phase portraits of the model's output parameters are built in the form of three-dimensional graphs. It is concluded that the Python programming system can be used as a toolkit in the development of computer models of linear and nonlinear dynamic systems. The approbation of this approach have been carried out in the development of models of dynamic systems in the course of mathematical modeling of complex systems.
Keywords: dynamic models, computer modeling, nonlinear dynamic systems, computer modeling tools, Python programming system.
Alferova T.V. Ph.D., Associate Professor, alferowa.tam@yandex.ru, Republic of Belarus,
Gomel, Gomel Sukhoi State Technical University Trohova T.A. Ph.D., Associate Professor, trohova77@rambler.ru, Republic of Belarus, Gomel, Gomel Sukhoi State Technical University
Digiratory
Лаборатория автоматизации и цифровой обработки сигналов
Построение фазовых портретов на языке Python
Фазовая траектория — след от движения изображающей точки. Фазовый портрет — это полная совокупность различных фазовых траекторий. Он хорошо иллюстрирует поведение системы и основные ее свойства, такие как точки равновесия.
С помощью фазовых портретов можно синтезировать регуляторы (Метод фазовой плоскости) или проводить анализ положений устойчивости и характера движений системы.
Рассмотрим построение фазовых портретов нелинейных динамических систем, представленных в форме обыкновенных дифференциальных уравнений
В качестве примера воспользуемся моделью маятника с вязким трением:
Где \(\omega \) — скорость, \(\theta \) — угол отклонения, \(b \) — коэффициент вязкого трения, \(с \) — коэффициент, учитывающий массу, длину и силу тяжести.
Для работы будем использовать библиотеки numpy, scipy и matplotlib для языка Python.
Блок импорта выглядит следующим образом:
import numpy as np from scipy.integrate import odeint import matplotlib.pyplot as pltШаг 1. Реализация ОДУ в Python
Определим функцию, отвечающую за расчет ОДУ. Например, следующего вида:
def ode(y, t, b, c): theta, omega = y dydt = [omega, -b*omega - c*np.sin(theta)] return dydtАргументами функции являются:
- y — вектор переменных состояния
- t — время
- b, c — параметры ДУ (может быть любое количество)
Функция возвращает вектор производных.
Шаг 2. Численное решение ОДУ
Далее необходимо реализовать функцию для получения решения ОДУ с заданными начальными условиями:
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)
- y0— Начальные условия для первой переменной состояния
- dy0 — Начальные условия для второй переменной состояния (или в нашем случае ее производной)
- ts — длительность решения
- nt — Количество шагов в решении (= время интегрирования * шаг времени)
В 3-й строке формируется вектор временных отсчетов. В 4-й строке вызывается функция решения ОДУ.
Шаг 3. Генерация и вывод фазового портрета
Для построения фазового портрета необходимо произвести решения ОДУ с различными начальными условиями (вокруг интересующей точки). Для реализации также напишем функцию.
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[:, 1], sol[:, 0], 'b') plt.xlabel('x') plt.ylabel('dx/dt') plt.grid() plt.show()
Аргументами функции являются:
- args — Параметры ОДУ (см. шаг 1)
- deltaX — Шаг начальных условий по горизонтальной оси (переменной состояния)
- deltaDX — Шаг начальных условий по вертикальной оси (производной переменной состояния)
- startX — Начальное значение интервала начальных условий
- stopX — Конечное значение интервала начальных условий
- startDX — Начальное значение интервала начальных условий
- stopDX — Конечное значение интервала начальных условий
- ts — длительность решения
- nt — Количество шагов в решении (= время интегрирования * шаг времени)
Во вложенных циклах (строки 3-4) происходит перебор начальных условий дифференциального уравнения. В теле этих циклов (строки 5-6) происходит вызов функции решения ОДУ с заданными НУ и вывод фазовая траектории полученного решения.
Далее производятся нехитрые действия:
- Строка 7 — задается название оси X
- Строка 9 — задается название оси Y
- Строка 10 — выводится сетка на графике
- Строка 11 — вывод графика (рендер)
Шаг 4. Запуск построения
Запустить построение можно следующим образом:
b = 0.25 c = 5.0 args=(b, c) drawPhasePortrait(args) drawPhasePortrait(args, 1, 1, -10, 10, -5, 5, ts = 30, nt = 301)
Строка 1-2 — задание значений параметрам ОДУ
Строка 3 — формирование вектора параметров
Строка 4 — вызов функции генерации фазового портрета с параметрами «по умолчанию»
Строка 5 — вызов функции генерации фазового портрета с настроенными параметрами
Итог
При запуске программы получаем следующий результат:


Полный текст программы под лицензией MIT (Использование при условии ссылки на источник):
# -*- coding: utf-8 -*- """ This function create a phase portrait of ode Created on Mon Jan 23 18:51:01 2017 Copyright 2017 Sinitsa AM site: digiratory.ru Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. @author: Sinitsa AM digiratory.ru """ import numpy as np from scipy.integrate import odeint import matplotlib.pyplot as plt ''' In this function you should implement your ode for example: d*theta/dt = omega d*omega/dt = -b*omega - c*np.sin(theta) @args: y - state variable t - time b, c - args of ode ''' def ode(y, t, b, c): theta, omega = y dydt = [omega, -b*omega - c*np.sin(theta)] return dydt ''' Calculate ode @args: args - arguments of ODE y0 - The initial state of y yd0 - The initial state of derivative y ts - the duration of the simulation nt - Number steps if simulation (=ts*deltat) ''' 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 ''' Drawing Phase portrait of ODE in function ode() @args: args - arguments of ODE deltaX - step x deltaDX - step derivative x startX - start value of x stopX - stop value of x startDX - start value of derivative x stopDX - stop value of derivative x ts - the duration of the simulation nt - Number steps if simulation (=ts*deltat) ''' 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() b = 0.25 c = 5.0 args=(b, c) drawPhasePortrait(args) drawPhasePortrait(args, 1, 1, -10, 10, -5, 5, ts = 30, nt = 301)
Синица А.М.: Построение фазовых портретов на языке Python [Электронный ресурс] // Digiratory. 2017 г. URL: https://digiratory.ru/?p=435 (дата обращения: ДД.ММ.ГГГГ).
Построение фазовых портретов на языке Python : 2 комментария
- Уведомление: Устойчивость нелинейных систем — Digiratory
- Уведомление: Оценка параметров ДУ в Python — Digiratory

