Как составить бесконечный ряд, используя уравнение?

#python

Вопрос:

Я пытаюсь создать вызываемую функцию cos_series , которая использует значения x и nterms которая дает мне сумму ряда, используя это уравнение 1 — x^2/2! x^4/4! — x^6/6! …

До сих пор это мой код,

 def cos_series(x,nterms):
    lst = []
    lst2 = []
    for i in range(nterms):
        lst =[x**(2*i)/(math.factorial(i*2))]
    for i in range(nterms):
        lst2 =[(x**(2*i)/(math.factorial(i*2)))*-1]
    return sum(lst2[1::2]   lst[::2])

cos_series(math.pi/3,3)
 

Возвращаемое значение должно равняться 0,501796, но у меня возникли проблемы с его получением, может ли кто-нибудь помочь?

Комментарии:

1. Они чередуют знаки, извините за опечатку

2. Кроме того, n предполагается ли указывать количество терминов в форме x^p/p! или следует n считать 1 термин? (который был бы 0-м членом той же формы)

3. nterms должно быть int, которое должно обозначать количество членов x^p/p!. То есть, если nterms = 5, это приведет к 5-й итерации x^p/p!

4. Похоже, что вы пытаетесь расширить косинусную функцию в ряд Тейлора. Если это так, то почему возвращаемое значение передачи math.pi должно быть 0.501796 , а не cos(pi) то, которое есть -1 ?

5. Я допустил несколько ошибок при копировании кода, я пытаюсь взять cos pi/3 в серии Тейлора cos(x).

Ответ №1:

Ваш код, кажется, работает просто отлично.

Ваша логика работает только с:

 def cos_series(x, n):
    return sum((-1 if (i % 2) else 1) * x**(i*2) / math.factorial(i*2) for i in range(n))
 

Создание суммы рядов за один раз и избежание вычисления значений, которые вы не используете.

(обратите внимание, что после того, как вы изменили свой вопрос, ваш код фактически возвращает 0.501796201500181 — какое значение вы ожидали; проблем нет?)

Комментарии:

1. Да, ты все понял! Огромное спасибо. Мои опечатки сделали это невероятно трудным без всякой причины.

Ответ №2:

Вам не нужно использовать math.factorial (), и вам не нужно хранить термины в списке. Просто постройте числитель и знаменатель по ходу дела и сложите их.

Производя числитель и знаменатель итеративно, ваша логика будет намного проще в управлении и отладке:

 def cos(x,nTerms=10):
    result      = 0
    numerator   = 1
    denominator = 1
    for even in range(2,nTerms*2 1,2):          # nTerms even numbers
        result       = numerator / denominator  # sum of terms            
        numerator   *= -x*x                     #  /- for even powers of x
        denominator *= even * (even-1)          # factorial of even numbers
    return result

print(cos(3.141592653589793/3,3)) # 0.501796201500181
 

Комментарии:

1. Факториал невероятно расточителен, особенно если он не использует мемуаризацию. Ваше решение создание значений с помощью умножения-это правильный путь.