Wolfram mathematica 如何在Mathematica中编写随机行走程序?

Wolfram mathematica 如何在Mathematica中编写随机行走程序?,wolfram-mathematica,plot,physics,Wolfram Mathematica,Plot,Physics,在平面(二维)中,路径可以由(n+1)点序列(Xo,Yo),(X1,Y1),…,(Xn,Yn)表示,对于任何i(整数1

在平面(二维)中,路径可以由(n+1)点序列(Xo,Yo),(X1,Y1),…,(Xn,Yn)表示,对于任何i(整数1 表示第i步的是一个长度为Pi的向量,向量Pi和p(i+1)之间的方向变化值通过旋转角度a(i)以代数方式(不知道如何)测量

与任何角度分布(方向变化)一样,其特征是平均向量对称,且角度平均Φ=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一无所知,尤其不知道如何编写这个问题的代码。

按照问题中的符号,使用独立的法线增量来构建角度,然后将其用作下一步的方向

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]]]]
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}]]
用于获得下一个
{\[Theta],\[Phi}
对的公式如下:

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]]]]
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}]]
也就是说,在[Theta]中执行固定大小的旋转,然后以随机角度围绕前一个向量旋转
\[Alpha]

用法:

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

萨沙的答案是正确的,但随着你从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}]
P=1;
对于[iter=1,iter<13,iter++,
西格玛=iter/10;
a=随机变量[正态分布[0,sigma],500];
清晰[θ,x];
θ[i_]:=θ[i]=θ[i-1]+a[[i]];
x[i_]:=x[i]=x[i-1]+P{Cos[theta[i]],Sin[theta[i]};
θ[0]=RandomReal[{0,2pi}];
x[0]={0,0};
对于[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}
  ]
 ]

欢迎来到stackoverflow G.Xara!别忘了投票支持答案下面是你喜欢的,如果其中一位对你的问题的回答令你满意,请使用答案旁边的复选标记接受。你可以随时更改选择。顺便说一句,如果这是家庭作业,你应该添加“家庭作业”标签。哦,顺便说一句,StackOverflow的我们是一群非常好的人文章中不需要任何细节(没有问候语或问候语)。这都是暗示。即使你不使用它们,我们仍然喜欢你,因此我冒昧地将它们从你的文章中删除(另请参阅“常见问题解答”部分的标语)。正如贝里萨里乌斯指出的,Mathematica允许你以各种编程风格编写。他的例子是以过程式风格编写的(类似于C/pascal/fortran),我的是函数式编程风格(参见,例如,和该页上链接的教程)。
NestList
是函数式编程的一个元素,而“纯”函数(上面的#和&)的使用是另一个元素(参见)。
随机变量
在mma7中没有定义。是的,不是很烦人?;-)在这种情况下,将
randomdariate
替换为
randomdreal
将使此示例适用于mma7。但实际上,W先生,你应该升级。@Sjoerd Luddites本可以拯救世界免于失业。我认为@Mr.拒绝升级是对进步的抗议:D@Mr.Wiz@belisarius LOL.与此同时,Daniel Lichtblau开始散布关于版本9()的谣言.
randomdariate
未在mma7中定义。@Mr.Wizard您可以将
randomdariate
替换为
randomdreal
。它将对正态变量生成起到相同的作用。
randomdariate
还处理可能是离散的但不是整数的分布,或者是混合类型的,即既不是连续的,也不是离散的,比如指数和几何的混合成分。@G.Xara你的意思是在半径为0.5的球体上投影2D图形吗?对地图有什么偏好吗?你会满足于赤平投影吗?还是你从一开始就对球体上的随机行走感兴趣?谢谢你Belisarius!我发现你的答案非常有趣lpful!@G.Xara但请记住,Mma不是程序编程的好去处。请尽快切换到functional。