我有“matlab功能块”的模型,其中我有递归最小二乘法。递归算法需要知道输入信号的长度才能正常工作。但是当我使用命令N = length(y)时,它返回我的长度N = 1.但我认为它应该给我更高的长度。 Simulink model
Matlab功能块代码“rls_iden6”
function [P,N] = fcn(u,y)
%%
N = length(y);
sigma=1;
C = sigma*eye(2); %p
P = ones(2,1);
z= [y; u];
lamda=1;
for n=1:N
sample_out = y(n);
C = (C - ( (C*z*z'*C)/( lamda+(z'*C*z) ) ))/lamda;
P = P + (C*z* (sample_out - (z'*P)));
end
我的最终代码看起来如下所示,因为它在matlab工作区中有效。 Simulink应该给我5个参数,而不仅仅是2个。
load data_cela.mat
u=U; %input
y=Y; %output
%%
input = 3;
output = 2;
system = input + output;
N = length(y);
%initial conditions
sigma = 1;
C = sigma*eye(system);
P = ones(system,1);
lamda = 1; %forgetting factor
for n=3:N
for i=1:2
W(i) = y(n-i); %output
end
for i=1:3
V(i) = u(n-i+1); %input
end
z = [V';W'];
sample_out = y(n);
pom(n)= z' * P;
error(n) = y(n) - pom(n);
C = (C - ( (C*z*z'*C)/( lamda+(z'*C*z) ) ))/lamda;
P = P + (C*z* (sample_out - (z'*P) ) );
change(1:system,n) = P;
end
f_param = [P(1:3);-P(4:5)];
num = [P(1:3,1)];
den = [1;-P(4:5,1)];
num1 = num(3,1);
trasferfunction = tf(num1,den',1)
结果:
0.002879
----------------------
z^2 - 1.883 z + 0.8873
答案 0 :(得分:0)
您需要在信号之前添加一个缓冲区,以将标量转换为矩阵。然后在添加缓冲区后,将缓冲区大小设置为所需的数据量,即通过将其设置为2将产生2行1列。这将帮助您获取数据,但是,为了正确设置延迟,您需要将缓冲区重叠设置为1。
希望这会有所帮助。