购买
下载掌阅APP,畅读海量书库
立即打开
畅读海量书库
扫码下载掌阅APP

3.4 使用SymPy进行符号微分和积分

有时,你可能需要对一个不是简单多项式的函数进行微分,而且可能需要以某种自动化的方式来完成。例如,你需要编写教育软件。Python科学栈包含一个名为SymPy的软件包,它允许我们在Python中创建和操作符号数学表达式。特别是,SymPy可以像数学家一样对符号函数进行微分和积分。

在本节中,我们将创建一个符号函数,然后使用SymPy库对该函数进行微分和积分。

3.4.1 准备工作

与其他一些科学Python软件包不同,文献中似乎没有导入SymPy的标准别名。相反,文档在多处使用了星号导入,这与PEP8风格指南不一致。这可能是为了让数学表达式更自然。为了避免与scipy软件包的标准缩写sp(这也是sympy的自然选择)相混淆,我们将简单地以其全称sympy导入模块:

在本例中,我们将定义一个表示以下函数的符号表达式:

f ( x ) = ( x 2 -2 x )e 3 -x

然后,我们看看如何对该函数进行符号微分和积分。

3.4.2 实现方法

使用SymPy软件包进行符号微分和积分(就像手工计算一样)非常简单。请按照以下步骤操作。

1.导入SymPy后,我们将定义出现在表达式中的符号。该符号是一个Python对象,它没有特定的值,就像数学变量一样,但可以在公式和表达式中使用,同时表示许多不同的值。在本方法中,我们只需要为 x 定义一个符号,因为除此之外我们只需要常量符号和函数。我们使用sympy中的symbols例程来定义新符号。为了保持符号的简洁性,我们将这个新符号命名为x:

2.使用symbols函数定义的符号支持所有算术运算,因此我们可以直接使用刚刚定义的符号x构建表达式:

3.现在,我们可以使用SymPy的符号微积分功能来计算f的导数,也就是对f进行微分。我们可以使用SymPy中的diff例程来实现这一点,该例程能实现符号表达式关于指定符号的微分,并返回一个导数表达式。这个导数表达式通常不是以最简单的形式表示的,因此我们使用sympy.simplify例程来简化结果:

4.通过与使用乘法法则手工计算出的导数相比较,我们可以检查使用SymPy进行符号微分的结果是否正确,该导数定义的SymPy表达式如下所示:

5.SymPy的相等性测试能够验证两个表达式是否相等,而不是测试它们在符号上是否等价。因此,首先简化要测试的两个表达式的差值,并测试该差值是否为0:

6.我们可以使用SymPy的integrate函数对导数fp进行积分,并检查积分结果是否等于f。同时,提供要进行积分的符号作为第二个可选参数也是一个好主意:

正如我们所见,对导数fp进行积分的结果就是原始函数f(尽管从技术上来说,缺少了积分常数 C )。

3.4.3 原理解析

SymPy定义了各种类来表示特定类型的表达式。例如,由Symbol类表示的符号就是原子表达式的例子。表达式的构建方式与Python从源代码中构建抽象语法树的方式类似。然后可以使用方法和标准算术运算来操作这些表达式对象。

SymPy还定义了标准数学函数,可以对Symbol对象进行操作以创建符号表达式。SymPy最重要的功能是能够执行符号微积分,而不是本章余下部分将探讨的数值微积分,并给出微积分问题的精确解(有时称为解析)。

SymPy包中的diff例程会对这些符号表达式进行微分。该例程的结果通常不是最简形式,因此我们在例子中使用了simplify例程来简化导数。integrate例程是将scipy表达式对给定符号进行符号积分。(diff例程也接受一个符号参数,用于指定微分的符号变量)。这将返回一个表达式,其导数就是原始表达式。此例程不会添加积分常数,这是手工积分时的良好做法。

3.4.4 更多内容

SymPy能做的远不止简单的代数和微积分。它包含数学各个领域的子模块,如数论、几何和其他离散数学(如组合学)。

SymPy表达式(函数)可以构建到Python函数中,并应用于NumPy数组,这是通过sympy.utilities模块中的lambdify例程实现的。它会将SymPy表达式转换为数值表达式,并使用SymPy标准函数的NumPy等价函数对表达式进行数值计算。其结果类似于定义一个Python Lambda匿名函数,它因此得名。例如,我们可以使用lambdify例程将此例中的函数和导数转换为Python函数:

lambdify例程需要两个参数。第一个是要提供的变量,即前面代码块中的x,第二个是调用此函数时要求值的表达式。例如,我们可以将先前定义的经过lambdify处理的SymPy表达式当作普通Python函数来求值:

我们甚至可以在NumPy数组上计算这些经过lambdify处理的表达式(像往常一样,将NumPy导入为np):

注意

lambdify例程使用Python的exec例程来执行代码,因此不应与未经过初始化的输入一起使用。 EgBEyG2UzC50UL+MqGLBDZr4v39u8BDPuv4Ox3MyW6tXSzkg3KiN2PSQzZ9U4+Zp

点击中间区域
呼出菜单
上一章
目录
下一章
×

打开