How to do a symbolic taylor expansion of an unknown function $f(x)$ using sympy

后端 未结 2 1807
被撕碎了的回忆
被撕碎了的回忆 2021-02-20 10:43

In sage it is fairly easy to do a Taylor expansion of an unknown function f(x),

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


        
相关标签:
2条回答
  • 2021-02-20 11:09

    As @asmeurer described, this is now possible with

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

    or

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

    both returns

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

    If you want a finite difference approximation, you can for example write

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

    to get the forward approximation, which returns

                                      ⎛  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
    
    0 讨论(0)
  • 2021-02-20 11:35

    There is no function for this in sympy, but it's rather easy to do it "by hand":

    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)
    

    Note that sympy typically works with expressions (like f(x)) and not with bare functions (like f).

    0 讨论(0)
提交回复
热议问题