Как избежать использования команды tf () с использованием моделей пространства состояний в Matlab - PullRequest
0 голосов
/ 10 октября 2019

Я пытаюсь избежать функции tf () из Matlab, так как для ее запуска требуются определенные наборы инструментов.

Используемая мной функция передачи довольно проста. Является ли модель для температуры радиатора.

                         H(s) = (Rth/Tau)/(s + 1/Tau)

Чтобы избежать функции tf (), я попытался заменить передаточную функцию моделью пространства состояний, кодированной в Matlab.

Я использовал функцию ss (), чтобы получить значения te, A, B, C и D. И я попытался сравнить результаты из tf () и моей функции.

Вот код, который я использовал:

Rth = 8.3220e-04; % ºC/W
Tau = 0.0025; % s

P = rand(1,10)*1000; % Losses = input
t = 0:1:length(P)-1; % Time array

%%%%%%%%%%%%%%%%%%%%%%%%%
%%% Transfer function %%%
%%%%%%%%%%%%%%%%%%%%%%%%%

H = tf([0 Rth/Tau],[1 1/Tau]);
Transfer_func = lsim(H,P,t);

figure, plot(Transfer_func),grid on,grid minor, title('Transfer func')

%%%%%%%%%%%%%%%%%%%%%%%%%
%%%   My función ss   %%%
%%%%%%%%%%%%%%%%%%%%%%%%%

% Preallocate for speed
x(1:length(P)) = 0;
y(1:length(P)) = 0;
u = P;

sys = ss(H);
A = sys.A;
B = sys.B;
C = sys.C;
D = sys.D;

for k = 1:length(u)
     x(k+1) = A*x(k) + B*u(k);
     y(k) = C*x(k) + D*u(k);
end

figure, plot(y), grid on,grid minor, title('With my función')

Я знаю, что значения из A, B, C и D в порядке, так как я проверил их, используя

H = tf([0 Rth/Tau],[1 1/Tau]);
sys = ss(H);
state_space_sys = ss(sys.A,sys.B,sys.C,sys.D);
state_space = lsim(state_space_sys,P,t);

figure, plot(state_space),grid on,grid minor, title('State space')

Как видите, результаты, полученные из моей функции и функции tf (), сильно отличаются.

Есть ли ошибки в подходе?

Если таким способом избежать функции tf () невозможно, есть ли другой способ?

1 Ответ

0 голосов
/ 14 октября 2019

В конце концов я нашел другое решение. Я публикую это здесь, поэтому, если у кого-то есть такая же проблема, можно использовать этот подход.

Если вы берете передаточную функцию и развиваете ее, мы достигаем следующего выражения

H(s) = deltaT (s) / P (s) = (Rth / Tau) / (s + 1 / Tau)

deltaT (s) * (s + 1 / Tau) = (Rth / Tau) * P (s)

deltaT (s) * s = (Rth / Tau) * P (s) - deltaT (s) / Tau

Теперь мы знаем, что 1 / sравно интегрировать. Таким образом, в конце мы должны интегрировать правую часть уравнения. Код будет выглядеть следующим образом.

Cth = Tau/Rth;
deltaT = zeros(size(P));

for i = 2:length(P)
    deltaT(i) = (1/Cth * (P(i)-deltaT(i-1)/Rth))*(time(i)-time(i-1)) + deltaT(i-1);
end

Этот интеграл имеет тот же вывод, что и функция tf ().

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...