文章目录
Part.I Introduction
本文将介绍如何用 Python 来求导。求导法则戳我,可以用 Python 来检验自己笔算求导的结果是否正确。
需要的包有
- sympy:符号工具包
- scipy:科学计算包
from sympy import *
from scipy.stats import *
Part.II 基础知识
在正式开始之前,首先需要了解下面的一些基础知识。
Chap.I 特殊量的表示
在求积分的过程中,会用到许多像『无穷大』、『PI』等特数量,它们在sympy
库中是如何表示的呢?下面一个表格对它们进行了汇总
代码表示 | 符号 | 含义 |
---|---|---|
pi | π \pi π | 圆周率 |
oo | ∞ \infty ∞ | 无穷大 |
-oo | − ∞ -\infty −∞ | 负无穷大 |
exp(x) | e x e^x ex | 自然常数的 x 次幂 |
log(x) | l n ( x ) ln(x) ln(x) | 以自然常数为底的对数 l o g e x log_ex logex |
erf(x) | erf ( x ) \operatorname{erf}(x) erf(x) | 误差函数 erf ( x ) = 2 π ∫ 0 x e − t 2 d t \operatorname{erf}(x)=\frac{2}{\sqrt{\pi}}\int_{0}^{x} e^{-t^2}dt erf(x)=π2∫0xe−t2dt |
erfc(x) | erfc ( x ) \operatorname{erfc}(x) erfc(x) | 误差函数补 erfc ( x ) = 1 − erfc ( x ) \operatorname{erfc}(x)=1-\operatorname{erfc}(x) erfc(x)=1−erfc(x) |
erfi(x) | erfci ( x ) \operatorname{erfci}(x) erfci(x) | 虚误差函数 erfci ( x ) = − i erf ( i x ) = 2 π ∫ 0 x e t 2 d t \operatorname{erfci}(x)=-i\operatorname{erf}(ix)=\frac{2}{\sqrt{\pi}}\int_{0}^{x}e^{t^2}dt erfci(x)=−ierf(ix)=π2∫0xet2dt |
Chap.II diff 函数简析
diff 函数的一般用法为:
diff(func,x,n)
其中
func
是要求导的函数x
是要对其求导的变量n
是可选的,表示求n阶导数,默认为1阶导数
Part.III 求导实例
Chap.I 导数
一阶导数
求下面函数的一阶导数
f
1
(
x
)
=
c
o
s
(
x
)
f_1(x)=cos(x)
f1(x)=cos(x)
代码如下:
def firstDerivative_a():
""" 一阶导数 """
x = symbols('x')
print(diff(cos(x), x))
return
结果为
-sin(x)
即
f
1
′
(
x
)
=
−
s
i
n
(
x
)
f_1'(x)=-sin(x)
f1′(x)=−sin(x)
二阶导数
求下面函数的二阶导数
f
2
(
x
)
=
c
o
s
2
(
x
)
f_2(x)=cos^2(x)
f2(x)=cos2(x)
代码如下:
def secondDerivative_a():
""" 二阶导数 """
x = symbols('x')
print(diff(cos(x)**2, x ,2))
return
结果为
2*(sin(x)**2 - cos(x)**2)
即
f
2
′
′
(
x
)
=
2
[
s
i
n
2
(
x
)
−
c
o
s
2
(
x
)
]
f''_2(x)=2[sin^2(x)-cos^2(x)]
f2′′(x)=2[sin2(x)−cos2(x)]
Chap.II 偏导数
一阶偏导数
求下面函数的一阶偏导数
g
(
x
,
y
)
=
c
o
s
(
x
2
y
)
x
2
+
y
2
+
1
g(x,y)=\frac{cos(x^2y)}{x^2+y^2+1}
g(x,y)=x2+y2+1cos(x2y)
代码如下:
def firstPartialDerivative_a():
""" 一阶偏导数 """
x, y = symbols('x y')
g = cos(x**2*y)/(x**2+y**2+1)
dx = diff(g, x)
dy = diff(g, y)
print("对x的一阶偏导:", dx)
print("对y的一阶偏导:", dy)
return
结果为
对x的一阶偏导: -2*x*y*sin(x**2*y)/(x**2 + y**2 + 1) - 2*x*cos(x**2*y)/(x**2 + y**2 + 1)**2
对y的一阶偏导: -x**2*sin(x**2*y)/(x**2 + y**2 + 1) - 2*y*cos(x**2*y)/(x**2 + y**2 + 1)**2
即
g
x
′
(
x
,
y
)
=
−
2
x
y
⋅
s
i
n
(
x
2
y
)
x
2
+
y
2
+
1
−
2
x
⋅
c
o
s
(
x
2
y
)
(
x
2
+
y
2
+
1
)
2
g_x'(x,y)=\frac{-2xy\cdot sin(x^2y)}{x^2+y^2+1}-\frac{2x\cdot cos(x^2y)}{(x^2+y^2+1)^2}
gx′(x,y)=x2+y2+1−2xy⋅sin(x2y)−(x2+y2+1)22x⋅cos(x2y)
g y ′ ( x , y ) = − x 2 ⋅ s i n ( x 2 y ) x 2 + y 2 + 1 − 2 y ⋅ c o s ( x 2 y ) ( x 2 + y 2 + 1 ) 2 g_y'(x,y)=\frac{-x^2\cdot sin(x^2y)}{x^2+y^2+1}-\frac{2y\cdot cos(x^2y)}{(x^2+y^2+1)^2} gy′(x,y)=x2+y2+1−x2⋅sin(x2y)−(x2+y2+1)22y⋅cos(x2y)
二阶偏导数
求下面函数的二阶偏导数
g
(
x
,
y
)
=
c
o
s
(
x
2
y
)
x
2
+
y
2
+
1
g(x,y)=\frac{cos(x^2y)}{x^2+y^2+1}
g(x,y)=x2+y2+1cos(x2y)
代码如下:
def secondPartialDerivative_a():
""" 二阶偏导数 """
x, y = symbols('x y')
g = cos(x**2*y)/(x**2+y**2+1)
dx = diff(g, x, 2)
dy = diff(g, y, 2)
print("对x的二阶偏导:", dx)
print("对y的二阶偏导:", dy)
return
结果为
对x的二阶偏导:
2*(4*x**2*y*sin(x**2*y)/(x**2 + y**2 + 1) -
y*(2*x**2*y*cos(x**2*y) + sin(x**2*y)) +
(4*x**2/(x**2 + y**2 + 1) - 1)*cos(x**2*y)/(x**2 + y**2 + 1))/(x**2 + y**2 + 1)
----------------------------------------
对y的二阶偏导:
(-x**4*cos(x**2*y) +
4*x**2*y*sin(x**2*y)/(x**2 + y**2 + 1) +
2*(4*y**2/(x**2 + y**2 + 1) - 1)*cos(x**2*y)/(x**2 + y**2 + 1))/(x**2 + y**2 + 1)
结果太复杂,就不写公式了。