Форум сайта python.su
Всех приветствую. Учусь в техникуме и возникла проблема на последних работах. Вот я сделал по своему - училка давит на “не правильно, переделай”. Так вот, уже обращаюсь к вам за помощью. Шаблон для всех тоже прикрепляю.
1) Условие из ШАБЛОНА И САМ ШАБЛОН:
Составить две программы для вычисления суммы ряда с точностью ε, используя функцию. В одной программе реализация функции осуществить итерационным путем, в другой – через рекурсию.
Под приближенными значениями суммы ряда с точностью ε здесь понимается сумма слагаемых, для которых выполняется условие ε. Вот само условие: https://ibb.co/vHD3QsK , где x=0.34, E=0.0001
Само выполнение этой программы:
#Программа 1 из шаблона: import math def factorial_iterative(num:int): factorial = 1 if num < 0: return 0 else: for i in range (1, num + 1): factorial = factorial*i return factorial x= float(input('x: ')) eps=float(input('eps:')) n=1 sum=0 a=(-1)**n*(2*x)/factorial_iterative(2*n) while math.fabs(a)>eps: sum+=a n+=1 a=(-1)**n*(2*x)**n/factorial_iterative(2*n) print ("suma=",sum) print("n=",n) #Программа 2 из шаблона: import math def factorial_recursive(n): if n == 1: return n else: return n*factorial_recursive(n-1) x= float(input('x: ')) eps=float(input('eps:')) n=1 sum=0 a=(-1)**n*(2*x)/factorial_recursive(2*n) while math.fabs(a)>eps: sum+=a n+=1 a=(-1)**n*(2*x)**n/factorial_recursive(2*n) print ("suma=",sum) print("n=",n)
Офлайн
Эпсилон - это точность с которой отличаются частичные суммы. Не модуль элемента надо проверять на эпсилон, а то, насколько новый элемент меняет предыдущую частичную сумму при добавлении к ней.
А модуль члена ряда может никогда и не стать меньше эпсилон.
Поэтому проверять нужно такое условие: abs(sum - (sum - a)) >= eps .
Вот пример синуса
#!/usr/bin/env python3 # Находит sin(x) через ряд Маклорена # sin(x) = x - (x ^ 3) / 3! + (x ^ 5) / 5! - (x ^ 7) / 7! + ... import math def sin(x, eps): x %= 2 * math.pi s = ps = 0 sl = x z = 1 while True: ps = s s += sl sl = -sl * x * x / (2 * z * (2 * z + 1)) z += 1 if abs(s - ps) < eps: s = ps break return s if __name__ == '__main__': n = 6 print('sin digits =', n) print(sin(12345, 10 ** -n)) print(math.sin(12345))
[guest@localhost py]$ ./row_sin.py
sin digits = 6
-0.9937714417514263
-0.9937716364556811
[guest@localhost py]$
#!/usr/bin/env python3 # Находит sin(x) через ряд Маклорена # sin(x) = x - (x ^ 3) / 3! + (x ^ 5) / 5! - (x ^ 7) / 7! + ... import math def sin(x, eps): x %= 2 * math.pi s = 0 sl = x z = 1 while abs(sl) >= eps: s += sl sl = -sl * x * x / (2 * z * (2 * z + 1)) z += 1 return s if __name__ == '__main__': n = 6 print('sin digits =', n) print(sin(12345, 10 ** -n)) print(math.sin(12345))
[guest@localhost py]$ ./row_sin.py
sin digits = 6
-0.9937714417514263
-0.9937716364556811
[guest@localhost py]$
Отредактировано py.user.next (Апрель 22, 2022 20:35:17)
Офлайн
py.user.next
Эпсилон - это точность с которой отличаются частичные суммы. Не модуль элемента надо проверять на эпсилон, а то, насколько новый элемент меняет предыдущую частичную сумму при добавлении к ней.А модуль члена ряда может никогда и не стать меньше эпсилон.Поэтому проверять нужно такое условие: abs(sum - (sum - a)) >= eps .Вот пример синуса
Офлайн
SteamTimНу… Я имею в виду, что ты его неправильно проверяешь. Мало того что проверяешь неправильно, так ещё и сумму ряда условием называешь. То есть ты даже не понимаешь, что ты делаешь и что нужно сделать.
Вы что-то не то написали. Я имел ввиду, что на картинке (по ссылке, я на имгур залил) есть моё условие.
1 + 2 + 3 + 4 + 5 + ... + бесконечность
Отредактировано py.user.next (Апрель 22, 2022 20:22:59)
Прикреплённый файлы:
sum.png (4,9 KБ)
Офлайн
Что-то я посчитал… Похоже, действительно, можно abs(sum - (sum - a)) >= eps привести к виду abs(a) >= eps.
Типа это одно и то же получается.
Офлайн
SteamTimТы знаешь, эта фигня делается через рекуррентные соотношения. То есть ты должен взять член ряда для n и член ряда для (n + 1). Потом вот этот член ряда для (n + 1) надо поделить на член ряда для n. Тогда у тебя получится формула для вычисления одного члена ряда через предыдущий член ряда. Получится такая хрень, короче, на которую можно умножить любой член ряда, чтобы получить следующий за ним член ряда. И вот таким макаром это делается. Поэтому факториалы не надо вычислять. Надо найти этот коэффициент, на который умножается член ряда, чтобы получить следующий член ряда. И потом через этот коэффициент надо вычислять частичную сумму ряда для такого-то члена, пока разность этой частичной суммы и предыдущей частичной суммы не станет меньше эпсилон.
Теперь моё условие (из листочка): https://ibb.co/ZzBPznz , где Х=0,58, Е=0,001. Программу писать примерно по такому же шаблону можно. Честно, господа, за помощь буду безумно благодарен, просто своих сил уже реально нет.
Офлайн