2014-09-18 3 views
0

Я пытаюсь получить некоторые скрипты MATLAB работать в октаву, но есть проблемы с помощью следующей строки кода:Октав эквивалент MATLAB функции ltitr.m

x = ltitr(a, b, u, x0) ; 

, который выдает ошибку в октаву.

Онлайн-исследования показывают, что функция ltitr является внутренней функцией MATLAB, которая возвращает линейное время-инвариантное ядро ​​ответа времени для данных входов. Это звучит так, как будто это должно быть общим требованием DSP, поэтому я считаю, что это должно быть реализовано непосредственно в Octave или в последнем пакете Control от Source Forge. Однако я не могу найти эквивалент Октава. Я прочитал документацию для последнего пакета Octave Control и, возможно, должен использовать функции lsim.m или ss.m или dss.m или impulse.m, но я не уверен.

Может ли кто-нибудь просветить меня? Если он не реализован в Octave, может быть, некоторая онлайн-ссылка на код, который я мог бы использовать для написания моей собственной функции ltitr?

ответ

3

Если вы на самом деле ввести в 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.