我必须编写一个函数,使用以下系列的前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