Построение фазовых портретов на языке Python

Фазовая траектория — след от движения изображающей точки. Фазовый портрет — это полная совокупность различных фазовых траекторий. Он хорошо иллюстрирует поведение системы и основные ее свойства, такие как точки равновесия.

С помощью фазовых портретов можно синтезировать регуляторы (Метод фазовой плоскости) или проводить анализ положений устойчивости и характера движений системы.

Рассмотрим построение фазовых портретов нелинейных динамических систем, представленных в форме обыкновенных дифференциальных уравнений

В качестве примера воспользуемся моделью маятника с вязким трением:

\( {d \theta \over dt } = \omega \\ {d \omega \over dt } = -b * \omega — c* \sin(\theta)  \)

Где \(\omega \) — скорость, \(\theta \) — угол отклонения,  \(b \) — коэффициент вязкого трения, \(с \) — коэффициент, учитывающий массу, длину и силу тяжести.

Для работы будем использовать библиотеки numpy, scipy и matplotlib для языка Python.

Блок импорта выглядит следующим образом:

Шаг 1. Реализация ОДУ в Python

Определим функцию, отвечающую за расчет ОДУ. Например, следующего вида:

Аргументами функции являются:

  • y — вектор переменных состояния
  • t — время
  • b, c — параметры ДУ (может быть любое количество)

Функция возвращает вектор производных.

Шаг 2. Численное решение ОДУ

Далее необходимо реализовать функцию для получения решения ОДУ с заданными начальными условиями:

Аргументами функции являются:

  • args — Параметры ОДУ (см. шаг 1)
  • y0— Начальные условия для первой переменной состояния
  • dy0 — Начальные условия для второй переменной состояния (или в нашем случае ее производной)
  • ts — длительность решения
  • nt — Количество шагов в решении (= время интегрирования * шаг времени)

В 3-й строке формируется вектор временных отсчетов. В 4-й строке вызывается функция решения ОДУ.

Шаг 3. Генерация и вывод фазового портрета

Для построения фазового портрета необходимо произвести решения ОДУ с различными начальными условиями (вокруг интересующей точки). Для реализации также напишем функцию.

Аргументами функции являются:

  • args — Параметры ОДУ (см. шаг 1)
  • deltaX — Шаг начальных условий по горизонтальной оси (переменной состояния)
  • deltaDX — Шаг начальных условий по вертикальной оси (производной переменной состояния)
  • startX — Начальное значение интервала начальных условий
  • stopX — Конечное значение интервала начальных условий
  • startDX — Начальное значение интервала начальных условий
  • stopDX — Конечное значение интервала начальных условий
  • ts — длительность решения
  • nt — Количество шагов в решении (= время интегрирования * шаг времени)

Во вложенных циклах (строки 3-4) происходит перебор начальных условий дифференциального уравнения. В теле этих циклов (строки 5-6) происходит вызов функции решения ОДУ с заданными НУ и вывод фазовая траектории полученного решения.

Далее производятся нехитрые действия:

  • Строка 7 — задается название оси X
  • Строка 9 — задается название оси Y
  • Строка 10 — выводится сетка на графике
  • Строка 11 — вывод графика (рендер)

Шаг 4. Запуск построения

Запустить построение можно следующим образом:

Подробнее:

Строка 1-2 — задание значений параметрам ОДУ

Строка 3 — формирование вектора параметров

Строка 4 — вызов функции генерации фазового портрета с параметрами «по умолчанию»

Строка 5 — вызов функции генерации фазового портрета с настроенными параметрами

Итог

При запуске программы получаем следующий результат:

Полный текст программы под лицензией MIT (Использование при условии ссылки на источник):

Ссылка по ГОСТ:

Синица А.М.: Построение фазовых портретов на языке Python [Электронный ресурс] // Digiratory. 2017 г. URL: https://digiratory.ru/?p=435 (дата обращения: ДД.ММ.ГГГГ).

Построение фазовых портретов на языке Python: 2 комментария

  1. Уведомление: Устойчивость нелинейных систем — Digiratory

  2. Уведомление: Оценка параметров ДУ в Python — Digiratory

Добавить комментарий