在python中如何计算导数?

2024-03-29 00:04:29 发布

您现在位置:Python中文网/ 问答频道 /正文

我是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)) 

我希望最后一行打印3。它不打印任何东西,并说“不能计算一阶导数wrt 1”。


Tags: importreturn定义def方式符号步骤区分
3条回答

函数fprime不是派生函数。它是一个返回导数的函数(作为一个symphy表达式)。要计算它,可以使用.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

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

使用lambdify将所有sympy函数(可以区分但不能计算)转换为它们的numpy对应函数(可以计算、绘制等,但不能区分)。例如,sym.sin(x)将替换为np.sin(x)。其思想是:使用symphy函数定义函数,根据需要进行区分,然后定义一个新的函数,它是原始函数的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)。我们现在可以在特定的输入值处“调用”或“求值”,而不能“调用”或“求值”,因为前者由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))

当你在函数fprime(x,y)中调用fprime(1,1)时,你像这样调用它sym.diff(f(1,1),1)

你必须为x和x的值使用不同的变量

相关问题 更多 >