使用python查找余弦



我必须编写一个函数,使用以下系列的前10项计算并返回角度的余弦:cosx = 1 - (x**2)/2! + (x**4)/4! - (x**6)/6!....

我不能使用阶乘函数,但我可以使用这样一个事实,即如果以前的分母是n!,那么当前的分母将是n!(n+1)(n+2)。我试图使用一个累加器循环,但我遇到了一个困难,因为它从正到负交替,分母也有问题。

这就是我迄今为止所拥有的。分母和累加器循环有什么帮助吗?

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

def cosine(angle):
    cosx = 1
    sign = -1
    for i in range(2, 20, 2):
        cosx = cosx + (sign*(angle**i))/factorial(i)
        sign = -sign
    return cosx

也许是这样的:

#! /usr/bin/python3.2
def cos (a):
    d = 1
    c = 1
    for i in range (2, 20, 2):
        d *= i * (i - 1)
        sign = -1 if i % 4 else 1
        print ('adding {} * a ** {} / {}'.format (sign, i, d) )
        c += sign * a ** i / d
        print ('cosine is now {}'.format (c) )
    return c
cos (1.0)

基本上d(如分母)是您的累加器。

注意:如果您使用Python2.x,您应该使用

from __future__ import division

作为文件的第一行


一种方法是像这个一样替换标志

def cos(angle):
    sign = -1
    cosx = 1
    for i in range(2,20,2):
         cosx += sign*(x**i)/(i)
         sign = -sign

你仍然需要得到阶乘部分正确的

这里有一个更简单的版本,它根据前一个术语计算每个术语。

def cos(x):
    res = 0
    term = 1
    for i in range(1, 20, 2):
        res += term
        term *= -x * x/ i /(i + 1)
    return res

为什么不为阶乘生成一个函数?(我为重复添加了一个可选参数):

编辑:

根据一条评论,这里有一个"学习"阶乘函数,它将确保不重新计算任何值(假设这只适用于199!我假设cos函数的重复次数永远不会超过99次,因为它可能已经抛出了90左右的溢出错误):

facts = [0]*200
facts[0] = 1
def factorial(x): 
    if(facts[x] != 0): return facts[x]
    return x * factorial(x-1)
def cos(x, reps=10):
    final_val = 1
    neg = -1
    for n in range(2, reps*2, 2):
        final_val += neg*(x**n)/factorial(n)
        neg *= -1
    return final_val
print cos(3.14/2)

对于计算级数,请使用列表综合的幂。

In [1]: a = range(1,11)
In [2]: a
Out[2]: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

mul函数将给定列表的元素相乘:

In [3]: def mul(r):
   ...:     rv = 1
   ...:     for j in r:
   ...:         rv *= j
   ...:     return rv
   ...: 

现在您可以生成阶乘:

In [7]: b = [mul(a[:i]) for i in a]
In [8]: b
Out[8]: [1, 2, 6, 24, 120, 720, 5040, 40320, 362880, 3628800]

从列表中选择合适的元素;

In [10]: a[1::2]
Out[10]: [2, 4, 6, 8, 10]
In [11]: b[1::2]
Out[11]: [2, 24, 720, 40320, 3628800]

生成加号和减号:

In [12]: [(-1)**k for k in a[:5]]
Out[12]: [-1, 1, -1, 1, -1]

结合所有元素;

In [14]: data = zip(a[1::2], b[1::2], [(-1)**k for k in a[:5]])

然后对某个CCD_ 6进行计算;

In [21]: x = 12
In [22]: sum([s*x**t/float(b) for t, b, s in data])
Out[22]: -9753.737142857142

最新更新