#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. Факториал невероятно расточителен, особенно если он не использует мемуаризацию. Ваше решение создание значений с помощью умножения-это правильный путь.