2013-06-01 10 views
7

W sage jest to dość łatwe do zrobienia Taylor ekspansji nieznanej funkcji f (x),

x = var('x') 
h = var('h') 
f = function('f',x) 
g1 = taylor(f,x,h,2) 

Jak to zrobić w sympy?


Aktualizacja

asmeurer wskazuje, że jest to funkcja, która będzie dostępna wkrótce w sympy z żądania ciągnącej http://github.com/sympy/sympy/pull/1888. Zainstalowałem gałąź używając PIP

pip install -e [email protected]:renatocoutinho/[email protected]#egg=sympy --upgrade 

Jednak gdy próbuję wyliczyć szereg f (x),

x, h = symbols("x,h") 
f = Function("f") 
series(f,x,x+h) 

otrzymuję następujący błąd,

TypeError: unbound method series() must be called with f instance as first argument (got Symbol instance instead)

+0

nie można. Po prostu użyj pętli i 'diff'. A funkcja nazywa się "serią", a nie "taylor". – Krastanov

+1

Istnieje żądanie pobrania, aby działało to na https://github.com/sympy/sympy/pull/1888. – asmeurer

+0

@memeurer fantastic! To nie zostało scalone z odgałęzieniem głównym, czy nadal można to zainstalować za pomocą pip. Czy muszę sklonować repozytorium, zastosować poprawkę, a następnie skompilować ją ze źródła? –

Odpowiedz

5

Nie ma na to żadnej funkcji, ale dość łatwo zrobić to "ręcznie":

In [3]: from sympy import * 
     x, h = symbols('x, h') 
     f = Function('f') 
     sum(h**i/factorial(i) * f(x).diff(x, i) for i in range(4)) 

Out[3]: h**3*Derivative(f(x), x, x, x)/6 + h**2*Derivative(f(x), x, x)/2 + h*Derivative(f(x), x) + f(x) 

Zauważ, że sympy zwykle działa z wyrażeniami (np. f(x)), a nie z gołymi funkcjami (takimi jak f).

8

Jak @asmeurer opisane, teraz jest to możliwe dzięki

from sympy import init_printing, symbols, Function 
init_printing() 

x, h = symbols("x,h") 
f = Function("f") 

pprint(f(x).series(x, x0=h, n=3)) 

lub

from sympy import series 
pprint(series(f(x), x, x0=h, n=3)) 

obu zwrotów

           ⎛ 2  ⎞│       
              2 ⎜ d   ⎟│       
            (-h + x) ⋅⎜────(f(ξ₁))⎟│       
               ⎜ 2  ⎟│       
       ⎛ d  ⎞│     ⎝dξ₁  ⎠│ξ₁=h ⎛  3  ⎞ 
f(h) + (-h + x)⋅⎜───(f(ξ₁))⎟│  + ──────────────────────────── + O⎝(-h + x) ; x → h⎠ 
       ⎝dξ₁  ⎠│ξ₁=h    2          

Jeśli chcesz przybliżenie różnic skończonych, można na przykład napisz

FW = f(x+h).series(x+h, x0=x0, n=3) 
FW = FW.subs(x-x0,0) 
pprint(FW) 

aby uzyskać przybliżenie do przodu, która zwraca

        ⎛ 2  ⎞│ 
           2 ⎜ d   ⎟│ 
           h ⋅⎜────(f(ξ₁))⎟│ 
            ⎜ 2  ⎟│ 
      ⎛ d  ⎞│   ⎝dξ₁  ⎠│ξ₁=x₀ ⎛ 3 2  2 3     ⎞ 
f(x₀) + h⋅⎜───(f(ξ₁))⎟│  + ────────────────────── + O⎝h + h ⋅x + h⋅x + x ; (h, x) → (0, 0)⎠ 
      ⎝dξ₁  ⎠│ξ₁=x₀    2