我已经写了这个函数来计算sin(x)使用泰勒级数到任何指定的准确度,'N个术语',我的问题是结果没有按预期返回,我无法弄清楚为什么,任何帮助将不胜感激。
我期待的是: 1 6.28318530718 2 -35.0585169332 3 46.5467323429 4 -30.1591274102 5 11.8995665347 6 -3.1.19507604213 7 0.624876542716 8 -0.0932457590621 9 0.0109834031461
我得到的是: 1无 2 6.28318530718 3 -35.0585169332 4 46.5467323429 5 -30.1591274102 6 11.8995665347 7 -3.19507604213 8 0.624876542716 9 -0.0932457590621
提前致谢。
def factorial(x):
if x <= 1:
return 1
else:
return x * factorial(x-1)
def sinNterms(x, N):
x = float(x)
while N >1:
result = x
for i in range(2, N):
power = ((2 * i)-1)
sign = 1
if i % 2 == 0:
sign = -1
else:
sign = 1
result = result + (((x ** power)*sign) / factorial(power))
return result
pi = 3.141592653589793
for i in range(1,10):
print i, sinNterms(2*pi, i)
答案 0 :(得分:1)
我看到你将返回放在for会将其从while循环中删除。您应该解释这是否是您的意思。但是,鉴于for i in range(1,10):
意味着您将忽略第一个条目并在输入参数i为1时返回None
。这真的是您想要的吗?此外,由于您始终在计算后退出,因此不应使用while N > 1
,而应使用if N > 1
来避免无限递归。
您的结果关闭的原因是您使用的范围不正确。 range(2, N)
为您提供2 to N-1
的号码列表。因此range(2, 2)
会为您提供一个空列表。
您应该计算range(2, N+1)
def sinNterms(x, N):
x = float(x)
while N >1:
result = x
for i in range(2, N):
您的评论说明您的代码行的顺序错误。你应该
def sinNterms(x, N):
x = float(x)
result = x
# replace the while with an if since you do not need a loop
# Otherwise you would get an infinite recursion
if N > 1:
for i in range(2, N+1):
power = ((2 * i)-1)
sign = 1
if i % 2 == 0:
sign = -1
# The else is not needed as this is the default
# else:
# sign = 1
# use += operator for the calculation
result += (((x ** power)*sign) / factorial(power))
# Now return the value with the indentation under the if N > 1
return result
注意,为了处理设置factorial的东西,返回一个不是int的浮点数。
保存一些计算的另一种方法是
def sinNterms(x, N):
x = float(x)
lim = 1e-12
result = 0
sign = 1
# This range gives the odd numbers, saves calculation.
for i in range(1, 2*(N+1), 2):
# use += operator for the calculation
temp = ((x ** i)*sign) / factorial(i)
if fabs(temp) < lim:
break
result += temp
sign *= -1
return result