我想用泰勒系列计算平方根。我刚刚学习了这个系列,我写了一些代码,但我不知道为什么它不起作用,也许我不应该向i
提供它?请有人向我解释我做错了什么吗?
我有来自http://en.wikipedia.org/wiki/Taylor_series#List_of_Maclaurin_series_of_some_common_functions
的公式from math import sqrt
def factorial(n):
result = 1
for i in range(2, n+1):
result *= i
return result
def binomical(alpha, n):
result = 1
for i in range(0, n):
result *= (alpha - i)
return result / factorial(n)
for i in range(1, 10):
x = sum(binomical(0.5, k) * i ** k for k in range(10))
print x, sqrt(i)
答案 0 :(得分:4)
有两个问题,一个是小问题,一个是主要问题。未成年人的扩展是根据(1+x)^alpha
而不是x^alpha
编写的,因此您的i**k
应该是(i-1)**k
。这样做会改变你的输出
1.41920471191 1.0
5.234375 1.41421356237
在哪里可以看到sqrt(1)
对sqrt(2)
的回答是多么可疑地关闭
1.0 1.0
1.41920471191 1.41421356237
哪个更好。不幸的是,剩余的条款仍然不是很好:
5.234375 1.73205080757
155.677841187 2.0
2205.0 2.2360679775
17202.2201691 2.44948974278
91687.28125 2.64575131106
376029.066696 2.82842712475
1273853.0 3.0
并且将术语总数从10增加到100会使事情变得更糟:
1.0 1.0
1.4143562059 1.41421356237
1.2085299569e+26 1.73205080757
3.68973817323e+43 2.0
9.21065601505e+55 2.2360679775
3.76991761647e+65 2.44948974278
2.67712017747e+73 2.64575131106
1.16004174256e+80 2.82842712475
6.49543428975e+85 3.0
但这是可以预料到的,因为当您链接的页面解释时,只有当x的绝对值小于1时,才能保证收敛。因此,我们可以很好地获得小数字的根:< / p>
>>> i = 0.7
>>> sum(binomical(0.5, k) * (i-1) ** k for k in range(10))
0.8366601005565644
>>> i**0.5
0.8366600265340756
我们可以尝试缩小规模来处理其他数字:
>>> i0 = 123.0
>>> i = i0/(20**2)
>>> sum(binomical(0.5, k) * (i-1) ** k for k in range(50))
0.5545268253462641
>>> _*20
11.090536506925282
>>> i0**0.5
11.090536506409418
或将泰勒系列带到不同的点等等。
一般的外卖是泰勒系列有radius of convergence - 可能为零! - 他们在其中给出正确的结果。维基百科泰勒系列页面有一个关于“近似和收敛”的部分,它涵盖了这一点。
(P。在“二项式”中没有“c”。:^)