【问题标题】:How do I apply a range of parameters to a range of functions in MATLAB?如何将一系列参数应用于 MATLAB 中的一系列函数?
【发布时间】:2019-03-10 12:14:56
【问题描述】:

我正在尝试使用 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 的输出生成。

这是完美的,但是,现在我尝试使用 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


【解决方案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

您似乎想尝试 phi 的 10 个值。首先,我怀疑您想更改这一行(左下您的版本,右下新版本):

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

既然您想将Y 的每一行10phi 的特定值相关联,对吧?

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

  • Y(:,t-1) 的长度为 10,而 phi(p) 的长度为 9。这就是您可能遇到尺寸不匹配错误的原因。
  • Y(:,t-1) 是列向量,phi(p) 在您的情况下也是如此。未定义两个列向量的向量乘法。

您想要的是将Y(:,t-1) 中的每个phi 中的同一索引处的值 相乘,您可以使用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');

【讨论】:

  • 谢谢,这正是我所需要的。我最终修改了绘图部分以获得我需要的部分,并且我还修改了它以获得 100 个 phi 值而不是 10。我正在更新我的问题以显示结果。
猜你喜欢
  • 1970-01-01
  • 2019-04-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-05-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多