使用泰勒级数求平方根
我想用泰勒级数来计算平方根。我刚开始学习这个系列,写了一些代码,但我不知道为什么它不工作,可能是我不应该把 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)
1 个回答
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时才能保证收敛。所以我们可以很好地计算小数字的根:
>>> 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
或者在不同的点上进行泰勒展开等等。
总的来说,泰勒级数有一个收敛半径——可能是零!——在这个范围内它们能给出正确的结果。维基百科的泰勒级数页面有一部分讲了“近似和收敛”,可以了解更多。
(顺便说一下,“binomial”里没有“c”。 :^)