本文讲述如何用python的sympy、scipy工具包,求函数的二阶导数及 n 阶导数,文中代码和截图都选自Jupter notebook编辑环境。

先导入必要的工具包:

import sympy as smp import numpy as np import matplotlib.pyplot as plt import scipy as sp from scipy.misc import derivative

把数值变量 x 定义为符号:

x = smp.symbols('x')

例1(如图1),求f(x)和g(x)的一阶导数和二阶导数

用python算微积分(Python微积分导数3)(1)

图1说明:截图包括两行cell,都为markdown类型;上面一行为 函数表达式的显示形态,下面一行为函数表达式的输入形态。在输入状态行,按Ctrl Enter键运行该行cell,即可显示上一行内容。

def f(x): return x**4 3*x**2 def g(x): return -x**4-3*x**2

# 定义函数 def df(x): return 4*x**3 6*x def df(x): return -4*x**3-6*x df(1) -10 (x =1, df(1) 的计算结果) dg(-0.2) 1.2320000000000002 (x = -0.2, dg(-0.2) 的计算结果)

def ddf(x): return 12*x**2 6 def ddg(x): return -12*x**2-6 ddf(1) 18 (当x =1时, ddf(x)的计算结果) ddg(-0.2) -6.48 (当x = -0.2时, ddg(x)的计算结果)

例2(如图2),求f(x)的一阶导数和二阶导数

用python算微积分(Python微积分导数3)(2)

图2说明:(见图1说明)

def f(x): return 5*x**3 - 3*x

x = smp.symbols('x') smp.diff(f(x),x) #(计算结果如下) 15x*x -3

smp.diff(f(x),x,2) #(计算结果如下) 30x

例3,求f(x)的 n 阶导数

例3-1:求f(x) = sin(x) 的 n 阶导数

def f(x): return smp.sin(x) d3f = smp.diff(f(x), x, 3) # 其中的 3 ,表示求 3 阶导数 d3f #(计算结果) -cos(x) d4f = smp.diff(f(x), x, 4) # 其中的 4 ,表示求 4 阶导数 d4f #(计算结果) sin(x)

有些函数很复杂,即使函数表达非常明确,但是人工求解这类函数的 n 阶导数很难, 如例 3-2。

例3-2(如图3),求f(x)的 n 阶导数

用python算微积分(Python微积分导数3)(3)

图3说明:(见图1说明)

x, a, b, c = smp.symbols('x a b c', real=True)

def f(x): return smp.exp(-a*smp.sin(x**2)) * smp.sin(b**x) * smp.log(c*smp.sin(x)**2 /x)

d4f = smp.diff(f(x), x, 4) d4f

计算结果略去,非常复杂啊!

d4f.subs([(x,0.5),(a,1),(b,2),(c,3)]).evalf() (计算结果) −34.8746096991241

,