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

об этом спрашивали 7 лет go в этой теме:

Как определить системы 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);

Я хотел бы знать, есть ли эквивалент в python. Так что мне не нужно использовать выражения Symboli c, которые ограничивают универсальность кода.

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

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)

I Мысль об использовании 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)

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

1 Ответ

1 голос
/ 21 марта 2020

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

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

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

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

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)

example

...