在平面(二维)中,路径可以由 (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) 之间的方向变化值由转角 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 一无所知,特别是如何为这个问题编写代码。
最佳答案
按照问题中的注释,您使用独立的法线增量来构建角度,然后将其用作下一步大小 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]],
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
关于wolfram-mathematica - 如何在 Mathematica 中编程随机游走?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6144613/