我有一个非常简单的问题:生成y_1,...,y_n,这样
y_t = x_t + a * y_ {t-1} + b * y_ {t-2}
其中给出a,b,x_1,...,x_n,y_0和y _ { - 1}也是如此。我可以通过2种方式使用 MATLAB 执行此操作(使用过滤器之前使用循环并进行一些手动调整)。如何使用过滤器的初始条件的内置容差?
我的代码如下:
clc; clear; tic;
n = 20;
x = (1:1:n)'; %//' this is here so code looks good in SO.com
yzero = -3;
yminus1 = -4;
a = 1;
b = 1;
yinitial = [yminus1;yzero];
% alternative 1
y = zeros(n,1);
for i = 1:n
if i == 1
y(1) = x(1) + a * yzero + b * yminus1;
elseif i == 2
y(2) = x(2) + a * y(1) + b * yzero;
else
y(i) = x(i) + a * y(i-1) + b * y(i-2);
end
end
% alternative 2
z = x;
z(1) = z(1) + a * yzero + b * yminus1;
z(2) = z(2) + b * yzero;
s = filter(1,[1,-a,-b],z);
% alternative 3
r = filter(1,[1,-a,-b],x,yinitial);
toc;
我希望得到y
,s
和r
的相同答案。但只有y
和s
相同且r
非常不同。我做错了什么?
答案 0 :(得分:1)
在第三种选择中,初始条件的第一个元素稍微偏离。
您使用初始条件:
yinitial =
-4
-3
但正确的是
yinitialFix =
-7
-3
为什么呢?在备选方案3中调用filter
的第四个参数包含初始条件:以便执行这些初始步骤:
x(1) = x(1) + yinitialFix(1)
x(2) = x(2) + yinitialFix(2)
因此,在您的初始步骤中,您实际(隐式)在备选方案2中自己计算了yinitialFix
的正确值:
z(1)
的初始步骤a * yzero + b * yminus1 = -7
,z(2)
移位b * yzero = -3
。使用已应用的修补程序,替代3
%// ...
%// alternative 3;
yinitialFix = [-7; -3];
r = filter(1,[1,-a,-b],x,yinitialFix);
产生与前两个相同的结果。
答案 1 :(得分:0)
对于备选方案3,正如我所做的那样使用yinitial
是不正确的。这有两种方法可以解决它。首先,我需要重新定义yinitial
:
yinitial = [yzero;yminus1];
然后,我从
获得xinitial
xinitial = filter([b,a],1,yinitial);
xinitial = xinitial(end:-1:1);
来自的或
xinitial = filtic(1,[1,-a,-b],yinitial);
然后,我打电话给
r = filter(1,[1,-a,-b],x,xinitial);