2013-01-26 3 views
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)  
+0

Оно 'python' вы должны пометить его как' python'. – ja72

+0

О какой момент вы хотите взять серию Тейлора? Если вы берете его о 'x = 0', он не определен. – ja72

+0

Удивительно, что ошибка от «x = 1» становится больше, чем больше терминов рассматриваются. – ja72

ответ

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 

Но это и следовало ожидать, потому что, как страница, которую вы связаны объясняет, что это только гарантированно сходится, когда абсолютное значение х меньше 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 

или принять ряд Тейлора вокруг другой точки и т.д.

Общий вынос в том, что ряд Тейлора имеют radius of convergence - возможно, ноль ! - в пределах которых они дают правильные результаты. На странице серии Wikipedia Taylor есть раздел «Приближение и конвергенция», который охватывает это.

(приписка Нет "с" в "бином":. ^)

+0

Большое спасибо за подробный ответ! –