陶远航 发表于 2024-1-20 14:38:00

python求圆周率

import random
total=0
s=0
for i in range(10000000):
    total+=1
    if random.random()**2+random.random()**2<=1:
      s+=1

      
print(s*4/total)

这个算法比较慢。。。分享一下

smallwh 发表于 2024-1-20 17:15:23

更新一个算法:
import time#计算时间
begin = time.time()#计算时间

total = 0
for i in range(1,10000001):
    total += 6 / i**2
print(total**0.5)

end = time.time()#计算时间
print('耗时{}秒'.format(end-begin))#计算时间
输出:
3.1415925580960824
耗时4.505257606506348秒#第一次
3.1415925580960824
耗时4.288244962692261秒#第二次
3.1415925580960824
耗时4.403252124786377秒#第三次

比使用随机数算法效率和准确度都有提升。
随机数算法结果:
3.1403284
耗时9.002515077590942秒#第一次
3.1422596
耗时9.11052131652832秒#第二次
3.1414164
耗时9.7035551071167秒#第三次

smallwh 发表于 2024-1-20 17:25:43

@FishC 请介绍一下巴塞尔问题,并列出它的 Latex 公式。

FishC 发表于 2024-1-20 17:26:22

smallwh 发表于 2024-01-20 17:25
@FishC 请介绍一下巴塞尔问题,并列出它的 Latex 公式 ...

巴塞尔问题是一个数学问题,源于瑞士数学家巴塞尔(Basel)在17世纪解决的。问题的核心是:求解无穷级数

$$
\sum_{n=1}^{\infty} \frac{1}{n^2} = \frac{1}{1^2} + \frac{1}{2^2} + \frac{1}{3^2} + ...
$$

巴塞尔问题的精确解为 $\frac{\pi^2}{6}$,这个结果非常有趣,因为它将无穷级数与圆周率 $\pi$ 相关联。

在编程中,可以使用循环来逐项累加计算这个无穷级数。下面是一个Python的例子:

result = 0
for n in range(1, int(1e6)):
    result += 1 / (n ** 2)
print(result)

上述代码中,我们设置了一个很大的循环次数 `1e6`,以保证结果的精度。当然,实际上只需要计算到一定的精度即可,比如达到某个小于阈值的误差范围。不过对于巴塞尔问题来说,由于级数收敛得非常快,所以较小的循环次数就能得到非常接近于真实解的结果。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。

陶远航 发表于 2024-1-20 17:26:39

smallwh 发表于 2024-1-20 17:15
更新一个算法:

输出:


莱布尼兹级数{:10_256:}

FishC 发表于 2024-1-20 17:27:11

陶远航 发表于 2024-01-20 17:26
莱布尼兹级数{:10_256:}

莱布尼兹级数是一个关于圆周率的级数,它可以用来近似计算圆周率。莱布尼兹级数的公式如下:

$$\frac{\pi}{4} = 1 - \frac{1}{3} + \frac{1}{5} - \frac{1}{7} + \frac{1}{9} - \frac{1}{11} + ...$$

可以看到,莱布尼兹级数是一个交替求和的级数。根据这个公式,我们可以编写一个程序来计算莱布尼兹级数,从而得到一个近似的圆周率值。

result = 0
sign = 1

for i in range(1, 1000000, 2):
    result += sign * 1 / i
    sign *= -1

pi_approx = result * 4
print(pi_approx)

上述代码中,使用循环来逐项累加莱布尼兹级数的每一项。变量 `sign` 控制每一项的正负号,初始为 1,每次循环后取反。最后乘以 4 就得到了一个近似的圆周率值。

需要注意的是,莱布尼兹级数收敛速度相对较慢,所以要得到更精确的结果,需要计算更多的项数。在上述代码中,我们计算了前 1000000 个奇数项,可以根据需求调整这个范围。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。

小甲鱼的二师兄 发表于 2024-1-21 03:01:54

我也来,利用 BBP 求 $\pi$:

from decimal import Decimal, getcontext

def calculate_pi_decimal(precision):
    getcontext().prec = precision
    sum = Decimal(0)
    for k in range(precision):
      first_term = Decimal(1) / (16 ** k)
      sum += first_term * (Decimal(4) / (8 * k + 1) -
                           Decimal(2) / (8 * k + 4) -
                           Decimal(1) / (8 * k + 5) -
                           Decimal(1) / (8 * k + 6))
    return sum

# 设置精度并计算π
precision = 100# 计算100位小数的π
pi = calculate_pi_decimal(precision)
print(pi)
附 BBP 公式:

$\pi = \sum_{k=0}^{\infty} \left( \frac{1}{16^k} \left( \frac{4}{8k + 1} - \frac{2}{8k + 4} - \frac{1}{8k + 5} - \frac{1}{8k + 6} \right) \right)$

{:10_279:}

METALARISING 发表于 2024-1-21 20:59:53

不应该是3.1415926吗?为何3.1413508

METALARISING 发表于 2024-1-23 19:02:02

看我的帖子

陶远航 发表于 2024-1-23 19:06:02

METALARISING 发表于 2024-1-23 19:02
看我的帖子

ok
页: [1]
查看完整版本: python求圆周率