Вычислить значение функции 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 шт):
Примечание: Первая часть вашей программы (для pi/3) тоже неправильная. :-(
t=(-1)**n*x**(2*n)/math.faktorial(2*n)- не существует функцияmath.faktorial(). Измените имяfaktorialнаfactorial.Не используйте имя
sum. Это имя стандартной функции, которую этим перепишете. Когда вы все равно настаиваете на этом имени, сделайте так, как принято в Питоне — добавите к нему знак подчеркивания (_). Вот так:sum_.Инициализация в первой части неправильна, потому вы получили неправильный результат.
Ваш код:
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
Теперь ко второй части вашей программы:
Не надо импортировать модуль
mathдважды в том же самом файле. Уберитеimport mathиз этой части.Та же самая ошибка как в первой части -
nдолжно начинаться с нуля. Т.е. вместо вашегоsum = x n = 1примените
sum_ = 0 # Более наглядно, чем ваше x = 0 и затем sum = x n = 0Вместо
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


