2013-06-01 8 views
7

В sage это довольно легко сделать разложение Тейлора неизвестной функции Р (х),

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

Как это можно сделать в sympy?


Update

asmeurer указывает на то, что это функция, которая будет доступна в ближайшее время в SymPy из запроса тянуть http://github.com/sympy/sympy/pull/1888. Я установил филиал с помощью пип,

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

Однако, когда я пытаюсь вычислить ряд F (х),

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

Я получаю следующее сообщение об ошибке,

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

+0

Вы не можете. Просто используйте цикл и 'diff'. И функция называется 'серия', а не' taylor'. – Krastanov

+1

Существует запрос на растяжение, чтобы сделать эту работу на https://github.com/sympy/sympy/pull/1888. – asmeurer

+0

@asmeurer фантастический! Это не было объединено в мастер-ветку, возможно ли установить это с помощью pip. Или мне нужно клонировать репо, применять патч, а затем строить из источника? –

ответ

5

Для этого нет никакой функции, но это довольно легко сделать «вручную»:

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) 

Обратите внимание, что sympy обычно работает с выражениями (например, f(x)), а не с голой функцией (например, f).

8

Как @asmeurer описано, теперь это возможно с

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)) 

или

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

как возвращается

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

Если вы хотите разностного приближение, вы можете, например, написать письмо

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

, чтобы получить вперед приближение, которое возвращает

        ⎛ 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