如何将一系列参数应用于 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)
其中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 的输出生成的。
它非常完美,但是,现在我正在尝试使用范围为 (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);
既然您想将 Y
的 10
行中的每一行与 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');
我正在尝试使用 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 的输出生成的。
它非常完美,但是,现在我正在尝试使用范围为 (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);
既然您想将 Y
的 10
行中的每一行与 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');