Вычислить значение функции cos(x) как сумму членов ряда

На первом фото моя задача, на двух других примеры с вычислением синуса.
Школьная задача, сделала по методичке преподавателя. Она говорит, что что-то не так, сама не знает что, а я и подавно не знаю. Буду очень признательна за помощь. Прикладываю код, с которым "что-то не так"

#для pi/3
import math
x = math.pi/3
sum=x
n=1
t=(-1)**n*x**(2*n)/math.faktorial(2*n)
while abs(t)>0.1e-5:
    sum+=t
    n += 1
    t = (-1)**n*x**(2*n)/math.factorial(2*n)
print(round(x, 3), round(sum, 6), round(math.cos(x),6))

#для интервала 0...pi/2
import math
x = 0
while 1:
    sum = x
    n = 1
    t = (-1)**i*x**(2*n)/math.factorial(2*n)
    while abs(t)>0.1e-5:
        sum+=t
        n += 1
        t = (-1)**n*x**(2*n)/math.factorial(2*n)
    print(round(x, 3), round(sum, 6), round(math.cos(x),6))
    x += math.pi/6
    if x>=math.pi/2:
        break

Преподаватель говорила, что в первой части надо было таким же while 1 решать, и что-то не так со второй частью.

Моя задача

Пример с синусом

Пример с синусом (продолжение)


Ответы (1 шт):

Автор решения: MarianD

Примечание: Первая часть вашей программы (для pi/3) тоже неправильная. :-(

  1. t=(-1)**n*x**(2*n)/math.faktorial(2*n) - не существует функция math.faktorial(). Измените имя faktorial на factorial.

  2. Не используйте имя sum. Это имя стандартной функции, которую этим перепишете. Когда вы все равно настаиваете на этом имени, сделайте так, как принято в Питоне — добавите к нему знак подчеркивания (_). Вот так: sum_.

  3. Инициализация в первой части неправильна, потому вы получили неправильный результат.

    Ваш код:

    sum=x
    n=1
    

    Должно быт:

    sum_ = 0
    n = 0
    

    Обратите внимание тоже на то, что для PEP 8 - руководство по написанию кода на Python, я перед и за оператором присвоения (=) добавил пробелы.

Значит, первая часть вашей программы (немножко красивее написана) будет выглядеть так:

# для pi/3
import math


x = math.pi/3
sum_ = 0
n = 0
t = (-1)**n * x**(2*n) / math.factorial(2*n)
while abs(t) > 0.1e-5:
    sum_ += t
    n += 1
    t = (-1)**n * x**(2*n) / math.factorial(2*n)
    
print(round(x, 3), round(sum_, 6), round(math.cos(x), 6))

Вывод:

1.047 0.5 0.5

Теперь ко второй части вашей программы:

  1. Не надо импортировать модуль math дважды в том же самом файле. Уберите import math из этой части.

  2. Та же самая ошибка как в первой части - n должно начинаться с нуля. Т.е. вместо вашего

    sum = x
    n = 1
    

    примените

    sum_ = 0      # Более наглядно, чем ваше x = 0 и затем sum = x
    n = 0
    
  3. Вместо while 1: и затем выхода из этого бесконечного цикла парой команд

    if x>=math.pi/2:
        break
    

    напишите просто

    while x <= math.pi/2:
    

    (и те последние команды для выхода из бесконечного числа уберите).

    Тем самым вы тоже исправите ошибку, когда последний результат (для pi/2) не выводился.

Значит, вторая часть вашей программы будет теперь выглядеть так:

# для интервала 0...pi/2
x = 0
while x <= math.pi/2:
    sum_ = 0
    n = 0
    t = (-1)**n * x**(2*n) / math.factorial(2*n)
    while abs(t) > 0.1e-5:
        sum_+= t
        n += 1
        t = (-1)**n * x**(2*n) / math.factorial(2*n)

    print(round(x, 3), round(sum_, 6), round(math.cos(x), 6))
    x += math.pi/6

Вывод:

0 1.0 1.0
0.524 0.866025 0.866025
1.047 0.5 0.5
1.571 -0.0 0.0

Примечание:

Довольно длинное выражение

(-1)**n * x**(2*n) / math.factorial(2*n)

встречается в вашей программе 4 раза. Почему не определить его как функцию

def term(n, x):
    return (-1)**n * x**(2*n) / math.factorial(2*n)

Затем вообще не надо использовать переменную t и вся программа станется более краткой и наглядной:

import math


def term(n, x):
    return (-1) ** n * x ** (2 * n) / math.factorial(2 * n)

# для pi/3
x = math.pi/3
sum_ = 0
n = 0
while abs(term(n, x)) > 0.1e-5:
    sum_ += term(n, x)
    n += 1

print(round(x, 3), round(sum_, 6), round(math.cos(x), 6))


# для интервала 0...pi/2
x = 0
while x <= math.pi/2:
    sum_ = 0
    n = 0
    while abs(term(n, x)) > 0.1e-5:
        sum_ += term(n, x)
        n += 1
        
    print(round(x, 3), round(sum_, 6), round(math.cos(x), 6))
    x += math.pi/6

Вывод:

1.047 0.5 0.5
0 1.0 1.0
0.524 0.866025 0.866025
1.047 0.5 0.5
1.571 -0.0 0.0
→ Ссылка