Как я могу указать временные задержки в линейных системах в Python?

Об этом спросили 7 лет назад в этой теме:

Как определить системы LTI с задержкой времени в Scipy?

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

Я хочу создать передаточную функцию, которая выглядит, как это, гдеs равно 0,1, что является временной задержкой.

В Matlab я бы сделал что-то вроде этого:

H=tf(1,'InputDelay',0.1);

s=tf('s');
G=1/(s+1);
Q=1+0.5*s+2/s;

так что тогда я могу работать с передаточными функциями следующим образом:

M=feedback(Q*G,H);
M=minreal(M);
display(M);

Хотелось бы узнать, есть ли в питоне аналог. Так что мне не нужно использовать символические выражения, ограничивающие универсальность кода.

с символическими выражениями это будет выглядеть так:

s = sym.symbols('s')
G = 1/(s+1)
Q = 1+0.5*s+2/s
H = sym.exp(-0.1*s)
# Cálculo de la función de transferencia global
M = Q*G/(1+Q*G*H)
M = sym.simplify(M)
sym.pprint(M)

Я думал об использовании numpy или sympy exp, но ни один из них не работает:

s = ct.tf('s')
H = np.exp(-0.1*s)

Выход:

TypeError: loop of ufunc does not support argument 0 of type TransferFunction which has no callable exp method

Sympy дает следующее:

SympifyError: Sympify of expression 'could not parse '-0.1 s------ 1'' failed, because of exception being raised: SyntaxError: invalid syntax (<string>, line 1)

Я искал в Google все, что мог придумать, и не смог найти никакой документации по этому поводу, извините за мое невежество и плохой английский. Заранее спасибо!

1 ответ

Решение

Насколько мне известно, для Python не существует широко поддерживаемых управляющих библиотек, которые поддерживают задержки так же, как и набор инструментов управления Matlab. Мы с учениками некоторое время работаем над решением этой проблемы и надеемся упаковать его для выпуска на pypi в этом году.

Репозиторий с нашим кодом находится здесь, а объект, который позволяет манипуляции, о которых вы говорите, используя представление внутренней задержки, определен вInternalDelay.py.

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

Следующий код создаст ступенчатый ответ для вашей замкнутой системы, показывая эффект добавления задержки. Я также использовал только ПИ-регулирование вместо ПИД-регулятора, чтобы контроллер оставался физически реализуемым.

from utils import InternalDelay, tf
import matplotlib.pyplot as plt
import numpy as np

s = tf([1, 0], 1)
G = 1/(s + 1)
Q = 1 + 2/s
H = tf(1, 1, deadtime=0.1)
G = InternalDelay(G)
Q = InternalDelay(Q)
H = InternalDelay(H)
one = InternalDelay(tf(1, 1))

M = Q*G/(one + Q*G)
Mdelay = Q*G/(one + Q*G*H)

t = np.linspace(0, 10, 5000)

y = M.simulate(lambda t: [1], t)
ydelay = Mdelay.simulate(lambda t: [1], t)

plt.plot(t, y, t, ydelay)
plt.legend(['Delay-free', 'Delay=0.1s'])
plt.axhline(1)

Другие вопросы по тегам