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 的答案):
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 控制文档对我来说不是很清楚。另外,我不知道我对X0
参数 for的解释control.forced_response
是否正确。是否有可能按照我的意图做到这一点?
欢迎任何能对这个主题有所了解的人做出贡献。
编辑
设置X0 = [0,0]
给了我这个图表: