3

テイラー級数を使って平方根を計算したいと思います。シリーズについて学んでいて、少しコードを書いたのですが、なぜうまくいかないのかわかりません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)    
4

1 に答える 1

4

2つの問題があります。1つはマイナーで、もう1つはメジャーです。マイナーな点は、展開がでは(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

または、テイラー級数を別のポイントで回すなど。

一般的なポイントは、テイラー級数の収束半径がゼロである可能性があることです。-その中で彼らは正しい結果を出します。ウィキペディアのテイラー級数ページには、これをカバーする「近似と収束」に関するセクションがあります。

(PS「二項」に「c」はありません。:^)

于 2013-01-26T14:48:30.930 に答える