1

次の級数の最初の 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
4

4 に答える 4

2

多分このようなもの:

#! /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(分母のように) アキュムレータです。

于 2013-11-25T20:55:02.710 に答える
2

注: Python2.xを使用している場合は、

from __future__ import division

ファイルの最初の行として


1つの方法は、このように記号を交互にすることです

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
于 2013-11-25T20:59:59.540 に答える
1

階乗の関数を作成してみませんか? (繰り返し用のオプションのパラメーターを追加しました):

編集:

コメントによると、値を再計算しないことを確認する「学習」階乗関数があります (ただし、これは 199 までしか機能しません!おそらくすでに 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)
于 2013-11-25T21:29:34.007 に答える
0

シリーズを計算するには、リスト内包表記の力を使用します。

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]])

x次に、特定の;の計算を行います。

In [21]: x = 12

In [22]: sum([s*x**t/float(b) for t, b, s in data])
Out[22]: -9753.737142857142
于 2013-11-25T22:28:46.127 に答える