Следующий код близок к тому, что вы ищете.Что это делает для анализа кода функции, которую вы хотите расширить в ряд Тейлора, преобразовать ее в символическое представление с помощью Sympy и затем вычислить расширение Тейлора.
Одно ограничение заключается в том, что вам нужно иметьявное определение функции, поэтому вы не можете использовать лямбда-выражения.Это можно решить с помощью дальнейшей работы.В противном случае код делает то, что вы просите.Обратите внимание, что когда вы определяете функцию, она должна содержать строку вида 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))