如何在 Matlab 中使用 State-space 模型避免 tf() 命令
How to avoid tf() command using State-space models in Matlab
我试图避免使用 Matlab 中的 tf() 函数,因为它需要特定的工具箱才能 运行。
我使用的传递函数非常简单。是散热器温度的模型。
H(s) = (Rth/Tau)/(s + 1/Tau)
为了避免 tf() 函数,我尝试用在 Matlab 中编码的状态 space 模型替换传递函数。
我已使用函数 ss() 获取 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()函数,还有其他方法吗?
最后,我找到了另一个解决方案。我在这里发布这个,所以如果有人有同样的问题,可以使用这个方法。
如果把传递函数展开,我们得到下面的表达式
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() 具有相同的输出。
我试图避免使用 Matlab 中的 tf() 函数,因为它需要特定的工具箱才能 运行。
我使用的传递函数非常简单。是散热器温度的模型。
H(s) = (Rth/Tau)/(s + 1/Tau)
为了避免 tf() 函数,我尝试用在 Matlab 中编码的状态 space 模型替换传递函数。
我已使用函数 ss() 获取 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()函数,还有其他方法吗?
最后,我找到了另一个解决方案。我在这里发布这个,所以如果有人有同样的问题,可以使用这个方法。
如果把传递函数展开,我们得到下面的表达式
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() 具有相同的输出。