我正在尝试使用MATLAB借助如下模型生成一些时间序列数据:
Y(t)= phi * Y(t-1)+ mu + E(t)
其中 phi 和 mu 是常数,而 E 是正态分布的随机数(白噪声)。 我想出了这段代码,可以很好地完成工作。
E=randn(1,20);mu=1;phi=0.2;Y=zeros(1,20);
Y(1)=mu*phi+mu+E(1)
for t=2:20;
Y(t)=(Y(t-1))*phi+mu+E(t);
endfor; Y=Y'; plot(Y)
这将创建一组值,其中第一个使用mu作为种子,然后根据最后一个Y的输出生成(接下来的19个值)。
这是完美的,但是,现在我正在尝试使用范围(0,1)的 phi 的不同值来应用完全相同的算法。 我想到了这个:
E=randn(1,100);
mu=2; phi=linspace(0.1,0.99,10)';p=(2:10)';Y=zeros(10,100);
Y(:,1)=mu*phi(1)+mu+E(1)
for t=(2:100);
Y(:,t)=(Y(:,t-1))*phi(p)+mu+E(t)
endfor
根据我的逻辑,这是说:
“将相同的算法应用于对phi的每个值“ p”生成单个集合Y的算法,因此它应为每个p输出100个Y。
但是,我只是遇到尺寸误差,一次,虽然摆弄一些工作原理,但最后得到的是一个长100 * 100的零矩阵,第一个值是正确的结果。 我试图绘制每个Y集以可视化模型上phi的效果,但现在我已经筋疲力尽了。 有任何想法吗? 预先感谢。
编辑:感谢Floris SA,最终程序是:
E=randn(1,100);
mu=2; phi=linspace(0.1,0.99,100)'; Y=zeros(100,100);
Y(:,1) = mu*phi + mu + E(1);
for t=(2:100);
Y(:,t) = Y(:,t-1).*phi + mu + E(t);
end
我修改了她的代码,以得到与之不同的情节:
for ii = 2:100
semilogy(Y(1,:));hold on; semilogy(Y(ii,:))
end
答案 0 :(得分:2)
您快到了。在您的代码块中:
E=randn(1,100);
mu=2; phi=linspace(0.1,0.99,10)';p=(2:10)';Y=zeros(10,100);
Y(:,1)=mu*phi(1)+mu+E(1)
for t=(2:100);
Y(:,t)=(Y(:,t-1))*phi(p)+mu+E(t)
endfor
您似乎想尝试10个值phi
。首先,我怀疑您要更改此行(左侧为版本,右侧为新版本):
Y(:,1)=mu*phi(1)+mu+E(1); --> Y(:,1)=mu*phi(:)+mu+E(1);
由于您要将10
的{{1}}行中的每行与特定值Y
关联,对吗?
接下来,您声明phi
的长度为9个值,因此p
也将包含9个值。 phi(p)
中的Y(:,t-1)
包含10个值。这意味着它们都是向量,当您进行涉及两个向量的乘法运算时,必须注意使用的运算符。当Matlab看到两个向量相乘时,它将尝试做一个vector multiplication,在这种情况下由于两个原因它不能这样做:
t
的长度为10,而Y(:,t-1)
的长度为9。这就是为什么您可能会遇到尺寸不匹配错误的原因。phi(p)
是列向量,在您的情况下Y(:,t-1)
也是如此。没有定义两个列向量的向量乘法。您想要的是将phi(p)
中的每个值与Y(:,t-1)
中的相同索引下的值相乘,您可以通过将element-wise multiplication与phi
一起使用:
.*
这应该可以解决您的错误。
如果以后要在Y中绘制值,则可以使用imagesc
进行。使用Y(:,t)=(Y(:,t-1))*phi(p)+mu+E(t) --> Y(:,t) = Y(:,t-1).*phi + mu + E(t);
进行绘图的完整代码示例:
imagesc