首页 > 解决方案 > 如何在 Matlab 中使用状态空间模型避免 tf() 命令

问题描述

我试图避免使用 Matlab 中的函数 tf(),因为它需要特定的工具箱才能运行。

我使用的传递函数非常简单。是散热器温度的模型。

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

为了避免 tf() 函数,我尝试用 Matlab 中编码的状态空间模型替换传递函数。

我使用函数 ss() 来获取 A、B、C 和 D 的 te 值。我尝试比较 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() 函数,还有其他方法吗?

标签: matlabstate-spacetransfer-function

解决方案


最后,我找到了另一个解决方案。我在这里发布这个,所以如果有人有同样的问题,可以使用这种方法。

如果您采用传递函数并对其进行开发,我们将达到以下表达式

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() 相同的输出。


推荐阅读