问题描述
|
在平面(二维)中,路径可以由(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}
]
]