Как применить диапазон параметров к диапазону функций в MATLAB? - PullRequest
0 голосов
/ 05 октября 2018

Я пытаюсь сгенерировать некоторые данные временных рядов, используя MATLAB, с помощью модели, которая выглядит следующим образом:

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

Где ph и 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 range (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 для каждого значения« p »в phi», поэтому он должен выводить 100 Y для каждого p.

Однако, я получаю только ошибки измерения, и один раз, пока возлюсь с работой, но я только что получил одну длинную матрицу 100 * 100нули и первое значение как правильный результат.Я пытаюсь построить каждый набор Y, чтобы визуализировать влияние фи на модель, но сейчас я сгорел.Есть идеи?Заранее спасибо.

Редактировать: Благодаря 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 голосов
/ 05 октября 2018

Ты почти у цели.В вашем блоке кода:

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 строк Y с определенным значениемиз phi, верно?

Далее вы объявляете p длиной 9 значений, поэтому phi(p) также будет содержать 9 значений.Y(:,t-1) для любого t содержит 10 значений.Это означает, что это оба вектора, и когда вы выполняете умножения с двумя векторами, вы должны быть осторожны с тем, какие операторы используете.Когда Matlab видит умноженные два вектора, он пытается выполнить умножение вектора , чего он не может сделать в этом случае по двум причинам:

  • Y(:,t-1) имеет длину 10тогда как phi(p) имеет длину 9. Вот почему вы, вероятно, получаете ошибку несоответствия размеров.
  • Y(:,t-1) - это вектор столбца, как и phi(p) в вашем случае.Умножение вектора на два вектора столбца не определено.

Вместо этого вам нужно умножить каждое значение на Y(:,t-1) на значение с тем же индексом в phi, что вы делаете, используя поэлементное умножение с .*:

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');
...