Как найти значение этой серии, используя python?

Я новичок в Python и его здорово! но я сталкиваюсь с трудностями в поиске результата этой серии:

 1-x+(x^2)/2!-(x^3)/3!+(x^4)/4!-..............up to n terms

что я написал было:

  import math
  a=input("ENter the no")
  x=input("ENter value of x")
  i=1
  s=0
  s1=0
  s2=1
  p=1
  while(i<=a):
          if(i%2!=0):
                    s=s-math.pow(x,i)/p*i
          else:
                     s1=s1+math.pow(x,i)/p*i
          i=i+1
  else:
              s2=s2+s1+s
              print s2

пожалуйста, дайте мне знать правильную программу и ошибки:)!! Заранее спасибо. дайте мне знать это без непосредственного использования факториальной функции?

2 ответа

Решение

Это развитие серии Тейлора exp(-x), Признание этого дает вам хорошую возможность сравнить свой результат с math.exp(-x),

Простые улучшения синтаксиса

Вам не нужно "еще" через некоторое время. Просто добавьте код для запуска после цикла на том же уровне отступа, что и до цикла while.

Математические проблемы

Самое главное, что вычисление факториала просто никогда не выполняется. Пишу p*i не хранит в p произведение p и i. Вы должны сделать это.

Затем возникает проблема с приоритетом оператора. Когда ты пишешь pow(...)/p*iPython понимает ( pow(...) / p ) * iЭто не то, что вы имеете в виду.

Наконец, большинство терминов в серии отменяются, но вы добавляете все положительные термины с одной стороны и все отрицательные термины с другой. Это означает, что вы вырастите два очень больших значения (и риск переполнения, если вы использовали целые числа), а затем возьмете разницу между ними, чтобы получить результат. Поскольку двойная точность на компьютере является конечной, это плохая практика с точки зрения точности. Лучше сохранить все слагаемые в вашей сумме с одинаковыми порядками величин.

Улучшено для правильности

import math
a=input("Enter the no")
x=input("Enter value of x")
s=1
p=1
for i in range(1,a):
    p=p*i
    if(i%2!=0):
        s=s-math.pow(x,i)/p
    else:
         s=s+math.pow(x,i)/p
print s
print math.exp(-x)

Обратите внимание, что использование цикла for и меньшего количества промежуточных сумм облегчает чтение.

Удаление ветки

pow(-x,i) отрицательный, если я неровный, положительный в противном случае. таким образом -pow(x,i) if i%2 != 0 else pow(x,i) можно переписать pow(-x,i), Удаление if во внутреннем цикле (почти?) Всегда полезно для производительности. Итак, упрощенная версия:

import math
a=input("Enter the no")
x=input("Enter value of x")
s=1
p=1
for i in range(1,a):
    p=p*i
    s=s+math.pow(-x,i)/p
print s
print math.exp(-x)

Это также имеет то преимущество, что делает код короче (и, следовательно, более читабельным).

import math    #imported to use the factorial function
def exp(x,n):
    ans = 1    #initializing it with 1 because the first term is a constant:1
    for i in xrange(1,n+1):   #starts looping from 1 to n terms 
        ans+=(-1**i*(float(x)**i)/math.factorial(i)) #changing the sign of 1, adding.
        # -1**i equals to 1 if i is even and -1 if i is odd
        # ** operator stands for the pow() function , (2**3 =8)
        # float(x) returns a floating value if value of x entered is integer
        # You can remove this is you are already entering floating values.
        # math.factorial() returns factorial of a given argument, 
    return ans

Если вы не хотите использовать math.factorial(), вы можете попробовать:

def exp(x,n):
    ans = 1
    dummy_factorial = 1
    for i in xrange(1,n+1):
        dummy_factorial*=i
        print dummy_factorial
        ans+=(-1**i*(float(x)**i)/(dummy_factorial))
    return ans
Другие вопросы по тегам