2016-02-01 3 views
2

Мне нужно найти способ написать cos (1) в python, используя цикл while. Но я не могу использовать любые математические функции. Кто-нибудь может мне помочь?Как написать cos (1)

, например, я также должен был записать значение ехр (1), и я был в состоянии сделать это, написав:

count = 1 

term = 1 

expTotal = 0 

xx = 1 

while abs(term) > 1e-20: 

    print("%1d %22.17e" % (count, term)) 
    expTotal = expTotal + term 
    term=term * xx/(count) 
    count+=1 

я AMM полностью потерял, как о том, как сделать это с соз и грех однако.

ответ

1

можно рассчитать cos(1), используя разложение Тейлора этой функции:

Taylor series for a cosine

Вы можете найти более подробную информацию о Wikipedia см реализацию ниже:

import math 

def factorial(n): 
    if n == 0: 
     return 1 
    else: 
     return n * factorial(n-1) 

def cos(order):    
    a = 0 
    for i in range(0, order):     
     a += ((-1)**i)/(factorial(2*i)*1.0) 


    return a 

print cos(10) 
print math.cos(1) 

Это дает в качестве вывода :

0.540302305868 
0.540302305868 

EDIT: По-видимому, косинус реализован на аппаратных средствах с использованием алгоритма CORDIC, который использует таблицу поиска для вычисления atan. Ниже реализации Python алгоритма КОРДИСА на основе этой группы Google question:

#atans = [math.atan(2.0**(-i)) for i in range(0,40)] 
atans =[0.7853981633974483, 0.4636476090008061, 0.24497866312686414, 0.12435499454676144, 0.06241880999595735, 0.031239833430268277, 0.015623728620476831, 0.007812341060101111, 0.0039062301319669718, 0.0019531225164788188, 0.0009765621895593195, 0.0004882812111948983, 0.00024414062014936177, 0.00012207031189367021, 6.103515617420877e-05, 3.0517578115526096e-05, 1.5258789061315762e-05, 7.62939453110197e-06, 3.814697265606496e-06, 1.907348632810187e-06, 9.536743164059608e-07, 4.7683715820308884e-07, 2.3841857910155797e-07, 1.1920928955078068e-07, 5.960464477539055e-08, 2.9802322387695303e-08, 1.4901161193847655e-08, 7.450580596923828e-09, 3.725290298461914e-09, 1.862645149230957e-09, 9.313225746154785e-10, 4.656612873077393e-10, 2.3283064365386963e-10, 1.1641532182693481e-10, 5.820766091346741e-11, 2.9103830456733704e-11, 1.4551915228366852e-11, 7.275957614183426e-12, 3.637978807091713e-12, 1.8189894035458565e-12] 

def cosine_sine_cordic(beta,N=40): 
    # in hardware, put this in a table. 
    def K_vals(n): 
     K = [] 
     acc = 1.0 
     for i in range(0, n): 
       acc = acc * (1.0/(1 + 2.0**(-2*i))**0.5) 
      K.append(acc) 
     return K 
    #K = K_vals(N) 
    K = 0.6072529350088812561694 
    x = 1 
    y = 0 

    for i in range(0,N): 
     d = 1.0 
     if beta < 0: 
      d = -1.0 

     (x,y) = (x - (d*(2.0**(-i))*y), (d*(2.0**(-i))*x) + y) 
     # in hardware put the atan values in a table 
     beta = beta - (d*atans[i]) 
    return (K*x, K*y) 

if __name__ == '__main__': 
    beta = 1 
    cos_val, sin_val = cosine_sine_cordic(beta) 
    print "Actual cos: " + str(math.cos(beta)) 
    print "Cordic cos: " + str(cos_val) 

Это дает в качестве вывода:

Actual cos: 0.540302305868 
Cordic cos: 0.540302305869 
3

Просто изменить ваше выражение для вычисления термина:

term = term * (-1 * x * x)/((2*count) * ((2*count)-1)) 

Умножение счета на 2 может быть изменено, чтобы увеличить счет на 2, так что вот ваша копия:

import math 

def cos(x): 
    cosTotal = 1 
    count = 2 
    term = 1 
    x=float(x) 
    while abs(term) > 1e-20: 
     term *= (-x * x)/(count * (count-1)) 
     cosTotal += term 
     count += 2 
     print("%1d %22.17e" % (count, term)) 
    return cosTotal 

print(cos(1)) 
print(math.cos(1)) 
Смежные вопросы