使用泰勒级数求平方根

3 投票
1 回答
4092 浏览
提问于 2025-04-17 13:44

我想用泰勒级数来计算平方根。我刚开始学习这个系列,写了一些代码,但我不知道为什么它不工作,可能是我不应该把 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”。 :^)

撰写回答