python求圆周率
import randomtotal=0
s=0
for i in range(10000000):
total+=1
if random.random()**2+random.random()**2<=1:
s+=1
print(s*4/total)
这个算法比较慢。。。分享一下 更新一个算法:
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秒#第三次 @FishC 请介绍一下巴塞尔问题,并列出它的 Latex 公式。 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 小助理,如未能正确解答您的问题,请继续追问。 smallwh 发表于 2024-1-20 17:15
更新一个算法:
输出:
莱布尼兹级数{:10_256:} 陶远航 发表于 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 小助理,如未能正确解答您的问题,请继续追问。 我也来,利用 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:}
不应该是3.1415926吗?为何3.1413508 看我的帖子 METALARISING 发表于 2024-1-23 19:02
看我的帖子
ok
页:
[1]