如何在Mathematica中随机漫步?

时间:2011-05-26 20:25:37

标签: wolfram-mathematica plot physics

在平面(二维)中,路径可以由(n + 1)个点(Xo,Yo),(X1,Y1),...,(Xn,Yn)的序列表示,使得,对于任何i(整数1< i< n-1):

Pi(vector) = [Xi-X(i-1),Yi-Y(i-1)]
表示第i步的

是具有长度Pi的矢量,并且通过转角α代数地(不知道如何)测量矢量Pi和P(i + 1)之间的方向变化的值。 (ⅰ)。

像任何角度分布(方向变化)一样,它的特征在于平均向量,该平均向量被认为是对称的并且具有角平均值Φ= o。这种分析的方法涉及数值模拟,因为代数方法似乎太复杂,我必须使用伪随机高斯发生器从正态分布获得连续值,平均值为0,标准偏差σ(0.1- 1.2)弧度来模拟路径。

因此,在每个长度为P(恒定,即125km)的步骤之后,对于给定的σ值,由伪随机生成器确定方向变化的值(转向角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弧度范围内,连续步骤之间的方向变化分布和在Mathematica中绘制它?我对Mathematica一无所知,特别是如何为这个问题编写代码。

3 个答案:

答案 0 :(得分:8)

根据问题中的符号,使用独立的法线增量来构建角度,然后将其用作下一步大小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

<小时/> 编辑:这是对G. Xara关于罗宾逊投射球体的随机游走可视化请求的回应。

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

答案 1 :(得分:5)

Sasha的答案是要走的路,但是当你开始使用Mma时,也许程序性程序更容易理解。
请注意,我并不是说这是在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

答案 2 :(得分:5)

以下代码以不同的颜色绘制您的12个家庭,如果您将鼠标悬停在一条线上,则会在工具提示中获得sigma。

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