Одна проблема заключается в том, что переменная xx не является символьной, поэтому символьный решатель рассматривает ее как константу.
Более серьезная проблема заключается в том, что вы действительно не определили, как именно вы хотите, чтобы Matlab обрабатывал значения xx как непрерывную функцию, когда это просто вектор из трех точек! Тот факт, что вы даже ожидаете, что вывод будет таким же для второго случая, указывает мне на какое-то недоразумение.
Но чтобы сделать это определенным, давайте предположим, что вы хотите, чтобы он обрабатывал xx как непрерывный сигнал ZOH (нулевой порядок). Чтобы справиться с этим символически, я считаю, что вам нужно явно построить сигнал 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);
Это вернет значения yy [0, -6,39, -47,21] при значениях t [0, 1, 2] соответственно.
Это хорошо соответствует теоретическим значениям (вычисленным вручную) [0, 1-e^2, e^2-e^4] для системы ZOH.
Как видите, приведенный выше ответ гораздо больше соответствует исходному решению yy = [0, -5,4366, -29,5562]. Однако, естественно, эти две системы различаются, так как на первую подается непрерывный экспоненциальный по времени сигнал, тогда как на вторую систему подается приближение с очень грубой дискретизацией!
Вы делаете их более похожими, сэмплируя с большей скоростью (более точный временной интервал), а также интерполируя точки между выборками чем-то лучшим, чем ZOH.
Обновление: Спасибо. Может быть, вы можете помочь мне с созданием непрерывного сигнала ZOH? Как это сделать?
В приведенном выше примере я создал ZOH в своей производной функции (dydx), используя три заданные точки в векторе xx и обращаясь к ним с помощью «xx(1+trunc(t))». Это использует trunc (truncate), чтобы явно удерживать входную константу в течение времени между выборками (не целочисленными).
Поскольку ваш 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? Как это сделать?
Re символический решатель. У меня нет доступа к символьной библиотеке Matlab, но если вы действительно хотите использовать символьный решатель, то, как я объяснял ранее, вы можете построить сигнал ZOH с непрерывным временем, используя функцию heaviside (единичный шаг). Что-то вроде следующего должно сделать это:
syms xzoh(t)
xzoh = xx(1)*heaviside(t) + (xx(2)-xx(1))*heaviside(t-1) + (xx(3)-xx(2))*heaviside(t-2)
person
Stuart
schedule
27.03.2013