Форум сайта python.su
Камрады, need help:
Задача - с заданой точностью ε, (0<ε<1), найти е^х=1+x/1!+x^2/2!+…+x^n/n!
проверить значение
Офлайн
Надо эту задачу делать через рекуррентные соотношения (то есть функция факториала не используется).
Надо формулу n-ого члена ряда поделить на формулу (n-1)-ого члена ряда. Это даст коэффициент, на который умножается каждый член ряда, чтобы получить следующий член ряда. Потом, начиная с первого члена ряда, нужно умножать член ряда на этот коэффициент; будет получаться следующий член ряда, который нужно прибавлять к частичной сумме. Таким образом, когда частичная сумма сойдётся к одному числу в пределах заданной точности (то есть при добавлении новых членов ряда частичная сумма в пределах заданной точности не будет меняться), можно прекратить вычисление.
Для e^(-x) делал:
#!/usr/bin/env python3 # вычисляет сумму ряда e ^ (-x) с заданной точностью # # e ^ (-x) = 1 - x + (x ^ 2) / 2! - (x ^ 3) / 3! + # + ... + (-1 ^ n) * (x ^ n) / n! import math def emx(x, eps): s, sl, psl, i = 0, 1, 0, 1 while abs(sl - psl) > eps: s += sl psl = sl sl *= -x / i i += 1 return s if __name__ == '__main__': print(math.exp(-4)) for e in ( 1, 0.1, 0.01, 0.001, 0.0001, 0.00001, 0.000001, 0.0000001, ): x = 4 print('{} eps={}'.format(emx(x, e), e))
Отредактировано py.user.next (Янв. 17, 2020 01:02:52)
Офлайн
py.user.nextСпасибо, помогло, плюс в карму)
Надо эту задачу делать через рекуррентные соотношения (то есть функция факториала не используется).Надо формулу n-ого члена ряда поделить на формулу (n-1)-ого члена ряда. Это даст коэффициент, на который умножается каждый член ряда, чтобы получить следующий член ряда. Потом, начиная с первого члена ряда, нужно умножать член ряда на этот коэффициент; будет получаться следующий член ряда, который нужно прибавлять к частичной сумме. Таким образом, когда частичная сумма сойдётся к одному числу в пределах заданной точности (то есть при добавлении новых членов ряда частичная сумма в пределах заданной точности не будет меняться), можно прекратить вычисление.Для e^(-x) делал:
import math def emx(x, eps): s, s1, i = 0, 1, 1 while abs(s1 + (math.pow(x, i) / math.factorial(i))) > eps: s = s + s1 s1 = (math.pow(x, i) / math.factorial(i)) i = i + 1 return s print(emx(4, 0.01)) print(math.exp(4)) estimated_error = (math.exp(4))-(emx(4, 0.01)) print(estimated_error)
Отредактировано FishHook (Янв. 13, 2020 12:34:13)
Офлайн
Stanislav97Факториал не используется, написал же. Использование факториала в таких задачах - это ошибка.
вот оптимизированный код под конкретно мою задачуs1 = (math.pow(x, i) / math.factorial(i))
Отредактировано py.user.next (Янв. 13, 2020 13:11:29)
Офлайн
Сделал для e ^ x
#!/usr/bin/env python3 # вычисляет сумму ряда e ^ x с заданной точностью # # е ^ х = 1 + x / 1! + (x ^ 2) / 2! + ... + (x ^ n) / n! # import math def ex(x, eps): s, sl, psl, i = 0, 1, 0, 1 while abs(sl - psl) >= eps or x + 1 == i: s += sl psl = sl sl *= x / i i += 1 return s if __name__ == '__main__': print(math.exp(4)) for e in ( 1, 0.1, 0.01, 0.001, 0.0001, 0.00001, 0.000001, 0.0000001, ): x = 4 print('{} eps={}'.format(ex(x, e), e))
[guest@localhost py]$ ./row_ex.py
54.598150033144236
53.43174603174603 eps=1
54.54818021484688 eps=0.1
54.59398264287153 eps=0.01
54.5978829056501 eps=0.001
54.598136483106295 eps=0.0001
54.598147216543595 eps=1e-05
54.598149928148814 eps=1e-06
54.59815001423152 eps=1e-07
[guest@localhost py]$
Отредактировано py.user.next (Янв. 17, 2020 01:02:38)
Офлайн