鱼C论坛

 找回密码
 立即注册
查看: 1187|回复: 9

[技术交流] python求圆周率

[复制链接]
发表于 2024-1-20 14:38:00 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
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)

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

本帖被以下淘专辑推荐:

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 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秒#第三次

评分

参与人数 1荣誉 +3 鱼币 +5 贡献 +3 收起 理由
陶远航 + 3 + 5 + 3 鱼C有你更精彩^_^

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-1-20 17:25:43 | 显示全部楼层
@FishC 请介绍一下巴塞尔问题,并列出它的 Latex 公式。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 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 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

 楼主| 发表于 2024-1-20 17:26:39 | 显示全部楼层
smallwh 发表于 2024-1-20 17:15
更新一个算法:

输出:

莱布尼兹级数
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-1-20 17:27:11 | 显示全部楼层


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

$$\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 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 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)$



评分

参与人数 1荣誉 +5 鱼币 +5 贡献 +3 收起 理由
陶远航 + 5 + 5 + 3 鱼C有你更精彩^_^

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-1-21 20:59:53 | 显示全部楼层
不应该是3.1415926吗?为何3.1413508
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-1-23 19:02:02 | 显示全部楼层
看我的帖子
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-1-23 19:06:02 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-12-23 21:06

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表