2015-11-09 61 views
1

我的作業是編寫一個代碼,其中包含一個函數,計算sinx泰勒系列,並給出數額。 函數必須得到(n,k),其中n是正弦所需的數字,k是函數在點之後必須計算的數字。 首先我忽略ķ,因爲它容易點後,以限制人數,並寫道,只是計算sinx的泰勒的功能,所以我放棄了爲r的特定範圍(r爲泰勒級數的每一句話):尋找我的代碼錯誤寫入計算泰勒系列

def taylor(n,k): 

    s= ((math.pi)/180)*n 
    ex = s 
    sign = 1 
    factorial = 1 
    sum=0 
    i=1 
    r=1 

    while r>0.00000000000000000001 or r<0.0000000000000000000001 : 
    r= ex*sign/factorial 
    ex = ex*s*s 
    sign = sign*(-1) 
    factorial=factorial*(i+1)*(i+2) 
    i= i+2 
    sum = sum + r 

    return sum 

import math 
print(taylor(45,1)) 

我只是不知道爲什麼,如果我集合R比這個(即0.1)更大的量,我得到這個錯誤:

Traceback (most recent call last): 

File "/Users/modern/Desktop/taylor.py", line 22, in <module> 

print(taylor(45)) 

File "/Users/modern/Desktop/taylor.py", line 12, in taylor 

r= ex*sign/factorial 

OverflowError: int too large to convert to float 
+1

你'factorial'變量可能只是變得過於龐大,因爲階乘往往要做到這一點,你看看[此鏈接](http://stackoverflow.com/questions/16174399/overflowerror-long-int-太大的轉換爲浮點在python)的方式來繞過該 –

+1

你的while循環看起來像缺少一個負號。爲什麼不只是abs(r)> 10 **( - 12)'? –

+0

你使用的是什麼版本的Python?我的2.7.5版本處理這個乾淨,吐出一個非常好的根(2)的近似值。 – Prune

回答

3

我很驚訝,這是一個問題,因爲我認爲r在出現問題之前低於容錯。

請注意,你真正需要的是階乘的倒數。而不是你除以一個因子的變量,你可以有一個變量,比如,fact_recip這是通過

fact_recip /= ((i+1)*(i+2)) 

這將初始化爲

fact_recip = 1.0 

使用像r= ex*sign*fact_recp

並更新處理你所看到的錯誤,但我不確定這個舍入錯誤是否會成爲問題。

+0

這是負面的跡象,我真的很抱歉在這裏發佈這樣的問題... –

+0

你能告訴我我怎樣才能得到兩個數字作爲一個輸入?所以我的函數可以得到(n,k) –

+0

@MohammadHoseinKhalili我假設你是用'input'(或Python 2中的'raw_input')表示的。可能類似於'nums = input(「輸入n,k,用空格分隔),後面跟着'nums = nums.split()',接着是'n = int(nums [0])',然後是'k = int(nums [1])' –

0

我不知道你的意思是什麼

if i set amount of r larger than this (i.e 0.1)

和你的while循環的條件看起來很奇怪,但正如R Nar指出的,錯誤是由你的factorial的值變得太大所致。我會不是推薦使用decimal但是,因爲它真的很慢。寧可看看gmpy,它是爲了獲得(真正)快速的任意精確數學而設計的。

或者,您可以使用Strinling's Approximation來計算大型因子。

1

可以與一家領先的問題,拆分處理您的輸入,如@約翰·科爾曼建議,但我會做分配爲一對:

nums = input("Enter n, k, separated by a space") 
n, k = nums.split() 

這裏是清理的方案:因子更新 - 尤其是因子 - 會減少到前一項的變化。我還將您的循環限制標準化爲更具可讀性。

def taylor(n,k): 

    s = (math.pi/180)*n 
    s2 = s*s 
    sum = s 
    i = 1 
    r = s 
    converge = 1.0E-20 

    while r > converge or r < converge/100 : 
     r *= -s2/((i+1)*(i+2)) 
     sum += r 
     i = i+2 

    return sum 

import math 
print(taylor(45,1))