如何在 Python 中指定线性系统中的时间延迟?
How can I specify Time Delays in Linear Systems in Python?
这是 7 年前在这个主题中被问到的:
How to define LTI systems with Time delay in Scipy?
答案已经过时或者至少我不知道如何让它工作,我想知道目前是否有办法做到这一点。
我想创建一个看起来像 this 的传递函数,其中 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 中是否有等效项。这样我就不必使用限制代码通用性的符号表达式。
用符号表达式看起来像这样:
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)
我用谷歌搜索了我能想到的所有内容,但找不到任何相关文档,抱歉我的无知和糟糕的英语。
提前致谢!
据我所知,Python 没有广泛支持的控制库,它以与 Matlab 控制工具箱相同的方式支持延迟。我的学生和我一直在研究解决这个问题的方法,并希望将其打包并在今年发布到 pypi。
包含我们代码的存储库是 here,并且允许您正在谈论的使用内部延迟表示的操作类型的对象在 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)
这是 7 年前在这个主题中被问到的:
How to define LTI systems with Time delay in Scipy?
答案已经过时或者至少我不知道如何让它工作,我想知道目前是否有办法做到这一点。
我想创建一个看起来像 this 的传递函数,其中 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 中是否有等效项。这样我就不必使用限制代码通用性的符号表达式。
用符号表达式看起来像这样:
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)
我用谷歌搜索了我能想到的所有内容,但找不到任何相关文档,抱歉我的无知和糟糕的英语。 提前致谢!
据我所知,Python 没有广泛支持的控制库,它以与 Matlab 控制工具箱相同的方式支持延迟。我的学生和我一直在研究解决这个问题的方法,并希望将其打包并在今年发布到 pypi。
包含我们代码的存储库是 here,并且允许您正在谈论的使用内部延迟表示的操作类型的对象在 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)