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

时间:2017-05-30 18:59:27

标签: 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.
  4. 我知道如何做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)) 
    

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

3 个答案:

答案 0 :(得分:6)

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

>>> fprime(x, y).evalf(subs={x: 1, y: 1})
3.00000000000000

如果您希望fprime实际上是衍生物,则应将衍生表达式直接指定给fprime,而不是将其包装在函数中。然后你可以直接evalf

>>> fprime = sym.diff(f(x,y),x)
>>> fprime.evalf(subs={x: 1, y: 1})
3.00000000000000

答案 1 :(得分:1)

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

使用lambdify将所有的症状函数(可以区分但未评估)转换为它们的numpy对应物(可以进行评估,绘图等,但不区分)。例如,sym.sin(x)将替换为np.sin(x)。这个想法是:使用sympy函数定义函数,根据需要进行区分,然后定义一个新函数,它是原始函数的lambdified版本。

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

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

第三个输入," numpy",用他们的numpy同行取代了sympy功能。一个例子是:

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

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

fprimeLambdified = sym.lambdify(x,f(x),"numpy")

然后函数fprime(x)返回-sym.sin(x),函数fprimeLambdified(x)返回-np.sin(x)。我们现在可以在特定输入值上调用" /评估fprimeLambdified,而我们不能"调用" / evaluate fprime,因为前者由numpy表达式组成和后者的同情表达。换句话说,输入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))

答案 2 :(得分:0)

当您在函数fprime(x,y)中调用fprime(1,1)时,您将其称为sym.diff(f(1,1),1)

您必须为x使用不同的变量,并使用x

的值