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

标签 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) 之间的方向变化值由转角 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 的方向是由伪随机均匀发生器根据均匀角分布随机选择的。从 -P​​i 到 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]]]]]]
 ]]

enter image description here

编辑 :这是对 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

enter image description here

关于wolfram-mathematica - 如何在 Mathematica 中编程随机游走?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6144613/

相关文章:

linux - 如何防止 MATLAB 打印空格和使用错误的字体?

wolfram-mathematica - Mathematica 与 PrincipalValue->True 的集成中的错误

geometry - 在 Mathematica 中将点从 4d 空间投影到 3d 空间

python - Python 中带有 4 个面板 (2 x 2) 的 Seaborn 直方图

java - 使动态物体下落 JBox2D

java - 如何让一个圆圈不停地移动?

ios - 在 SceneKit 中模拟折射

javascript - 从单个方程输出/生成一组点 - Python、JS、Matlab

memory-management - SystemCache 和 MemoryInUse - 谁能解释这种行为?

r - 在一行/网格中绘制不是使用 ggplot 创建的多个图