你如何评估python中的衍生物?

5 python math sympy derivative

我是python的初学者.我最近了解了Sympy及其象征性操作功能,特别是差异化.我试图以最简单的方式执行以下操作:

  1. 定义f(x,y)= x ^ 2 + xy ^ 2.
  2. 区分f相对于x.所以f'(x,y)= 2x + xy ^ 2.
  3. 评估导数,例如,f'(1,1)= 2 + 1 = 3.

我知道如何做1和2.问题是,当我尝试评估步骤3中的导数时,我得到一个错误,python无法计算导数.这是一个最小的工作示例:

import sympy as sym
import math


def f(x,y):
    return x**2 + x*y**2


x, y = sym.symbols('x y')

def fprime(x,y):
    return sym.diff(f(x,y),x)

print(fprime(x,y)) #This works.

print(fprime(1,1)) 
Run Code Online (Sandbox Code Playgroud)

我希望最后一行打印3.它不会打印任何内容,并说"无法计算1衍生的wrt 1".

Bre*_*arn 6

你的功能fprime不是衍生品.它是一个返回导数的函数(作为Sympy表达式).要评估它,您可以使用.subs将值插入此表达式:

>>> fprime(x, y).evalf(subs={x: 1, y: 1})
3.00000000000000
Run Code Online (Sandbox Code Playgroud)

如果你想要fprime实际上是衍生物,你应该直接将衍生表达式分配给fprime,而不是将它包装在一个函数中.然后你可以evalf直接:

>>> fprime = sym.diff(f(x,y),x)
>>> fprime.evalf(subs={x: 1, y: 1})
3.00000000000000
Run Code Online (Sandbox Code Playgroud)


小智 2

这个问题的答案很简单。当然,subs另一个答案中给出的选项适用于评估某个数字的导数,但如果您想绘制导数,则它不起作用。有一种方法可以解决这个问题:lambdify,如下所述。

使用lambdaify将所有sympy函数(可以微分但不能求值)转换为它们的numpy对应函数(可以求值、绘图等,但不能微分)。例如,sym.sin(x) 将替换为 np.sin(x)。其想法是:使用 sympy 函数定义函数,根据需要进行微分,然后定义一个新函数,该函数是原始函数的 lambda 化版本。

如下面的代码所示,sym.lambdify 接受以下输入:

sym.lambdify(variable, function(variable), "numpy")

第三个输入“numpy”将 sympy 函数替换为其 numpy 对应函数。一个例子是:

def f(x):
    return sym.cos(x)

def fprime(x):
    return sym.diff(f(x),x)

fprimeLambdified = sym.lambdify(x,f(x),"numpy")
Run Code Online (Sandbox Code Playgroud)

然后函数fprime(x)返回-sym.sin(x),函数fprimeLambdified(x)返回-np.sin(x)。我们fprimeLambdified现在可以在特定的输入值上“调用”/评估,而我们不能“调用”/评估fprime,因为前者由 numpy 表达式组成,后者由 sympy 表达式组成。换句话说,输入是有意义的fprimelambdified(math.pi),这将返回一个输出,而fprime(math.pi)将返回一个错误。

sym.lambdify下面是一个在多个变量中使用的示例。

import sympy as sym
import math


def f(x,y):
    return x**2 + x*y**2


x, y = sym.symbols('x y')

def fprime(x,y):
    return sym.diff(f(x,y),x)

print(fprime(x,y)) #This works.

DerivativeOfF = sym.lambdify((x,y),fprime(x,y),"numpy")

print(DerivativeOfF(1,1))
Run Code Online (Sandbox Code Playgroud)