Ряд Тейлора sympy выражение функции питона - PullRequest
0 голосов
/ 30 декабря 2018

У меня очень сложная нелинейная функция f.Я хочу получить ряд Тейлора до степени n в форме выражения sympy для функции f со значением x.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

Inаналогичным образом я хочу вычислить get_polynomial(f, 0, 3)

1 Ответ

0 голосов
/ 01 января 2019

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