本文讲述如何用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说明:截图包括两行cell,都为markdown类型;上面一行为 函数表达式的显示形态,下面一行为函数表达式的输入形态。在输入状态行,按Ctrl Enter键运行该行cell,即可显示上一行内容。
- 用python自定义函数表述函数f(x)和g(x):
def f(x): return x**4 3*x**2
def g(x): return -x**4-3*x**2
- 求例 1 中f(x)和g(x)的一阶导数:
# 定义函数
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) 的计算结果)
- 求例 1 中f(x)和g(x)的二阶导数:
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说明:(见图1说明)
- 定义函数:
def f(x): return 5*x**3 - 3*x
- 求例题 2 中f(x)的一阶导数:
x = smp.symbols('x')
smp.diff(f(x),x)
#(计算结果如下)
15x*x -3
- 求例题 2 中f(x)的二阶导数:
smp.diff(f(x),x,2)
#(计算结果如下)
30x
例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 阶导数
图3说明:(见图1说明)
- 定义符号
x, a, b, c = smp.symbols('x a b c', real=True)
- 定义例 3-2 中f(x)计算表达式的函数
def f(x):
return smp.exp(-a*smp.sin(x**2)) * smp.sin(b**x) * smp.log(c*smp.sin(x)**2 /x)
- 求例 3-2 中f(x)的 4 阶导数
d4f = smp.diff(f(x), x, 4)
d4f
计算结果略去,非常复杂啊!
- 给定x, a, b, c的值,计算例 3-2 中f(x)的4阶导数的值
d4f.subs([(x,0.5),(a,1),(b,2),(c,3)]).evalf()
(计算结果)
−34.8746096991241