Если вы на самом деле ввести в help ltitr
в командной строке MATLAB, вы столкнетесь с этой документацией:
%LTITR Linear time-invariant time response kernel.
%
% X = LTITR(A,B,U) calculates the time response of the
% system:
% x[n+1] = Ax[n] + Bu[n]
%
% to input sequence U. The matrix U must have as many columns as
% there are inputs u. Each row of U corresponds to a new time
% point. LTITR returns a matrix X with as many columns as the
% number of states x, and with as many rows as in U.
%
% LTITR(A,B,U,X0) can be used if initial conditions exist.
% Here is what it implements, in high speed:
%
% for i=1:n
% x(:,i) = x0;
% x0 = a * x0 + b * u(i,:).';
% end
% x = x.';
% Copyright 1984-2007 The MathWorks, Inc.
% $Revision: 1.1.6.4 $ $Date: 2007/05/23 18:54:41 $
% built-in function
Таким образом, они в значительной степени уже дают вам код для этого. Тем не менее, я предполагаю, что это написано в MEX, и поэтому он встроен и очень быстрый. Таким образом, если вы хотите перенести это на Octave, вам просто нужно использовать код, который они ссылаются выше. Однако это будет не так быстро, как версия MATLAB, но цикл for
по сути является основным способом его реализации.
Однако, для полноты картины, давайте напишем нашу собственную функцию Octave для него:
function x = ltitr(A, B, U, x0)
%// Number of rows in U is the number of time points
num_points = size(U, 1);
%// Number of columns in U is how many inputs we have
num_inputs = size(U, 2);
x = zeros(num_inputs, num_points); %// Pre-allocate output
%// For each time point we have ...
for idx = 1 : num_points
x(:,idx) = x0; %// Output the corresponding time point
x0 = A*x0 + B*U(idx,:).'; %// Compute next time point
end
x = x.';
выше функция почти похожа на код, который вы видите в MATLAB, но есть некоторые дополнительные шаги, которые я сделал , такие как предварительная выделение матрицы для эффективности, а также получение некоторых релевантных переменных для помощи при вычислении. Также обратите внимание, что выходная матрица x
определена с размерами перевернутой. Причина в том, что вычисление вывода в каждый момент времени легче вычислять в этом состоянии. Если вы этого не сделаете, вам придется сделать ненужную перенос для других переменных, определенных в операторе x0 = ...
. Таким образом, легче выполнять вычисления в транспонированной матрице. Когда вы закончите, вы перенесете результирующую матрицу, чтобы получить окончательную матрицу вывода x
.
состояние по умолчанию для x0
Я предполагаю, что будет все нули, так что если вы хотите использовать это как состояние по умолчанию, укажите x0 = zeros(n,1);
где n
общее число входов для вашей системы LTI.