2015-01-22 3 views
0

Существует двумерное случайное блуждание, в котором можно найти here, который отлично работает в Octave. Однако, когда я попытался написать одномерную программу случайного блуждания, у меня появилась ошибка. Вот программа:Почему одномерный вариант 2-го случайного блуждания не работает?

t=[]; 
x=[]; 
for i=1:100000 
    J=rand; 
    if J<0.5 
     x(i+1)=x(i)+1; 
     t(i+1)=t(i)+1; 
    else 
     x(i+1)=x(i)-1; 
     t(i+1)=t(i)+1; 
    end 
end 

plot(t,x) 

Здесь ошибка:

error: A(I): index out of bounds; value 1 out of bound 0

Спасибо.

ответ

4

Нет необходимости в цикле:

N = 100000; 
t = 1:N; 
x = cumsum(2*(rand(1,N)<.5)-1); 
plot(t,x) 

enter image description here

Для 2D-футляра вы можете использовать одинаковый подход:

N = 100000; 
%// t = 1:N; it won't be used in the plot, so not needed 
x = cumsum(2*(rand(1,N)<.5)-1); 
y = cumsum(2*(rand(1,N)<.5)-1); 
plot(x,y) 
axis square 

enter image description here

+0

Хорошая точка .... – Rashid

+1

cumsum действительно эффективен для этого. Я вижу только крошечное предостережение в этом ответе, оно начинается с -1 или +1. Конечно, это можно легко исправить, добавив 0 в начале, если это необходимо. –

+0

@ yoh.lej Вы правы. Но тогда, в OP-коде, даже не определено, какое начальное значение 'x' должно быть –

2

Вы получите ошибку, потому что вы просите MATLAB использовать x(1) в первой итерации, когда вы на самом деле определяется x быть длины 0. Таким образом, вам нужно либо инициализировать x и t с соответствующим размером:

x=zeros(1,100001); 
t=zeros(1,100001); 

или изменить свой цикл, чтобы добавить новые значения в конце векторов:

x(i+1)=[x(i) x(i)+1]; 
+0

хорошие предложения, но ваш ответ не объясняет источник ошибки Ора в: 'х (1)' был использован, но неопределенные – horchler

+0

Спасибо за замечание, я редактировал ответ соответственно. –

+0

@ yoh.lej Спасибо за ответ! +1. Но два вопроса: 1. Почему первая программа работала, несмотря на то, что вы не сделали это правильно? 2. Почему он все еще не работает? Попробуй; Я получаю ту же ошибку. –

1

с т и х пусто, поэтому вы можете не индексировать их через х (я + 1) и х (я). Я считаю, что вы должны инициализировать x и t со всеми нулями.

1

На первой итерации i = 1 у вас есть x(2) = x(1) +or- 1, в то время как x имеет размерность нуля. Вы должны определить начальную точку для x и t, которые, как правило, происхождение, вы можете также изменить код немного,

x = 0; 
N = 100000; 
t = 0 : N; 
for i = 1 : N 
    x(i+1) = x(i) + 2 * round(rand) - 1; 
end 
plot(t,x) 
Смежные вопросы