cosine x的Taylor系列在运行时使用python提供逻辑错误

时间:2016-02-26 01:47:57

标签: python taylor-series

代码编译但输出错误。例如,当我输入值45时,我得到1.0的输出。我使用了enthought canopy IDE,哪里出错了?

import math
x = int(raw_input("Enter the size of the angle : ")) 
y = (x*math.pi)/180

# my factorial function
def factorial(n):
    if n == 0 or n == 1:
     return 1
    else:
     return n * factorial(n - 1)
def cos(x): 
    for i in range (9):
     sum = 0
     sum += ((-1)**(i)) * (y **(2* i))/factorial((2*i))
    return sum      

print cos(x)
print y # I wanted to be sure my conversion to radian is  right                

3 个答案:

答案 0 :(得分:1)

在每个循环中将总和设置为零:sum=0应该在for循环之前,而不是在for循环之前。

答案 1 :(得分:0)

像克里斯所说,sum=0应该在for循环之前。这是一个更干净的代码:

def cos(x):
    return sum(((-1)**(i)) * (y **(2* i))/factorial((2*i)) for i in range(9))

答案 2 :(得分:0)

问题是你的程序使用整数而不是浮点数。此外,变量sum应该在循环之前初始化。

import math
x = float(raw_input("Enter the size of the angle : ")) 
y = (x*math.pi)/180.0

#my factorial function
def factorial(n):
    if n == 0 or n == 1:
      return 1
    else:
      return n * factorial(n - 1)
def cos(x): 
  sum = 0.0
  for i in range (9):
    sum += ((-1)**(i)) * (y **(2*i))/factorial((2*i))
  return sum      
print cos(x)
print y

即使键入" 45"对于角度(没有" .0")。

N.B。角度值越高,系列收敛所需的时间越长(即给出正确的答案)。由于您只迭代9次,因此可以为较大的角度值提供不准确的答案。通常的技巧是保持sum的最后一个值,并在它没有改变时停止迭代。

N.B.2:您可以通过避免重新计算y**(2*i))factorial(2*i)来优化您的计划。你可以保留以前的值,例如,如果你计算阶乘8,只乘以9乘以10得到阶乘10。同样,如果你计算y**10,只需乘以{ {1}}获取y*y