如何在 Python 中指定线性系统中的时间延迟?

Won*_*nky 3 python matlab python-3.x transfer-function python-control

7年前有人在这个帖子中问过这个问题:

\n\n

如何在 Scipy 中定义具有时间延迟的 LTI 系统?

\n\n

答案已经过时了,或者至少我不知道如何让它发挥作用,我想知道目前是否有办法做到这一点。

\n\n

我想创建一个如下所示的传递函数其中s0.1 为时间延迟。

\n\n

在 matlab 中我会做这样的事情:

\n\n

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

\n\n
s=tf(\'s\');\nG=1/(s+1);\nQ=1+0.5*s+2/s;\n
Run Code Online (Sandbox Code Playgroud)\n\n

这样我就可以使用传递函数进行如下操作:

\n\n
M=feedback(Q*G,H);\nM=minreal(M);\ndisplay(M);\n
Run Code Online (Sandbox Code Playgroud)\n\n

我想知道 python 中是否有等效的。这样我就不必使用限制代码通用性的符号表达式。

\n\n

使用符号表达式,它看起来像这样:

\n\n
s = sym.symbols(\'s\')\nG = 1/(s+1)\nQ = 1+0.5*s+2/s\nH = sym.exp(-0.1*s)\n# C\xc3\xa1lculo de la funci\xc3\xb3n de transferencia global\nM = Q*G/(1+Q*G*H)\nM = sym.simplify(M)\nsym.pprint(M)\n
Run Code Online (Sandbox Code Playgroud)\n\n

我想过使用 numpy 或 sympy exp 但都不起作用:

\n\n
s = ct.tf(\'s\')\nH = np.exp(-0.1*s)\n
Run Code Online (Sandbox Code Playgroud)\n\n

输出:

\n\n

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

\n\n

Sympy 给出了这个:

\n\n

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

\n\n

我已经用谷歌搜索了我能想到的所有内容,但找不到任何相关文档,对于我的无知和糟糕的英语感到抱歉。\n提前谢谢您!

\n

cht*_*mon 5

据我所知,Python 还没有像 Matlab 控制工具箱那样支持延迟的广泛支持的控制库。我和我的学生为此研究解决方案已经有一段时间了,希望今年将其打包发布到 pypi。

包含我们代码的存储库位于此处,并且允许您使用内部延迟表示进行操作的对象在 中定义InternalDelay.py

您的示例的一个小问题是您的 Q 在物理上无法实现,这会导致我们的库中出现一些错误。

以下代码将为您的闭环系统产生阶跃响应,显示添加延迟的效果。我还只使用 PI 控制而不是 PID 来保持控制器的物理可实现性。

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)
Run Code Online (Sandbox Code Playgroud)

例子