Здравствуйте!


С появлением библиотеки Python Control Systems Library [1], решение основных задач проектирования систем автоматического управления (САУ) средствами Python значительно упростилось и теперь практически идентично решению таких задач в математическом пакете Matlab.

Однако, проектирование систем управления с применение указанной библиотеки имеют ряд существенных особенностей, которых нет в документации [1], поэтому особенностям использования Python Control Systems Librar и посвящена данная публикация.

Начнём с инсталляции библиотеки. В документации говориться о загрузке двух модулей slycot и control, на самом деле для нормальной работы нужна ещё библиотека numpy+mkl, остальные устанавливаются автоматически при загрузке control.

Указанные модули можно скачать с сайта [2]. В документации так же сказано, что для интерфейса по умолчанию нужно просто импортировать контрольный пакет следующим образом: import control.

Однако, при таком импортировании библиотека не работает ни одном из примеров. Для импортирования библиотеки необходимо применить from control import* как и для импортировании окружения matlab: from control. matlab import *[1].

Рассматривать специализированную библиотеку Python Control Systems Library можно только применительно к задачам проектирования систем автоматического управления, поэтому мы так и поступим.

1. Модели соединений систем (функции tf и feedback)

Ввод передаточных функций:

# -*- coding: utf8 -*-
from control.matlab import *
f = tf(1, [1, 1]);
g = tf(1, [2 ,1]);

Параллельное соединение блоков или систем:



# -*- coding: utf8 -*-
from control.matlab import *
f = tf(1, [1, 1]);
g = tf(1, [2 ,1]);
w = f + g
print (w)

(3 s + 2)/(s^2 + 3 s + 1)

Последовательное соединение блоков или систем:



# -*- coding: utf8 -*-
from control.matlab import *
f = tf(1, [1, 1]);
g = tf(1, [2 ,1]);
w = f* g
print (w)

1/(2 s^2 + 3 s + 1)

Контур с обратной связью:



a) Контур с отрицательной обратной связью:

# -*- coding: utf8 -*-
from control.matlab import *
f = tf(1, [1, 1]);
g = tf(1, [2 ,1]);
w = feedback(f, g)
print(w)

(2 s + 1)/(2 s^2 + 3 s + 2)

б) Контур с положительной обратной связью:

# -*- coding: utf8 -*-
from control.matlab import *
f = tf(1, [1, 1]);
g = tf(1, [2 ,1]);
w = f/(1-f*g)
print(w)

(2 s^2 + 3 s + 1)/(2 s^3 + 5 s^2 + 3 s)

Вывод:

При помощи функций tf и feedback можно моделировать соединений блоков и систем.

2. Динамические и частотные характеристики систем автоматического управления (САУ)

Зададим передаточную функцию САУ:



Найдем ее динамические и частотные характеристики:

# -*- coding: utf8 -*-
from control.matlab import *
""" Создадим LTI-объект с именем w, для этого выполним:"""
num= [1., 2.]
den= [3., 4., 5.,3]
w= tf(num, den)
""" Найдем полюса и нули передаточной функции с использованием команд pole, zero"""
print('Передаточная функция САУ : \n %s'%w)
print("Полюса: \n %s"%pole(w))
print("Нули:\n %s -\n "%zero(w))

Передаточная функция САУ:

( s + 2)/(3 s^3 + 4 s^2 + 5 s + 3)

Полюса:

-0.26392546+1.08251346j
-0.26392546-1.08251346j
-0. 80548241+0.j
Нули: -2


Построим переходную функцию командой step(w):

# -*- coding: utf8 -*-
from control.matlab import *
import matplotlib.pyplot as plt
""" Создадим LTI-объект с именем w, для этого выполним:"""
num= [1., 2.]
den= [3., 4., 5.,3]
w= tf(num, den)
y,x=step(w)
plt.plot(x,y,"b")
plt.title('Step Responsse ') 
plt.ylabel('Amplitude')
plt.xlabel('Time(sec)')
plt.grid(True)
plt.show()



Построим импульсную переходную функцию командой impulse(w):

# -*- coding: utf8 -*-
from control.matlab import *
import matplotlib.pyplot as plt
""" Создадим LTI-объект с именем w, для этого выполним:"""
num= [1., 2.]
den= [3., 4., 5.,3]
w= tf(num, den)
y,x=impulse(w)
plt.plot(x,y,"r")
plt.title('impulse Responsse ') 
plt.ylabel('Amplitude')
plt.xlabel('Time(sec)')
plt.grid(True)
plt.show()



Диаграмму Боде получим используя команду bode(w):

# -*- coding: utf8 -*-
from control.matlab import *
import matplotlib.pyplot as plt
""" Создадим LTI-объект с именем w, для этого выполним:"""
num= [1., 2.]
den= [3., 4., 5.,3]
w= tf(num, den)
mag, phase, omega = bode(w, dB=True)
plt.plot()
plt.show()



Вывод:

Построение bode диаграммы имеет некоторые особенности, приведенные в листинге.

Построим Найквист-диаграмму командой nyquist(w):

import matplotlib.pyplot as plt
from control.matlab import *
num= [1., 2.]
den= [3., 4., 5.,3]
w= tf(num, den)
plt.title('Nyquist Diagram ') 
plt.ylabel('Imaginary Axis')
plt.xlabel('Real Axis')
nyquist(w)
plt.grid(True)
plt.plot()
plt.show()



Вывод:

Построение Найквист- диаграммы имеет некоторые особенности, приведенные в листинге.

Мы рассмотрели простые задачи, теперь попробуем совсем немного поднапрячь библиотеку Python Control Systems Library.

3. Найдем дискретную передаточную функцию исполнительного механизма, уравнения состояния которого имеют вид:

(1)

Для вычисления воспользуемся матричной экспонентой:

(2)

где h – интервал квантования.

Найдем ее преобразование Лапласа от (2), которое будет равно.

(3)

где I – единичная матрица.

После подстановки в (3) матрицы А получим.

(4)

Вычислим обратную матрицу.

(5)

Откуда, осуществляя z – преобразование последней матрицы, найдем матрицу перехода дискретной системы Ad.

(6)

где h – интервал дискретизации по времени.

Матрица Bd в соответствии с (2) будет равна.



Тогда дискретный аналог модели исполнительного механизма будет выглядеть:

(7)

Этот пример на Python Control Systems Library для h=0,1 запишется так:

# -*- coding: utf8 -*-
import matplotlib.pyplot as plt
from control.matlab import *
import numpy as np
A=np.matrix([[-1,0],[1,0]])
B=np.matrix([[1],[0]])
C=np.matrix([[0,1]])
D=0
sn=ss(A,B,C,D)
wd=tf(sn)
print("Непрерывная модель: \n %s"%sn)
print("Передаточная функция  \n %s"%wd)
y,x=step(wd)
plt.plot(x,y,"b")
plt.title('Step Responsse ') 
plt.ylabel('Amplitude')
plt.xlabel('Time(sec)')
plt.grid(True)
plt.show()
h=1
sd=c2d(sn,h)
print("Дискретная модель : \n %s"%sd)


Передаточная функция

1/(s^2+s)



Непрерывная модель:

 A = [[-1  0]
 [ 1  0]]
B = [[1]
 [0]]
C = [[0 1]]
D = [[0]]

Дискретная модель:

A = [[0.36787944 0. ]
 [0.63212056 1. ]]
B = [[0.63212056]
 [0.36787944]]
C = [[0 1]]
D = [[0]]
dt = 1

Вывод:

С использованием библиотеки на Python Control Systems Library получена математическая модель исполнительного механизма, основанная на системе дифференциальных уравнений (1). В модели использованы матричные операторы.

Уверен, что ценителям Python понравиться новая библиотека, существенно расширяющая возможности любимого языка программирования. Однако читатели знают, что любая новая библиотека требует большого труда для её адаптации к реальным задачам и только после этого она становиться востребованной и популярной.

Всем спасибо за внимание!

Ссылки:

1. Python Control Systems.

2. Unofficial Windows Binaries for Python Extension Packages.

Комментарии (0)