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

python函数的泰勒级数辛表达式,python,math,sympy,taylor-series,Python,Math,Sympy,Taylor Series,我有一个非常复杂的非线性函数f。我想得到泰勒级数,直到n阶,函数f在x值的辛表达式形式。 f是一个常规python函数,而不是symphy表达式。get_多项式的输出应该是一个辛表达式 有没有函数可以得到函数的泰勒级数 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

我有一个非常复杂的非线性函数f。我想得到泰勒级数,直到n阶,函数f在x值的辛表达式形式。 f是一个常规python函数,而不是symphy表达式。get_多项式的输出应该是一个辛表达式

有没有函数可以得到函数的泰勒级数

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_多项式f,0,3,下面的代码与您要查找的代码非常接近。这样做的目的是将函数的代码解析为泰勒级数,使用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))

我认为您希望输入函数是一个常规Python函数,但希望输出多项式是一个辛多项式,这是正确的吗?如果是这样的话,由于Python中的浮点计算只是近似的,您如何期望Python中的近似函数在Symphy中产生精确的输出?或者您希望您的输入函数是一个symphy函数,就像在可能的重复注释中的链接中一样?是的,输入函数应该是一个常规python函数,输出函数应该是一个symphy表达式@rorydaulton,那么实际上不可能获得例如sin的多项式中的值1/6。Python浮点甚至不能精确存储该值,更不用说计算它了。Python例程可以得到接近1/6的常数,但不完全等于它。你可以将该值近似为一个分数,但你需要给出某种公差,并且你可以得到一个实际应该是无理的值的假分数。输出多项式应该有多精确?由于您只需要泰勒级数的前n个成员,您已经接受了一些错误。感谢您的努力。你的解决方案似乎很有效。如果我们能得到系数的简化值,那就太好了。e、 g.在get_多项式中,如果我们可以得到x**2的系数为1/2或0.5或~0.5,而不是loge**2/2,那么在编写函数时只需使用e而不是e,例如y=e**x而不是y=e**x。