Car*_*los 2 python automation sympy derivative
我正在尝试构建一个类,其目标是将函数的导数f也作为函数返回。我读过 Sympy 并开始尝试使用这个包。
假设我有一个只有一个参数的简单函数,如下所示:
def f1p(x):
return x**2 + 5**x * 2*x + 1
Run Code Online (Sandbox Code Playgroud)
现在,我有一种方法可以确保函数只有一个参数,然后计算导数(仅作为表达式):
from sympy import *
import inspect
def get_derivative(fun):
parameters=inspect.getargspec(f).args
if(len(parameters)>1):
raise ValueError('Function has more than one parameter.')
fdiff=fun(Symbol(parameters[0])).diff()
print(fdiff)
Run Code Online (Sandbox Code Playgroud)
假设它fdiff包含导函数的主要表达式,因此,我要解决的问题是返回一个函数以对其进行评估,例如:
f_deriv=get_derivative(f1p) #f_deriv is a callable function
print(f_deriv(a)) #Prints derivative value of f1p in a
Run Code Online (Sandbox Code Playgroud)
注意:我尝试过return eval/exec(diff)但不是一个好主意,因为需要声明参数。我还尝试用以下内容包装表达式:
eval('def foo('+parameters[0]+'):\n\treturn '+diff)
Run Code Online (Sandbox Code Playgroud)
这仍然不是一个好主意。
假设现在我们在基本函数中使用(例如)对数,因此,我们以这种方式实现它
import math
def f1p(x):
return x**2 + 5**x * 2*x + 1 + math.log(x)
Run Code Online (Sandbox Code Playgroud)
当我将上一个函数应用于此时,出现以下错误:
TypeError: can't convert expression to float
Run Code Online (Sandbox Code Playgroud)
这是由于 Sympy 无法理解math.log(x)。所以,我的问题是:
get_derivative函数返回一个可调用的函数?提前致谢。
您可以使用lambdify从您的get_derivative:
import inspect
from sympy import symbols, diff
from sympy.utilities.lambdify import lambdify
def get_derivative(function):
if len(inspect.getfullargspec(function).args) > 1:
raise ValueError('Function has more than one parameter.')
x = symbols('x')
return lambdify(x, diff(f1p(x), x))
Run Code Online (Sandbox Code Playgroud)
第一个f1p版本的检查结果:
def f1p(x):
return x**2 + 5**x * 2*x + 1
derivative = get_derivative(f1p)
derivative(1)
Run Code Online (Sandbox Code Playgroud)
这会给28.094379124341003. 这是一个正确的结果。
现在,如果你想使用对数,那么你应该使用来自sympy 的那个,而不是来自math:
from sympy import log
def f1p(x):
return x**2 + 5**x * 2*x + 1 + log(x)
derivative = get_derivative(f1p)
derivative(1)
Run Code Online (Sandbox Code Playgroud)
这会给29.094379124341003. 也正确。