如何在Mathematica中编程随机游走?

问题描述

| 在平面(二维)中,路径可以由(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(i)代数(不知道如何)测量的)。 像任何(方向变化的)角度分布一样,它的特征在于平均矢量,该矢量被认为是对称的并且具有角度均值Φ= o。这种分析方法涉及数值模拟,因为代数方法似乎太复杂了,我必须使用伪随机高斯生成器来从均值为0和标准偏差σ(0.1- 1.2)弧度模拟路径。 因此,在每一步的长度为P(恒定,即125 km)之后,方向变化的值(转弯角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一无所知,特别是如何编写此问题的代码。     

解决方法

按照问题中的表示法,您可以使用独立的法线增量构建角度,然后将其用作尺寸为
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]]]]]]
 ]]
编辑:这是对G. Xara的要求的可视化,该要求是将Robinson球体投影上的随机游走可视化。
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]],Cos[\\[Theta]]} /. {\\[Theta] -> \\[Theta] + \\[CapitalDelta]\\
\\[Theta]}))) /. {Conjugate -> Identity} /. {Abs[x_]^2 :> x^2}]]
也就是说,在θ中进行固定大小的旋转,然后围绕前一个矢量旋转随机角ѭ8°。 用法:
((# - {90,0}) & /@ (SphereRandomWalk[{Pi/2,0} // N,2500,Pi*0.01]/
     Degree)) // RandomRobinsonWalk
    ,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}]
    ,以下代码以不同的颜色绘制了十二个族,如果将鼠标悬停在一行上,则会在工具提示中显示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}
  ]
 ]
    

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...