为了账号安全,请及时绑定邮箱和手机立即绑定

球体上两点之间平均距离预期值的偏差

球体上两点之间平均距离预期值的偏差

慕桂英4014372 2022-12-20 13:55:34
我试图通过取多个随机案例的平均值来验证各种 3-D 和 2-D 结构中两点之间的平均距离。几乎一直以来,除了球体表面上的点外,我都获得了相当不错的准确度。我的代码使用受此答案启发的高斯分布(请参阅第二个投票最多的答案)这是蟒蛇代码:import math as mfrom random import uniform as usum = 0for i in range(10000):    x1 = u(-1, 1)    y1 = u(-1, 1)    x2 = u(-1, 1)    y2 = u(-1, 1)    z1 = u(-1, 1)    z2 = u(-1, 1)    if x1 == y1 == z1 == 0:        sum += m.sqrt((x2) ** 2 + (y2) ** 2 + (z2) ** 2)    elif x2 == y2 == z2 == 0:        sum += m.sqrt((x1) ** 2 + (y1) ** 2 + (z1) ** 2)    else:        x1 /= m.sqrt(x1 ** 2 + y1 ** 2 + z1 ** 2)        y1 /= m.sqrt(x1 ** 2 + y1 ** 2 + z1 ** 2)        z1 /= m.sqrt(x1 ** 2 + y1 ** 2 + z1 ** 2)        x2 /= m.sqrt(x2 ** 2 + y2 ** 2 + z2 ** 2)        y2 /= m.sqrt(x2 ** 2 + y2 ** 2 + z2 ** 2)        z2 /= m.sqrt(x2 ** 2 + y2 ** 2 + z2 ** 2)        sum += m.sqrt((x1 - x2) ** 2 + (y1 - y2) ** 2 + (z1-z2) ** 2)print(sum/10000)预期值为 4/3,此处显示可以说绝对差别不是很大。但在任何运行中,与预期值的百分比偏差都在 1% 左右。另一方面,在具有其他形状和相同数量随机案例的所有其他类似程序中,百分比偏差平均约为 0.05%。此外,代码返回的值始终小于 4/3。这是我最关心的问题。我的猜测是我以错误的方式实现了算法。任何帮助表示赞赏。
查看完整描述

2 回答

?
繁星点点滴滴

TA贡献1803条经验 获得超3个赞

两个点的初始随机值包含在立方体中,而不是球体中。在按 1/length 缩放每个矢量后,矢量位于单位球体上,但它们在球体表面上分布不均匀。


与每个面的中心相比,您往往会在立方体的角附近获得更多矢量。由于向量倾向于聚集在区域中,因此它们之间的距离平均值小于 4/3。


这将达到目的: https ://mathworld.wolfram.com/SpherePointPicking.html


此代码对我有用:


from math import sqrt

from random import uniform



sum2 = 0

size = 0

while size < 100000:

    x1 = uniform(-1, 1)

    y1 = uniform(-1, 1)

    x2 = uniform(-1, 1)

    y2 = uniform(-1, 1)

    z1 = uniform(-1, 1)

    z2 = uniform(-1, 1)


    r1 = sqrt(x1**2 + y1**2 + z1**2)

    r2 = sqrt(x2**2 + y2**2 + z2**2)

    if r1 > 1 or r2 > 1 or x1==y1==z1==0 or x2==y2==z2==0: continue

    size += 1

    x1 /= r1

    y1 /= r1

    z1 /= r1

    x2 /= r2

    y2 /= r2

    z2 /= r2

    sum2 += sqrt((x1 - x2) ** 2 + (y1 - y2) ** 2 + (z1 - z2) ** 2)

print(sum2/size)

输出是:


1.3337880809331075


查看完整回答
反对 回复 2022-12-20
?
HUH函数

TA贡献1836条经验 获得超4个赞

正如所解释的那样,这个小型 MC 模拟的随机抽样没有以正确的方式进行。

您想要提取均匀分布在球体表面的随机点。最简单的方法是使用极坐标并随机选择角度 theta(0-pi)和 phi(0-2pi)。

如果你想保持笛卡尔坐标,你必须使用已知的变换矩阵将你的分布从笛卡尔坐标系转换为 3-d 极坐标系。


查看完整回答
反对 回复 2022-12-20
  • 2 回答
  • 0 关注
  • 82 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信