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

How do I apply a range of parameters to a range of functions in MATLAB?

我正在尝试使用 MATLAB 生成一些时间序列数据,借助如下所示的模型:

Y(t)=phi*Y(t-1)+mu+E(t)

其中phimu是常数,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 的输出生成的。

它非常完美,但是,现在我正在尝试使用范围为 (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

其中,根据我的逻辑是这样说的:

'Apply the same algorithm that generates a single set Y to every value "p" of phi',所以它应该为每个 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

制作这个的(正是我要找的;西班牙语):

你快到了。在您的代码块中:

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 的 10 个值。首先,我怀疑你想更改这一行(左边是你的版本,右边是新版本):

Y(:,1)=mu*phi(1)+mu+E(1);  -->  Y(:,1)=mu*phi(:)+mu+E(1);

既然您想将 Y10 行中的每一行与 phi 的特定值相关联,对吗?

接下来,您将 p 声明为 9 个值,因此 phi(p) 也将包含 9 个值。 Y(:,t-1) 对于任何 t 包含 10 个值。这意味着它们都是向量,当你做涉及两个向量的乘法时,你必须小心你使用的运算符。当 Matlab 看到两个向量相乘时,它会尝试做一个 vector multiplication,在这种情况下它不能这样做,原因有两个:

  • Y(:,t-1) 的长度为 10,而 phi(p) 的长度为 9。这就是您可能会收到尺寸不匹配错误的原因。
  • Y(:,t-1) 是一个列向量, phi(p) 在你的例子中也是。未定义两个列向量的向量乘法。

您想要的是将 Y(:,t-1) 中的每个 中同一索引 处的值相乘14=],你可以通过使用 element-wise multiplication.*:

Y(:,t)=(Y(:,t-1))*phi(p)+mu+E(t)  -->  Y(:,t) = Y(:,t-1).*phi + mu + E(t);

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

如果您想稍后绘制 Y 中的值,可以使用 imagesc 来完成。完整代码示例,使用 imagesc:

绘图
E=randn(1,100);
mu=2; phi=linspace(0.1,0.99,10)'; Y=zeros(10,100);
Y(:,1) = mu*phi + mu + E(1)
for t=(2:100);
   Y(:,t) = Y(:,t-1).*phi + mu + E(t);
end
figure(); imagesc(1:100,phi,Y); colorbar; xlabel('t-values'); ylabel('phi-values');