泰勒级数python函数的sympy表达式

时间:2018-12-30 19:29:47

标签: python math sympy taylor-series

我有一个非常复杂的非线性函数f。我想以值为x的函数f的符号表达式的形式获得泰勒级数,直到度为n。 f是一个常规的python函数,而不是sympy表达式。 get_polynomial的输出应该是一个sympy表达式。

是否有任何功能将获得泰勒级数?

from math import sin, cos, log, e

def f(x):
    # a very complicated function
    y = sin(x) + cos(x) + log(abs(x)+2)**2/e**2 + sin(cos(x/2)**2) + 1
    return y

def get_polynomial(function, x, degree):
    #    .......
    #    using Taylor Series
    #    .......
    return sympy_expression_for_function_at_value_x

输出:

get_polynomial(sin, 0, 3) ---> 0 + x + 0*x**2 + (1/6)*x**3
get_polynomial(lambda x: e**x, 0, 1) --> 1 + x

我想以类似的方式计算get_polynomial(f, 0, 3)

1 个答案:

答案 0 :(得分:1)

以下代码与您要寻找的很接近。这样做是为了解析您希望扩展为泰勒级数的函数的代码,然后使用Sympy将其转换为符号表示,然后计算泰勒级数。

一个限制是您需要具有显式的函数定义,因此您不能使用lambda表达式。这可以通过进一步的工作来解决。否则,代码将满足您的要求。请注意,在定义函数时,该函数必须包含一行y = ...形式的行,此代码才能起作用

from inspect import *
import sympy

def f(x):
    # a very complicated function
    y = sin(x) + cos(x) + log(abs(x)+2)**2/e**2 + sin(cos(x/2)**2) + 1
    return y

def my_sin(x):
    y = sin(x)
    return y

def my_exp(x):
    y = e**x
    return y 


x = sympy.Symbol('x')

def get_polynomial(function, x0, degree):
    # parse function definition code

    lines_list  = getsource(function).split("\n")
    for line in lines_list:
        if '=' in line:
            func_def = line

    elements = func_def.split('=')
    line = ' '.join(elements[1:])
    sympy_function = sympy.sympify(line)

    # compute taylor expansion symbolically 
    i = 0
    taylor_exp = sympy.Integer(0)
    while i <= degree:
        taylor_exp = taylor_exp + (sympy.diff(sympy_function,x,i).subs(x,x0))/(sympy.factorial(i))*(x-x0)**i
        i += 1


    return taylor_exp

print (get_polynomial(my_sin,0,5))
print (get_polynomial(my_exp,0,5))
print (get_polynomial(f,0,5))