Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 我希望通过蒙特卡罗模拟找到Pi。但不知何故,我迷失了自己的代码_Python_Python 3.x_Numpy_Data Science_Montecarlo - Fatal编程技术网

Python 我希望通过蒙特卡罗模拟找到Pi。但不知何故,我迷失了自己的代码

Python 我希望通过蒙特卡罗模拟找到Pi。但不知何故,我迷失了自己的代码,python,python-3.x,numpy,data-science,montecarlo,Python,Python 3.x,Numpy,Data Science,Montecarlo,我正在做一些在线研究和教程,当我试图用蒙特卡罗法找到圆周率的近似值时,我陷入了困境 import math import random import time import numpy as np import matplotlib.pyplot as plt random.seed(1234) old_est = 0 n = 1 MC_N= 1000000 results = np.repeat(0, MC_N) for i in range(MC_N): x = random.

我正在做一些在线研究和教程,当我试图用蒙特卡罗法找到圆周率的近似值时,我陷入了困境

import math
import random
import time
import numpy as np
import matplotlib.pyplot as plt

random.seed(1234) 
old_est = 0
n = 1
MC_N= 1000000
results = np.repeat(0, MC_N)

for i in range(MC_N):
    x = random.random() 
    y = random.random()
    A_n = math.sqrt(x*2 + y*2)
    new_est = ((n-1)/n) * old_est + (1/n)*A_n
    results[n] = new_est
    if A_n <= 1:
        n +=1
    if n > MC_N:
        break
    old_est = new_est
    A_n = 4 * n / MC_N
print(results)
plt.plot(results)
plt.ylabel('numbers')
plt.show()
导入数学
随机输入
导入时间
将numpy作为np导入
将matplotlib.pyplot作为plt导入
随机种子(1234)
old_est=0
n=1
MC_N=1000000
结果=np。重复(0,MC\N)
对于范围内的i(MC_N):
x=random.random()
y=random.random()
A_n=math.sqrt(x*2+y*2)
新测试=(n-1)/n)*旧测试+(1/n)*A\n
结果[n]=新测试
如果一个MC\n:
打破
旧的=新的
A\n=4*n/MC\n
打印(结果)
plt.绘图(结果)
plt.ylabel('数字')
plt.show()
因此,我使用蒙特卡罗方法,并希望有一个早期停止方法,以获得最佳估计。 我想大概是3.14分,但我得到了0分 有人能帮我解释为什么我错了吗


PS:它应该是计算圆周率的近似数,为了估计圆周率的值,我们需要平方的面积和圆的面积。为了找到这些区域,我们将随机在表面上放置点,并计算落在圆圈内的点和落在正方形内的点。这将为我们提供他们的估计面积。因此,我们将使用点数作为面积,而不是使用实际面积。此外,我还想说明,随着迭代次数的增加,估计误差也呈指数下降。

以下是一种方法:

import numpy as np
import matplotlib.pyplot as plt
N = 1000000

# N random x, y points drawn uniformly from square(0,1)
x = np.random.rand(N)
y = np.random.rand(N)

# 1 if inside circle radius 1, 0 otherwise (first quadrant only)
circle_counts = (x**2 + y**2 < 1).astype(int)

# cumulative fraction of points that fall within circle region
pi_estimate = 4*circle_counts.cumsum()/np.arange(1,N+1)

# pi_estimate = array([4, 4, 4, ..., 3.14215828, 3.14215914, 3.14216])

plt.plot(x=np.arange(1,N+1), y=pi_estimate)
plt.show()
将numpy导入为np
将matplotlib.pyplot作为plt导入
N=1000000
#N个从正方形(0,1)均匀绘制的随机x、y点
x=np.random.rand(N)
y=np.random.rand(N)
#如果内圆半径为1,则为1,否则为0(仅第一象限)
圆圈计数=(x**2+y**2<1)。A类型(int)
#落在圆区域内的点的累积分数
pi_estimate=4*circle_counts.cumsum()/np.arange(1,N+1)
#pi_估计=数组([4,4,4,…,3.14215828,3.14215914,3.14216])
plt.plot(x=np.arange(1,N+1),y=pi_估计)
plt.show()
我在维基上查到了:似乎你的算法非常不同,尤其是行
new_est=((n-1)/n)*old_est+(1/n)*A_n
。我不确定这是否是您想要的:

导入数学
随机输入
导入时间
将numpy作为np导入
将matplotlib.pyplot作为plt导入
随机种子(1234)
MC_N=100
结果=[]
est=0
对于范围内的i(1,MC\N):
x=random.random()
y=random.random()
A_n=math.sqrt(x**2+y**2)#不是x*2+y*2
如果A_n<1:
est+=1
结果。追加(4*est/MC\N)
打印(结果)
plt.绘图(结果)
plt.ylabel('数字')
plt.show()

算法应该如何工作?你没有给任何东西贴上PI或phi的标签??你只是在计算圆和方的点数吗?你的变量代表什么?这不是问题。你应该逐步检查你的代码,看看发生了什么。基本调试是您的责任,而不是我们的责任。