【发布时间】:2019-03-10 12:14:56
【问题描述】:
我正在尝试使用 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 作为种子,然后(接下来的 19 个值)根据最后一个 Y 的输出生成。
这是完美的,但是,现在我尝试使用 phi 范围 (0,1) 的不同值来应用完全相同的算法。 我想出了这个:
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
根据我的逻辑是这样说的:
'将生成单个集合 Y 的相同算法应用于 phi' 的每个值“p”,因此它应该为每个 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
【问题讨论】:
-
这是(一大块)我尝试过的事情之一,但它很丑,很耗时,而且我认为这不是最好的方法。为此,我使用了 phi=[0.9 0.6] 和 mu=[2 3],因此变量名:Y209(1)=phi(1)*mu(1)+mu(1)+E(1); Y206(1)=phi(2)*mu(1)+mu(1)+E(1); Y309(1)=phi(1)*mu(2)+mu(2)+E(1); Y306(1)=phi(2)*mu(2)+mu(2)+E(1);对于 t=linspace(2,100,99) Y209(t)=(Y209(t-1))*phi(1)+mu(1)+E(t); Y206(t)=(Y206(t-1))*phi(2)+mu(1)+E(t); Y309(t)=(Y309(t-1))*phi(1)+mu(2)+E(t); Y306(t)=(Y306(t-1))*phi(2)+mu(2)+E(t);结束;情节(Y209);坚持;情节(Y206);情节(Y309);情节(Y306);
-
我认为首先你不需要索引的 p 向量,只需乘以 phi。 (也在 Y 的初始化中)。
-
你知道*和.*的区别吗?
-
我想我没有,但不知何故决定忽略它。现在我明白了。谢谢
标签: matlab matrix time-series octave