改进montecarlo程序,在高维空间中求球体的体积。(PYTHON)

改进montecarlo程序,在高维空间中求球体的体积。(PYTHON),python,Python,考虑高斯形状,我们可以求出球体的n维体积。我的目的是用蒙特卡罗方法求体积 利用高斯积分,我找到了公式 据我所知,n维球体内的点与点总数之比,与球体体积与立方体体积之比大致相同。我的意思是质量密度永远不会改变,不管我用什么尺寸 因此,我假设我应该遵循与使用蒙特卡罗方法求pi值相同的技术 我不明白如何遵循我计算的代码来找到pi的值 import random TIMES_TO_REPEAT = 10**5 LENGTH = 10**5 def in_circle(x, y): retu

考虑高斯形状,我们可以求出球体的n维体积。我的目的是用蒙特卡罗方法求体积

利用高斯积分,我找到了公式

据我所知,n维球体内的点与点总数之比,与球体体积与立方体体积之比大致相同。我的意思是质量密度永远不会改变,不管我用什么尺寸

因此,我假设我应该遵循与使用蒙特卡罗方法求pi值相同的技术

我不明白如何遵循我计算的代码来找到pi的值

import random

TIMES_TO_REPEAT = 10**5
LENGTH = 10**5

def in_circle(x, y):
    return x**2 + y**2 < LENGTH**2

inside_count = 0
for _ in range(TIMES_TO_REPEAT):
    point = random.randint(0,LENGTH), random.randint(0,LENGTH)
    if in_circle(*point):
        inside_count += 1

pi = (inside_count / TIMES_TO_REPEAT) * 4

print(pi) 
随机导入
重复次数=10*5
长度=10*5
圆(x,y)中的定义:
返回x**2+y**2<长度**2
内部计数=0
对于范围内的(重复次数):
点=random.randint(0,长度),random.randint(0,长度)
如果在圆内(*点):
内部计数+=1
pi=(内部计数/重复次数)*4
打印(pi)

我如何在我提到的代码中应用不等式条件,使质量密度相同,我可以在更高的维度中找到体积值?

基本思想:如果一个圆(半径R)内接在一个正方形内(那么,它的边必须是2R),那么比率(圆的面积与正方形的面积之比)将是π/4。因此,如果你在正方形内随机选取N个点,大约N*π/4个点应该落在圆内

希望注释/修订的代码能帮助您理解MC逻辑

import random

N = 10**5 # number of trials (ie, number of points to sample)
R = 10**5 # circle radius

# whether p(x,y) is inside a circle
def in_circle(x, y):
    return x**2 + y**2 < R**2

# use integer ops as much as possible for speed
c = 0
for i in range(N):
    x, y = random.randint(0,R), random.randint(0,R)
    if in_circle(x, y):
        c += 1

pi = 4 * c / N
print(pi) # pi-> 3.14
随机导入
N=10**5试验次数(即样本点数)
R=10**5#圆半径
#p(x,y)是否在圆内
圆(x,y)中的定义:
返回x**2+y**23.14
随机导入
N=10**5试验次数(即样本点数)
R=10**5#圆半径
def在球面上(x,y,z):
返回x**2+y**2+z**2
“你能帮我建立代码吗”这个问题对这个网站来说太宽泛了。你需要试着自己去做,然后,如果必要的话,就你遇到的特定问题问一个特定的问题。我知道我需要适应同样的策略,我也尝试过这样做,但我犯了错误。我想如果有人能在第四维度或第五维度上做到这一点,我也能以同样的方式做到。我已经用另一种方法计算了体积,但我对蒙特卡罗方法不太熟悉。要扩展到更高的维度,只需更改内部电路即可。例如,对于3d,它将在_球体(x,y,z)中。您可以更改第四维的代码并找到体积吗?我理解你的代码,因为我在问题中也提到了它?你需要计算出更高维度的公式。这不是Python的问题,亲爱的Ancora谢谢你的回答。我想用更高的维度来计算体积,而不是用蒙特卡罗方法计算圆周率。正如我所说,这不是一个Python问题,而是一个数学问题。你真的在问这个问题吗:
import random

N = 10**5 # number of trials (ie, number of points to sample)
R = 10**5 # circle radius

def in_sphere(x, y, z):
    return x**2 + y**2 + z**2 < R**2

c = 0
for _ in range(N):
    p = random.randint(0,R), random.randint(0,R), random.randint(0,R)
    if in_sphere(*p):
        c += 1

pi = 6 * c / N
print(pi)