Как найти значение этой серии, используя 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*i
Python понимает ( 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