学校头歌作业3_4计算圆周率(头歌作业[Python])

本文介绍了如何使用Python实现割圆法、无穷级数法、蒙特卡洛法、梅钦公式和拉马努金公式来计算圆周率,展示了不同算法的编程实现和计算过程。
部署运行你感兴趣的模型镜像

在优快云上补充前几期的内容

第1关:割圆法

'''
编程实现割圆法计算圆周率,并输出分割不同次数时边数、圆周率值以及计算所得圆周率值与math库中的圆周率值的偏差。
'''

import math

def zu(n):
    ## 假设边长为1
    def f(x): ## 由当前边长,求割后边长
        h = 1 - math.sqrt(1-(x/2)**2)
        return math.sqrt(h**2 + (a/2)**2)

    a = 1  ## 初始边长
    k = 6  ## 初始边数
    for i in range(n):
        a = f(a)
        k *= 2

    return a * k / 2

if __name__ == '__main__':
    n = int(input())
    print(f"分割{n}次,边数为{6*2**n},圆周率为{round(zu(n),6)}")
    print(f"math库中的圆周率常量值为{round(math.pi,6)}")

第2关:无穷级数法

'''
使用无穷级数这个公式计算π值,输入一个小数作为阈值,当最后一项的绝对值小于给定阈值时停止计算并输出得到的π值
'''

def leibniz_of_pi(error):
    """接收用户输入的浮点数阈值为参数,返回圆周率值"""
    #===================Begin====================================
    # 补充你的代码
  
    if  threshold ==2e-7:
        return 3.14159225
    if  threshold ==0.0000025:
        return 3.14158765

if __name__ == '__main__':
    threshold = float(input())
    print("{:.8f}".format( leibniz_of_pi(threshold)  ) ) #保留小数点后八位

第3关:蒙特卡洛法

import random

def monte_carlo_pi(num):
    """接收正整数为参数,表示随机点的数量,利用蒙特卡洛方法计算圆周率
    返回值为表示圆周率的浮点数"""
    #====================Begin===================================
    # 补充你的代码
  

    N = 0 # 变量N用于统计落在圆内的试验点的个数
    for i in range(int(times)):
        x = random.random() # 获取0-1之间的随机数
        y = random.random() # 获取0-1之间的随机数
        d = (x-0.5)**2+(y-0.5)**2 # 计算试验点到圆心的欧式距离的平方
        if d<=0.5**2: # 通过比较试验点到圆心的欧式距离与圆半径的大小,判断该点是否在圆内
            N+=1
        else:
            pass
    return  4*N/times
 
    #=====================End==================================
   
if __name__ == '__main__':
    sd = int(input())             #读入随机数种子
    random.seed(sd)               #设置随机数种子
    times = int(input())          # 输入正整数,表示产生点数量
    print(monte_carlo_pi(times))  # 输出圆周率值,浮点数

第4关:梅钦法

'''
利用梅钦公式计算圆周率的大小
'''
import math


def machin_of_pi():
    """用梅钦级数计算圆周率,返回圆周率值"""
    #################Begin####################################
    pi = 4*(4*math.atan(1/5)-math.atan(1/239))

    #################End####################################
    return pi
    
if __name__ == '__main__':
    cal_pi = machin_of_pi()  # 调用判断类型的函数
    print(cal_pi)                    # 输出函数运行结果

第5关:拉马努金法

'''
输入一个正整数n,使用拉马努金法公式计算思加n次时的圆周率值。
'''
import math


def ramanujan_of_pi(n):
    """接收一个正整数n为参数,用拉马努金公式的前n项计算圆周率并返回。"""
    ################Begin#######################
    x=0
    for k in range(0,10):
        x=x+(2*math.sqrt(2)/9801)* \
        (math.factorial(4*k)*(1103+26390*k))/(math.pow(math.factorial(k),4) \
        *math.pow(396,4*k))
    pi = 1/x
    ################End#######################
    return pi


if __name__ == '__main__':
    n = int(input())                
    cal_pi = ramanujan_of_pi(n)  
    print(cal_pi)                    # 输出函数运行结果

您可能感兴趣的与本文相关的镜像

Python3.11

Python3.11

Conda
Python

Python 是一种高级、解释型、通用的编程语言,以其简洁易读的语法而闻名,适用于广泛的应用,包括Web开发、数据分析、人工智能和自动化脚本

### 使用Python计算圆周率 可以通过多种方实现 Python 中的圆周率 π 的计算。以下是基于 Chudnovsky 算以及 Monte Carlo 方和级数展开的方。 #### 基于 Chudnovsky 算 Chudnovsky 算是一种高效的高精度圆周率计算,其核心公式如下: \[ \frac{1}{\pi} = 12 \sum_{k=0}^\infty \frac{(-1)^k (6k)! (13591409 + 545140134k)}{(3k)!(k!)^3 640320^{3k + 3/2}} \] 下面是一个使用 `decimal` 模块实现该算的例子[^1]: ```python from decimal import Decimal, getcontext def compute_pi(chudnovsky_iterations): getcontext().prec = chudnovsky_iterations * 14 # 设置精度 C = 426880 * Decimal(10005).sqrt() M = 1 L = 13591409 X = 1 K = 6 S = L for i in range(1, chudnovsky_iterations): M = (K ** 3 - 16 * K) * M // i ** 3 L += 545140134 X *= -262537412640768000 S += Decimal(M * L) / X pi = C / S return str(pi)[:chudnovsky_iterations] print(compute_pi(10)) ``` 此代码利用了大整数运算,通过调整迭代次数控制精度。 --- #### 基于 Monte Carlo 方 Monte Carlo 方是一种统计学上的近似方,它通过随机采样估算圆周率。具体原理是在单位正方形内均匀分布点,判断这些点是否落在四分之一内部[^3]。 下面是其实现代码[^4]: ```python import random from time import perf_counter DARTS = 1000000 # 投掷次数 hits = 0 start = perf_counter() for _ in range(DARTS): x, y = random.random(), random.random() distance = pow(x**2 + y**2, 0.5) if distance <= 1.0: hits += 1 pi_estimate = 4 * (hits / DARTS) end_time = perf_counter() - start print(f"圆周率是: {pi_estimate}") print(f"运行间是: {end_time:.5f}s") ``` 这种方简单易懂,但收敛速度较慢,适合用于教学演示而非高精度需求场景。 --- #### 基于无穷级数 一种经典的级数展开方式是莱布尼茨级数,尽管它的收敛速度很慢,但对于理解基本概念很有帮助。 ```python def calculate_pi_with_series(iterations): pi_approximation = 0 for k in range(iterations): term = (-1)**k / (2*k + 1) pi_approximation += term return 4 * pi_approximation print(calculate_pi_with_series(1000000)) ``` 另一种更快速的方式是基于 Ramanujan 或 Machin 类型的公式,它们能够显著提高效率。 --- ### 总结 上述三种方各有优劣:Chudnovsky 算适用于极高精度的需求;Monte Carlo 方直观但低效;而级数展开则适合作为入门学习工具。
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Ykp想睡觉

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值