簡體   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