0

我有一个由两个方程组成的 ODE 系统,但想通过只使用一个方程和另一个方程的结果来最小化它。

1)

t=linspace(0,2,3);
syms x(t) y(t);
inits='x(0)=2,y(0)=0';
[x,y]=dsolve('Dx=y','Dy=(y*2)-x', inits)

x = 2*exp(t) - 2*t*exp(t);
y = -2*t*exp(t)

xx=eval(vectorize(x));

xx = 2.0000;0; -14.7781

yy=eval(vectorize(y));

YY = 0; -5.4366;-29.5562

得到结果后,我尝试只用一个方程求解,并在 Dy 方程中使用 xx 数组。

2)

inits='y(0)=0';
[y]=dsolve('Dy=(y*2)-xx', inits);

y = xx/2 - (xx*exp(2*t))/2

yy=eval(vectorize(y));

YY = 0; 0; 396.0397

这些值与第一个示例中的值不同。如何使用数组获得相同的结果?

4

1 回答 1

1

一个问题似乎是变量 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)
于 2013-03-27T14:17:22.293 回答