五个用Python计算的圆周率方法

发表于:2023-3-22 09:35

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:NDWJL    来源:CSDN

  最近一段时间在学习python算法,今天分享5种python计算圆周率的方法:
  1.割圆法,2.无穷级数法, 3.蒙特卡洛法,4 .梅钦法,5. 拉马努金法。
  希望能帮到大家。代码如下:
  1.割圆法
  '''
  编程实现割圆法计算圆周率,并输出分割不同次数时边数、圆周率值以及计算所得圆周率值与math库中的圆周率值的偏差。
  '''
   
  import math
   
  def cutting_circle(n):      # n为分割次数
      """接收表示分割次数的整数n为参数,计算分割n次时正多边形的边数和圆周率值,返回边数和圆周率值"""
      side_length = 1  # 初始边长
      edges = 6  # 初始边数
      #######################Begin############################
      # 补充你的代码
      def length(x):
          h = math.sqrt(1-(x /2)**2)
          return math.sqrt((x /2)**2 + (1-h)**2)
      for i in range(n):
          side_length = length(side_length)
          edges *=2
          pi = side_length*edges/2
   
      ########################End###########################
      return edges, pi
   
  if __name__ == '__main__':
      times = int(input())          # 割圆次数
      edges, pi =cutting_circle(times) #调用函数返回值
      #######################Begin############################
      # 补充你的代码
      print(f'分割{times}次,边数为{edges},圆周率为{pi:.6f}')
      print(f'math库中的圆周率常量值为{math.pi:.6f}')                               # 圆周率
   
      ########################End###########################
  2.无穷级数法
  '''
  使用无穷级数这个公式计算π值,输入一个小数作为阈值,当最后一项的绝对值小于给定阈值时停止计算并输出得到的π值
  '''
   
   
  def leibniz_of_pi(error):
      """接收用户输入的浮点数阈值为参数,返回圆周率值"""
      # ===================Begin====================================
      # 补充你的代码
      a = 1
      b = 1
      sum = 0
      while 1/ b > error:
          if a % 2 != 0:
              sum += 1 / b
          else:
              sum -=  1/ b
          a += 1
          b += 2
      pi = sum*4
      return pi
      # =====================End==================================
   
   
  if __name__ == '__main__':
      threshold = float(input())
      print("{:.8f}".format(leibniz_of_pi(threshold)))  # 保留小数点后八位
  3.蒙特卡洛法
  import random
  def monte_carlo_pi(num):
      """接收正整数为参数,表示随机点的数量,利用蒙特卡洛方法计算圆周率
      返回值为表示圆周率的浮点数"""
      #====================Begin===================================
      # 补充你的代码
      a = 0
      count = 0
      while a < times:
          x, y = random.uniform(-1, 1), random.uniform(-1, 1)
          if x**2 + y**2 <=1:
              count += 1
          a +=1
      return 4*count / a 
      #=====================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#######################
      def sumk (k):
          s =1
          for i in range(1,k+1):
              s *= i
          return s
      a = 0
      for i in range (n) :
          a += (sumk(4*i))*(1103+26390*i)/(sumk(i)**4*396**(4*i))
      pi = 1/a*9801/2/2**(1/2)   
   
      ################End#######################
      return pi
  if __name__ == '__main__':
      n = int(input())                
      cal_pi = ramanujan_of_pi(n)  
      print(cal_pi)                    # 输出函数运行结果
  本文内容不用于商业目的,如涉及知识产权问题,请权利人联系51Testing小编(021-64471599-8017),我们将立即处理
《2023软件测试行业现状调查报告》独家发布~

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号