繁体   English   中英

余弦x的泰勒级数在运行时使用python给出逻辑错误

[英]Taylor series for cosine x gives logical error at runtime using python

代码可以编译,但是输出错误。 例如,当我输入值45时,输出为1.0。 我使用有思想的机盖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                

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

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

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

问题在于您的程序使用整数而不是浮点数。 另外,变量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”),该设置也将起作用。

注意:角度值越高,意甲收敛的时间越长(即给出正确的答案)。 由于仅迭代9次,因此对于大角度值,它可能会给出不正确的答案。 通常的技巧是保留sum的最后一个值,并在其不变时停止迭代。

NB2:您可以通过避免重新计算y**(2*i))factorial(2*i)来优化程序。 您可以保留先前的值,例如,如果您计算了8的阶乘,只需乘以9和10即可得到10的阶乘。以同样的方式,如果您计算y**10 ,只需将其乘以y*y得到y**12

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM