如何在不使用数学模块的情况下在python 3.5中计算taylor系列和Lewis Carrol divisbilty测试

时间:2016-06-23 22:09:04

标签: python python-3.x math taylor-series

就像标题所说,我需要找到Taylor系列,并在不使用Python 3.5中的数学模块的情况下编写可分性测试。我在一张纸上做数学计算,但实际上我从未在学校里教过这些东西中的任何一个,所以我老老实实地完全不知道如何将它们写在纸上。我已经做了相当多的工作,但我需要一些帮助来完成它。我有一个朋友告诉我有关用于编程的算法,所以我现在对此有点了解。看到我遇到的主要编程问题的真正长评论。

对于泰勒级数:在计算e^x / sin x / cos x的值时,程序应继续添加幂级数的项,直到达到绝对值小于{{0}的项。 }倍以前术语总和的绝对值。

公式:

10^-15

e^x = 1 + x + x^2/2! + x^3/3! + ...

cos x = 1- x^2/2! + x^4/4! - x6^/6! …

如果n是正整数:     N! = n×(n-1)×(n-2)×...×3×2×1

对于Lewis Carrol的可分性测试:

  • 只要该数字有多个数字,请删除单位数字并从结果数字中减去该数字来缩短数字。

  • 当且仅当最终数字等于零时,原始数字才能被11整除

CODE:

 #I don't know why, but for some reason n is automatically set to 5 once it is called in the recursion function for sin and cos x.
 #This causes the answers to for sin and cos x to be drastically incorrect.

 x = float(input("Please input a real number: "))
 def factorial(n):
      res = 1
      for i in range(1, n+1):
           res *= i
      return res

 def question1():
      ex = 1 + x
      for n in range(2,15):
          ex += (x**n)/factorial(n)
      print("e^{} = {}".format(x, ex))
 question1()

 def question2(): 
      cosx = 0
      for n in range(0, 15):
           cosx += ((-1)**n)/factorial(2*n)*(x**(2*n+1))
      print("cos {} = {}".format(x, cosx))
 question2()

 def question3():
      sinx = 0
      for n in range(0, 15):
           sinx += ((-1)**n)/factorial(2*n+1)*(x**(2*n+1)) 
      print("Sin {} = {}".format(x, sinx))
 question3()

 ##def question4():
 ##     while x > 9:
 ##          unit = x % 10
 ##          new_x = x // 10
 ##          print(new_x)
 ##          if new_x == 0:
 ##               break
 ##question4()

示例输出:

Please input a real number: 10
e^10.0 = 20188.170595424563
cos 10.0 = -10962.271813947433
Sin 10.0 = -1083.6650211561773
1.0
1.0
1.0
1.0
...

1 个答案:

答案 0 :(得分:0)

for函数question3()循环中的计算有很多错误。

  • (-1**n)中,**的优先级高于-。正确的表达式是((-1)**n)
  • 在除数中,(x*(2*n)+1)使用乘法而不是取幂。应该是:x**(...,而不是x*(...
  • 在除数中,*(更正为**)的优先级高于+1。应该是:(x**(2*n+1))
  • n -= 1无效,因为n会在循环的下一次迭代顶部立即反弹到新值。
  • 循环迭代器应该从零开始,而不是两个。

旧:

 for n in range(2, 15): #n is defined as 2 here
     sinx += (-1**n)/factorial((2*n+1))*(x*(2*n)+1)
     n -= 1

更好:

 for n in range(0, 15): #n is defined as 2 here
     sinx += ((-1)**n)/factorial(2*n+1)*(x**(2*n+1)) 

您仍然有逻辑错误。分配要求您在单个术语小于前一个总和的10**-15倍时终止循环。你根本没有实现它。

question2()包含以下错误:

  • -1**n应为(-1)**n
  • 你的除数中有一个无关的+1
  • 你的循环中有一个毫无意义的n -= 1

试试这个:

def question2():
     cosx = 0
     for n in range(0, 15):
          cosx += ((-1)**n)/factorial((2*n))*(x**(2*n))
     print(cosx)