一个问题似乎是变量 xx 不是符号,因此符号求解器似乎将其视为常数。
一个更大的问题是,当它只是一个三点向量时,您真的没有确定您希望 matlab 如何将 xx 值视为连续函数!您甚至期望第二种情况的输出相同的事实表明对我有某种误解。
但为了明确这一点,我们假设您希望将 xx 视为 ZOH(零阶保持)连续信号。为了象征性地处理这个问题,我相信您需要使用 Heaviside 函数显式构造 ZOH 信号。
或者,您可以使用 ode45 进行数值求解,例如
t = [0,1,2];
xx = [2, 0, -14.7781];
dydy = @(t,y) 2*y - xx(1+trunc(t));
y = ode45(dydt, [0,2], 0);
这将分别在[0, 1, 2]的 t 值处返回[0, -6.39, -47.21]的 yy 值。
这与ZOH 系统的[0, 1-e^2, e^2-e^4]的理论值(手动计算)非常吻合。
如您所见,上述答案更符合您的 yy = [0, -5.4366, -29.5562]的原始解决方案。然而,这两个系统自然不同,因为第一个系统输入的是连续时间指数信号,而第二个系统输入的是非常粗略的采样近似值!
您可以通过以更快的速率(更细的时间间隔)进行采样,以及使用比 ZOH 更好的东西对采样间点进行插值,从而使两者更加相似。
更新:
谢谢。也许你能帮我创建 ZOH 连续信号吗?怎么做?
在上面的示例中,我通过使用 xx 向量中的三个给定点并使用“xx(1+trunc(t))”访问这些点,在我的导函数 (dydx) 中创建了一个 ZOH。这使用 trunc(截断)在样本间(非整数)时间内显式保持输入常数。
鉴于您的 ODE 是线性的,您还可以使用 matlab 函数“lsim()”,它允许您直接指定时间向量和输入向量,还可以直接指定输入插值的类型(包括 ZOH,这实际上是默认)。
例如:
t=[0,1,2]
x=[2,0,-2*e^2]
num=-1
den=[1,-2]
mytf = tf(num,den)
y = lsim(mytf,x,t,0,'zoh');
与我之前的 ode45 数值解一样,这给出了相同的解,
y = [0.00000; -6.38906; -47.20909]
更新(再次)
谢谢。也许你能帮我创建 ZOH 连续信号吗?怎么做?
重新符号求解器。我无法访问 Matlab 符号库,但如果您真的想使用符号求解器,那么正如我之前解释的,您可以使用 heaviside(单位步长)函数构造一个连续时间 ZOH 信号。应该这样做:
syms xzoh(t)
xzoh = xx(1)*heaviside(t) + (xx(2)-xx(1))*heaviside(t-1) + (xx(3)-xx(2))*heaviside(t-2)