如何使用python找到这个系列的价值?

时间:2014-12-30 09:32:53

标签: python series factorial

我是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 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

这是Taylor exp(-x)的系列开发。认识到这一点,您就有机会根据math.exp(-x)检查结果。

简单的语法改进

你不需要&#39;否则&#39;过了一会儿。只需将循环后的代码添加到与while循环之前相同的缩进级别。

数学问题

最重要的是,阶乘的计算根本就没有完成。写p*i不会将p和i的乘积存储在p中。你需要这样做。

然后,运算符优先级存在问题。当你写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)

这也有利于缩短代码(因此更易读)。