Найти - Пользователи
Полная версия: вычисление суммы ряда e ^(x) с заданной точностью
Начало » Python для новичков » вычисление суммы ряда e ^(x) с заданной точностью
1
Stanislav97
Камрады, need help:
Задача - с заданой точностью ε, (0<ε<1), найти е^х=1+x/1!+x^2/2!+…+x^n/n!
проверить значение
py.user.next
Надо эту задачу делать через рекуррентные соотношения (то есть функция факториала не используется).

Надо формулу 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))

Здесь пример для синуса.


tags: row emx
Stanislav97
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)
в функции просто вводим значение и погрешность
py.user.next
Stanislav97
вот оптимизированный код под конкретно мою задачу
  
s1 = (math.pow(x, i) / math.factorial(i))
Факториал не используется, написал же. Использование факториала в таких задачах - это ошибка.
Делай без факториала, забудь про math.factorial().
Вообще забудь про модуль math, в учебных задачах надо функции модуля math писать самому.
py.user.next
Сделал для 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]$



tags: row ex
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB