Как я могу запрограммировать случайную прогулку в Mathematica? - PullRequest
7 голосов
/ 27 мая 2011

В плоскости (двумерной) путь может быть представлен последовательностью (n + 1) точек (Xo, Yo), (X1, Y1), ..., (Xn, Yn), такой, что для любого i (целое число 1 Pi(vector) = [Xi-X(i-1),Yi-Y(i-1)] , представляющий i-й шаг, представляет собой вектор с длиной Pi, и значение изменения направления между векторами Pi и P (i + 1) измеряется алгебраически (не знаю как) по углу поворота a (я).

Как и любое угловое распределение (изменений направления), оно характеризуется средним вектором, который считается симметричным и имеет среднее угловое значение Φ = o. Подход к этому анализу включает численное моделирование, поскольку алгебраический подход представляется слишком сложным, и мне приходится использовать псевдослучайный гауссов генератор для получения непрерывных значений из нормального распределения со средним значением 0 и стандартным отклонением σ (0,1- 1.2) радианы для моделирования пути.

Таким образом, после каждого шага с длиной P (является постоянной, то есть 125 км), значение изменения направления (угол поворота a (i)) определяется псевдослучайным генератором для заданного значения σ, которое является постоянная вдоль пути. А затем делает шаг в следующем направлении и т. Д.

Некоторые полезные уравнения:

a(i) ~ n(0,σ)
Θ(i+1) = Θ(i) + a(i)
X(i+1) = Xi + P Cos[Θ(i+1)]
Y(i+1) = Yi + P Sin[Θ(i+1)]

где Θi представляет направление i-го шага. Направление первого этапа Θi выбирается случайным образом в соответствии с равномерным угловым распределением псевдослучайным равномерным генератором. Углы поворота записываются от -Pi до Pi

Итак, мой вопрос:

Как я могу взять, т. Е. 12 семейств по 500 шаговых дорожек, каждая из которых характеризуется заданным значением стандартного отклонения σ в диапазоне от 0,1 до 1,2 радиан, распределения изменений направления между последовательными шагами и PLOT его в Mathematica? Я ничего не знаю о Mathematica, особенно о том, как написать код для этой проблемы.

Ответы [ 3 ]

8 голосов
/ 27 мая 2011

Следуя вашим обозначениям в вопросе, вы используете независимые нормальные приращения для построения угла, а затем используете его как направление для следующего шага размера size.

Block[{size=0.5}, Graphics[
 Line[Accumulate[
   Function[x, size*{Re[x], Im[x]}, Listable][
    Exp[I Accumulate[
       RandomVariate[NormalDistribution[0, Pi/4], 10^3]]]]]]
 ]]

enter image description here


РЕДАКТИРОВАТЬ : Это ответ на просьбу Дж. Зары визуализировать случайное блуждание по проекции Робинсона на сферу.
RandomRobinsonWalk[coords_List] := 
 Show[CountryData["World", {"Shape", "Robinson"}], 
  Graphics[{Thick, Red, 
    Line[Map[ GeoGridPosition[ GeoPosition[#], "Robinson"][[1]] & , 
      coords]]}], Frame -> True]

Генерация случайного блуждания по сфере выполняется следующим образом:

Coordinates[{\[Theta]_, \[Phi]_}, {cosa_, 
    sina_}, \[CapitalDelta]\[Theta]_] := {ArcCos[
    Cos[\[CapitalDelta]\[Theta]] Cos[\[Theta]] - 
     cosa Sin[\[CapitalDelta]\[Theta]] Sin[\[Theta]]], 
   ArcTan[cosa Cos[\[Theta]] Cos[\[Phi]] Sin[\[CapitalDelta]\[Theta]] \
+ Cos[\[CapitalDelta]\[Theta]] Cos[\[Phi]] Sin[\[Theta]] + 
     sina Sin[\[CapitalDelta]\[Theta]] Sin[\[Phi]], (cosa \
Cos[\[Theta]] Sin[\[CapitalDelta]\[Theta]] + 
        Cos[\[CapitalDelta]\[Theta]] Sin[\[Theta]]) Sin[\[Phi]] - 
     Cos[\[Phi]] sina Sin[\[CapitalDelta]\[Theta]]]};

Clear[SphereRandomWalk];
SphereRandomWalk[ipos_, steps_, stepsize_, prec_: MachinePrecision] :=
 FoldList[Function[{up, cossin}, Coordinates[up, cossin, stepsize]], 
  ipos, Function[u, {Re[u], Im[u]}, Listable][
   Exp[I RandomVariate[UniformDistribution[{-Pi, Pi}], steps]]]]

Формула, используемая для получения следующей пары {\[Theta], \[Phi}, была получена следующим образом:

Expand[Simplify[((RotationMatrix[\[Alpha], {Sin[\[Theta]] Sin[\[Phi]],
          Sin[\[Theta]] Cos[\[Phi]], 
         Cos[\[Theta]]}].({Sin[\[Theta]] Sin[\[Phi]], 
          Sin[\[Theta]] Cos[\[Phi]], 
          Cos[\[Theta]]} /. {\[Theta] -> \[Theta] + \[CapitalDelta]\
\[Theta]}))) /. {Conjugate -> Identity} /. {Abs[x_]^2 :> x^2}]]

, то есть выполнить вращение фиксированного размера в [Тета], а затем повернуть вокруг предыдущего вектора на произвольный угол \[Alpha].

Использование:

((# - {90, 0}) & /@ (SphereRandomWalk[{Pi/2, 0} // N, 2500, Pi*0.01]/
     Degree)) // RandomRobinsonWalk

enter image description here

5 голосов
/ 27 мая 2011

Следующий код отображает ваши двенадцать семейств в разных цветах, и, если вы наведете указатель мыши на линию, вы увидите сигма в подсказке.

Graphics[
 Table[
  {x, y} = {0, 0};
  p = 1;
  \[Theta] = RandomReal[{-\[Pi], \[Pi]}];
  Tooltip[
   {
    Hue[\[Sigma]/1.3],
    Line[
     NestList[(\[Theta] += 
         RandomVariate[NormalDistribution[0, \[Sigma]]]; # + 
         p {Cos[\[Theta]], Sin[\[Theta]]}) &, {x, y}, 500]
     ]
    }, \[Sigma]
   ],
  {\[Sigma], 0.1, 1.2, 0.1}
  ]
 ]

enter image description here

5 голосов
/ 27 мая 2011

Ответ Саши - путь, но, поскольку вы начинаете с Mma, возможно, процедурную программу легче понять.
Пожалуйста, обратите внимание, что я НЕ говорю, что это хороший способ сделать что-то в маме.

P = 1;
For[iter = 1, iter < 13, iter++,
 sigma = iter/10;
 a = RandomVariate[NormalDistribution[0, sigma], 500];
 Clear[theta, x];
 theta[i_] := theta[i] = theta[i - 1] + a[[i]];
 x[i_] := x[i] = x[i - 1] + P {Cos[theta[i]], Sin[theta[i]]};
 theta[0] = RandomReal[{0, 2 Pi}];
 x[0] = {0, 0};
 For[step = 1, step < 500, step++,
  r[iter, step] = x[step];
  ]
 ]
Show@Table[
  ListLinePlot[Table[r[s, i], {i, 500}], PlotStyle -> ColorData[1][s],
    PlotRange -> 300 {{-1, 1}, {-1, 1}}], {s, 1, 12}]

enter image description here

...