如何修复Gregory-Liebniz方程中的Python错误?
for循环中有缩进,无法使其显示。我在pi=pi出现语法错误。。。线路。什么是解决这个问题的好方法?我只是在学习Python,并不完全确定我是否使用了正确的语法。非常感谢你 尝试使用以下代码:如何修复Gregory-Liebniz方程中的Python错误?,python,math,syntax-error,Python,Math,Syntax Error,for循环中有缩进,无法使其显示。我在pi=pi出现语法错误。。。线路。什么是解决这个问题的好方法?我只是在学习Python,并不完全确定我是否使用了正确的语法。非常感谢你 尝试使用以下代码: n = 10 pi =0 for i in n: pi = pi + (4i - (1**i))/(2i+1) print(pi) 以下是实际公式: n = 10 pi = 0 for i in range(n): # replaced 'n' with range(n)
n = 10
pi =0
for i in n:
pi = pi + (4i - (1**i))/(2i+1)
print(pi)
以下是实际公式:
n = 10
pi = 0
for i in range(n): # replaced 'n' with range(n)
pi += (4*i - ((-1)**i))/(2*i+1) # a = a + b, is same as: a += b
# ^ Correction as per Gregory–Leibniz formula
# for multiplication, you need to explicitly mention `*` operator
# replaced '4i' and '2i' with '4*i' and '2*i'
print(pi)
公式返回pi/4
,这就是*4
部分的原因
另外,
1**i
总是导致1
,您实际上需要(-1)**i
除了4i
和2i
的语法错误之外,您还没有正确实现pi的Gregory–Leibniz公式。这是一个修复过的版本
n = 1000 # Raise the number of iterations to get a better approximation
pi = 0.0
for i in range(n):
pi += (-1)**i/(2.0*i + 1) # You have to use the .0 in python 2.x
print(pi * 4)
输出
n = 50000
pi = 0
for i in range(n):
pi += 4 * (-1)**i / (2*i + 1)
print(pi)
def arc_cot(n, lim=1E-15):
''' Inverse cotangent of n '''
x = 1.0 / n
y = -x * x
a = x
i = 1
while True:
i += 2
x *= y
t = x / i
a += t
if abs(t) < lim:
break
return a
a = arc_cot(2) + arc_cot(3)
print(4 * a)
a = 4 * arc_cot(5) - arc_cot(239)
print(4 * a)
然而,(-1)**i
是一种非常浪费的计算每个术语符号变化的方法。这里有一个更好的方法。将乘法从循环中移出4,并将范围
设置为只提供奇数,这也更有效
3.1415726535897814
Gregory–Leibniz公式计算
pi=4*arctan(1)
。通过使用基于小于1的数字的反正切关系,可以加快收敛速度。例如
n = 50000
pi = 0
s = 1
for i in range(1, 2*n, 2):
pi += s / i
s = -s
pi *= 4
print(pi)
及
由于arctan(1/n)==arccot(n)
有关这些arccot公式推导的信息,请参见和。将
4i
和2i
替换为4*i
和2*i
和对于n中的i:
替换为对于范围(n)中的i:
您还期望1**i
做什么?因为这将1
提升到i
的幂,这将始终导致1
。顺便说一句,这不是pi的Gregory–Leibniz公式。另外,实际的格雷戈里-莱布尼茨公式是已知计算圆周率的最慢的方法之一。@Stacey:如果有帮助,请其他人将来参考相同的问题。
arctan(1) = 4 * arctan(1/5) - arctan(1/239)
def arc_cot(n, lim=1E-15):
''' Inverse cotangent of n '''
x = 1.0 / n
y = -x * x
a = x
i = 1
while True:
i += 2
x *= y
t = x / i
a += t
if abs(t) < lim:
break
return a
a = arc_cot(2) + arc_cot(3)
print(4 * a)
a = 4 * arc_cot(5) - arc_cot(239)
print(4 * a)
3.141592653589793
3.141592653589794