我试图演示如何使用系统传递函数和python-control
模块的定义来“求解”(模拟解)微分方程初值问题(IVP)。事实上,我在控制方面是个新手
我有一个简单的微分作为例子:y'' - 4y' + 13y = 0
,初始条件是:y(0) = 1
和y'(0) = 0
我手动实现此传递函数:
Y(s) = (s - 4)/(s^2 - 4*s + 13)
因此,在Python中,我正在编写这段代码(注意y_ans
是这个差异IVP的答案,即seen here):
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.forced_response(sys, T=t, X0=[1, 0])
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()
这段代码让我看到了这张图:
但是当我在yout
前面插入一个负号时,我得到了一个匹配项,正如我所希望的:
plt.plot(T, -yout, 'r', label='simulated') ### yout with negative sign
我做错了什么?Python控件文档对我来说不是很清楚。另外,我不知道我对control.forced_response
的X0
参数的解释是否正确。有没有可能按照我的意图去做呢
欢迎任何能够阐明这一主题的人发表意见
编辑
设置X0 = [0,0]
可以得到以下图形:
我认为在这里最好的做法是将系统转换为状态空间,并查看发生了什么(有许多可能的状态空间表示):
输出:
我们想找到
x(0)
,这样y(0) = Cx(0) = 1
和y'(0) = CAx(0) = 0
我们可以写出这些方程并手工求解,也可以使用线性代数:
给出:
因此,这应该是可行的:
此外,由于您只对初始条件(即} 函数:
u(t)=0
)的瞬态响应感兴趣,因此可以使用^{感谢@LutzLehmann的评论,我一直在思考“两次编码”的含义。回到原点,我意识到这个传递函数包含了输入(时间或斜率)和初始条件。它实际上是一种输出。我需要某种拉普拉斯逆变换,或者,正如我开始思考的那样,我只需要按原样模拟它,而不需要进一步的信息
因此,我设法使用了一个脉冲输入(拉普拉斯变换等于1),并且我能够得到一个与我的tf在时间上模拟的完全一致的输出
现在我想我可以演示如何使用python控件间接模拟微分方程的答案:-D
相关问题 更多 >
编程相关推荐