如何在MATLAB中将一系列参数应用于一系列函数?

时间:2018-10-05 03:31:39

标签: matlab matrix time-series octave

我正在尝试使用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

产生了以下内容(正是我想要的内容;西班牙语): Phi customizing for every Y

1 个答案:

答案 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 multiplicationphi一起使用:

.*

这应该可以解决您的错误。

如果以后要在Y中绘制值,则可以使用imagesc进行。使用Y(:,t)=(Y(:,t-1))*phi(p)+mu+E(t) --> Y(:,t) = Y(:,t-1).*phi + mu + E(t); 进行绘图的完整代码示例:

imagesc