Python 中圆周率的连分数
Continued fraction for pi in Python
我正在尝试使用连分数来近似圆周率。
我正在使用这个公式。
几个小时后,我到了这里。
for i in range(1,15,1):
e = ((2*i - 1) ** 2)
b = (e / (6 + ((2*(i+1) - 1) ** 2)))
print(3+b)
`
但是我的输出不是很好...
您的方法不正确。如果您用一些示例值代替 i
,您会注意到您完全忽略了除此分数的第 i
和第 i+1
部分以外的所有内容。您需要确保您的循环考虑到所有更高级别以及您正在计算的新级别。我认为编写解决方案的最简单方法是使用递归:
def inf_pi(its, ctr = 1):
if its == 0:
return 0
else:
x = ((2*ctr)-1)**2 / (6 + inf_pi(its - 1, ctr + 1))
return x + (3 if ctr == 1 else 0)
print(inf_pi(10))
如果您需要迭代方法,您必须考虑两件事 - 首先,您只能以有限的精度计算它,并且您需要用一些值替换未计算的余数。第二个问题是你试图从最外层分数计算这个,但你不知道“无限”分数的值是多少。如果你颠倒顺序,从最里面的分数开始,将超出所需精度的部分替换为常量后,你可以一直计算每一步的值,直到最外面的分数。
def it_pi(its):
pi = 0
for i in range(its, 0, -1):
pi = (((2*i)-1)**2) / (6 + pi)
return 3 + pi
我正在尝试使用连分数来近似圆周率。
我正在使用这个公式。
几个小时后,我到了这里。
for i in range(1,15,1):
e = ((2*i - 1) ** 2)
b = (e / (6 + ((2*(i+1) - 1) ** 2)))
print(3+b)
`
但是我的输出不是很好...
您的方法不正确。如果您用一些示例值代替 i
,您会注意到您完全忽略了除此分数的第 i
和第 i+1
部分以外的所有内容。您需要确保您的循环考虑到所有更高级别以及您正在计算的新级别。我认为编写解决方案的最简单方法是使用递归:
def inf_pi(its, ctr = 1):
if its == 0:
return 0
else:
x = ((2*ctr)-1)**2 / (6 + inf_pi(its - 1, ctr + 1))
return x + (3 if ctr == 1 else 0)
print(inf_pi(10))
如果您需要迭代方法,您必须考虑两件事 - 首先,您只能以有限的精度计算它,并且您需要用一些值替换未计算的余数。第二个问题是你试图从最外层分数计算这个,但你不知道“无限”分数的值是多少。如果你颠倒顺序,从最里面的分数开始,将超出所需精度的部分替换为常量后,你可以一直计算每一步的值,直到最外面的分数。
def it_pi(its):
pi = 0
for i in range(its, 0, -1):
pi = (((2*i)-1)**2) / (6 + pi)
return 3 + pi