python - python函数的泰勒级数sympy表达式
问题描述
我有一个非常复杂的非线性函数 f。我想以值 x 的函数 f 的 sympy 表达式的形式获得泰勒级数直到 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)
解决方案
以下代码与您要查找的代码接近。这样做是为了解析您希望展开为泰勒级数的函数的代码,使用 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))
推荐阅读
- elasticsearch - Elasticsearch 使用过滤器和通配符构建产品查询
- python - 如何可视化来自 DataFrame 的数据序列
- visual-studio - 如何在 Visual Studo 2017 中自动添加扩展?
- reactjs - 我无法删除 react-final-form-array 的一行,并且它重置无法正常工作
- apache-camel - Camel - ActiveMQ 对空队列做出反应
- spring-boot - Spring Cloud Gateway 负载均衡类型
- java - 某些图像无法在适配器上加载(滑翔)
- python - 如何在kivy中使用其他包?
- python - PyQt 应用程序中的非阻塞 IPython Qt 控制台
- javascript - 发生onclick事件时如何将每个段落存储到javascript数组中?