如何用python控件模拟系统传递函数的时间响应(IVP问题)?

如何用python控件模拟系统传递函数的时间响应(IVP问题)?,python,differential-equations,transfer-function,python-control,Python,Differential Equations,Transfer Function,Python Control,我试图演示如何使用系统传递函数和python控制模块来“求解”(模拟求解)微分方程初值问题(IVP)。事实上,我在控制方面是个新手 我有一个简单的微分作为例子:y'-4y'+13y=0,初始条件是:y(0)=1和y'(0)=0 我手动实现此传递函数: Y(s)=(s-4)/(s^2-4*s+13) 因此,在Python中,我正在编写这段代码(请注意,y_ans是这个差异IVP as的答案): 这段代码让我看到了这张图: 但当我在yout前面插入一个负号时,我得到了一个匹配项,正如我所希望的:

我试图演示如何使用系统传递函数和
python控制
模块来“求解”(模拟求解)微分方程初值问题(IVP)。事实上,我在控制方面是个新手

我有一个简单的微分作为例子:
y'-4y'+13y=0
,初始条件是:
y(0)=1
y'(0)=0

我手动实现此传递函数:
Y(s)=(s-4)/(s^2-4*s+13)

因此,在Python中,我正在编写这段代码(请注意,
y_ans
是这个差异IVP as的答案):

这段代码让我看到了这张图:

但当我在yout前面插入一个负号时,我得到了一个匹配项,正如我所希望的:

plt.plot(T, -yout, 'r', label='simulated') ### yout with negative sign

我做错了什么?Python控件文档对我来说不是很清楚。另外,我不知道我对
control.forced_response
X0
参数的解释是否正确。有没有可能按照我的意图去做呢

欢迎任何能够阐明这一主题的人发表意见

编辑

设置
X0=[0,0]
可以得到以下图形:


感谢@LutzLehmann的评论,我一直在思考“编码两次”的含义。回到原点,我意识到这个传递函数包含了输入(时间或斜率)和初始条件。它实际上是一种输出。我需要某种拉普拉斯逆变换,或者,正如我开始思考的那样,我只需要按原样模拟它,而不需要进一步的信息

因此,我设法使用了一个脉冲输入(拉普拉斯变换等于1),并且我能够得到一个与我的tf在时间上模拟的完全一致的输出

import numpy as np
import control as ctl
import matplotlib.pyplot as plt

t = np.linspace(0., 1.5, 100)
sys = ctl.tf([1.,-4.],[1.,-4.,13.])
T, yout = ctl.impulse_response(sys, T=t) # HERE is what I wanted

y_ans = lambda x: 1/3*np.exp(2*x)*(3*np.cos(3*x) - 2*np.sin(3*x))

plt.plot(t, y_ans(t), '-.', color='gray', alpha=0.5, linewidth=3, label='correct answer')
plt.plot(T, yout, 'r', label='simulated')
plt.legend()


现在我想我可以演示如何使用python控件间接模拟微分方程的答案:-D

似乎您在
强制响应
中对初始条件进行了两次编码,一次在传递函数的分子中,然后再次在
X0
中。尝试设置
X0=[0,0]
。您可能已经为
(s-4)^2/(s^2-4s+13)
实现了解决方案。谢谢,@LutzLehmann,但是当我设置
X0=[0,0]
或将其设为默认值时,结果是横坐标上有一条调零的平线(我在问题的编辑部分中包含了该图)。
import numpy as np
import control as ctl
import matplotlib.pyplot as plt

t = np.linspace(0., 1.5, 100)
sys = ctl.tf([1.,-4.],[1.,-4.,13.])
T, yout = ctl.impulse_response(sys, T=t) # HERE is what I wanted

y_ans = lambda x: 1/3*np.exp(2*x)*(3*np.cos(3*x) - 2*np.sin(3*x))

plt.plot(t, y_ans(t), '-.', color='gray', alpha=0.5, linewidth=3, label='correct answer')
plt.plot(T, yout, 'r', label='simulated')
plt.legend()