在平面(二维)中,路径可以由(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一无所知,特别是如何为这个问题编写代码。
答案 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]]]]]]
]]
<小时/> 编辑:这是对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
答案 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}]
答案 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}
]
]