我创建了一个简单的python程序,它通过计算圆中1像素点的数量来计算pi。首先,我用以下值运行程序:
from tkinter import *
tk = Tk()
canvas = Canvas(tk, width=400, height=400)
canvas.pack()
canvas.create_oval(100,100,400,400)
global pi_count
pi_count = 0
for x in range(100,400):
for y in range(100,400):
point = canvas.create_oval(x,y,(x+1),(y+1))
c = canvas.coords(point)
sc = list(c)
xc = sc[1]
yc = sc[2]
fxc = int(xc)
fyc = int(yc)
dist = ((fxc - 250)**2 + (fyc - 250)**2)**0.5
if dist > 150:
print("outside of the circle")
else:
pi_count += 1
print(pi_count)
pi = (pi_count/150**2)
print(pi)
这给了我3.141288889的输出。你知道吗
对这个结果比较满意,我把椭圆尺寸改为
(100,100,500,500)
并相应地更改所有其他值(半径、循环等)。你知道吗
然而,这个更大的圆和可能更精确的区域产生了更不准确的估计值3.140675。你知道吗
为什么会这样,我如何修复计算器以给出更准确的估计?你知道吗
编辑
以下是经过编辑和改进的代码,更易于测试:
from tkinter import *
MIN_POS = 100
MAX_POS = 300
center = (MAX_POS + MIN_POS)/2
radius = (MAX_POS - MIN_POS)/2
tk = Tk()
canvas = Canvas(tk, width=MAX_POS, height=MAX_POS)
canvas.pack()
canvas.create_oval(MIN_POS,MIN_POS,MAX_POS,MAX_POS)
global pi_count
pi_count = 0
for x in range(MIN_POS,MAX_POS):
for y in range(MIN_POS,MAX_POS):
point = canvas.create_oval(x,y,(x+1),(y+1))
c = canvas.coords(point)
sc = list(c)
xc = sc[1]
yc = sc[2]
fxc = int(xc)
fyc = int(yc)
dist = ((fxc - center)**2 + (fyc - center)**2)**0.5
if dist > radius:
print("outside of the circle")
else:
pi_count += 1
print(pi_count)
pi = (pi_count/radius**2)
print(pi)
如果任何一个拥有快速计算机的人都能运行这个程序,并且Max_pos
以100步的步长递增,我将不胜感激。你知道吗
这种方法很不准确。测试一个半径的结果可能比1个或多个半径的结果准确得多或少:
原因是您只测试积分值,所以这些值趋向于四舍五入。虽然增加半径确实可以提高精度,但在越过Python浮点精度本身的限制之前,不可能用足够的小数得到π–我不知道半径需要有多大。你知道吗
对于您的值150,测试149和151也显示两者都不是“更好”;两者都差得多!你知道吗
即使对于非常大的半径,例如10000,您仍然可以得到3.141591~0.999999(这需要一段时间来计算)。你知道吗
使用以下代码进行测试(不使用图形显示)。注意你的代码中有一个小错误,这也会影响结果!您可以运行一个从} to less than ^{} 运行的。这意味着你在计算
(100,400)
到(0,300)
的范围,也可以编写这个范围。减去半径,就得到了(-150,150)
——但是Python的range
函数是从^{-150..-1
,然后是0
,然后是1..149
,左边有一个小偏差。你知道吗(然而,考虑到这一点并不能明显提高准确性。)
相关问题 更多 >
编程相关推荐