python - 使用 Sympy 返回自动导数

标签 python automation sympy derivative

我正在尝试构建一个类,其目标是将函数 f 的导数也作为函数返回。我读过有关 Sympy 的内容,并开始尝试使用这个包。

主要问题

假设我有一个只有一个参数的简单函数,如下所示:

def f1p(x):
    return x**2 + 5**x * 2*x + 1

现在,我有一种方法可以确保函数只有一个参数,然后计算导数(仅作为表达式):

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)

假设fdiff包含导数函数的主要表达式,因此,我要解决的问题是返回一个函数以便对其求值,例如:

f_deriv=get_derivative(f1p) #f_deriv is a callable function 
print(f_deriv(a)) #Prints derivative value of f1p in a

注意:我尝试过return eval/exec(diff),但这是一个坏主意,因为需要声明参数。我还尝试用以下内容包装表达式:

eval('def foo('+parameters[0]+'):\n\treturn '+diff)

但这仍然不是一个好主意。

扩展主要问题

假设现在我们在基函数中使用(例如)对数,所以我们这样实现

import math
def f1p(x):
    return x**2 + 5**x * 2*x + 1 + math.log(x)

当我将之前的函数应用于此时,出现以下错误:

TypeError: can't convert expression to float

这是因为 Sympy 无法理解 math.log(x)。所以,我的问题是:

  • 解决主要问题:有没有办法从 get_derivative 函数返回可调用函数?
  • 解决扩展问题:有没有办法将 sympy 表达式转换为 Python 可计算表达式?

提前致谢。

最佳答案

您可以使用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))

检查第一个 f1p 版本的结果:

def f1p(x):
    return x**2 + 5**x * 2*x + 1


derivative = get_derivative(f1p)
derivative(1)

这将给出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)

这将给出29.094379124341003。也正确。

关于python - 使用 Sympy 返回自动导数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48239332/

相关文章:

python - 为什么方法没有引用相等性?

Python 从命令行导入

java - getTitle() 函数在 Selenium Web 驱动程序中返回不正确的结果

android - 比较 Appium 和 MonkeyTalk 之间用于 Android 应用程序测试的工具

python - Sympy - 合理化表达式中的所有数值? (就像 Mathematica 的 Rationalize[])

python - Sympy 中的十进制日志

python - Sympy——找到最小化到三个圆周的距离的点

python - 如何使用 pandas 消除该图中的外部值?

python - 如何在 Python 中查找字符串中的 x

windows - 归档具有特定扩展名的文件