TA的每日心情 | 无聊 昨天 09:05 |
---|
签到天数: 1050 天 连续签到: 1 天 [LV.10]测试总司令
|
最近一段时间在学习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) # 输出函数运行结果
|
|