微积分的计算也许平时用不到,会让人觉得有点高深。但其实它在数学专业的人眼中,也不过是一种极其普通的计算,是一种和加减乘除差不多的级别的常用计算方式。
微积分和求极限运算本身不是很难,只是它们的计算规则不像加减乘除那么简单。它们的计算过程中需要使用很多计算规则(这些不太容易记住),就像计算三角函数要记住很多三角函数的公式和定理一样。
使用 Sympy
可以有效减轻这方面的负担,让我们用编程的方式来解决微积分问题。
1. 极限计算
极限计算的应用场景很广,也是学习微积分的前置步骤。
1.1. 函数极限
比如这个简单的函数limx→∞1x\lim\limits_{x\rarr\infty}\frac{1}{x}x→∞limx1,我们想知道它在x
趋于无穷大时的值,普通的加减乘除算法就无法运算。用 Sympy
来计算:
from sympy import Symbol, Limit, S
Limit(1/x, x, S.Infinity).doit()
#运行结果
0
当 x 趋向于0时,
Limit(1/x, x, 0).doit()
#运行结果,下面的符号表示正无穷大
oo
1.2. 瞬时速度
在物理上,计算瞬时速度的时候,也会用极限的计算。
比如,存在一个路程和时间的公式:S=t2+2t+10S = t^2 + 2t + 10S=t2+2t+10 (S
表示路程,t
表示时间)计算瞬时速度时,步骤如下:
0
时,此速度 VVV 即为瞬时速度。用Sympy
来实现很方便:
# 2. 顺时速度
t = Symbol("t")
s_t = t * t + 2 * t + 10
delta_t = Symbol("delta_t")
s_delta = s_t.subs({t: t + delta_t})
expr = Limit((s_delta - s_t) / delta_t, delta_t, 0)
expr.doit()
运行结果:2t+22t+22t+2
这就是瞬时速度和时间的关系,通过这个公式,就能算出每个时间点的瞬时速度。
3. 微分计算
微分计算可以看做是一种求极限的运算方式,通过微分的运算规则,求极限更加简单。
3.1. 导数
还是上面瞬时速度的例子,用微分的方式,可以更快的得到结果。
from sympy import Derivative
#导数
s = t * t + 2 * t + 10
Derivative(s, t).doit()
运行的结果:2t+22t+22t+2,和上面求极限的方式计算的结果一样。
3.2. 偏导数
当函数的变量不止一个的时候,可以分别对不同的变量求导,这也就是偏导数。比如函数:f(x,y)=5x2+6y2+10xy+2x+3yf(x,y) = 5x^2 + 6y^2 + 10xy+2x+3yf(x,y)=5x2+6y2+10xy+2x+3y
x
的偏导数:df(x,y)dx=10x+10y+2\frac{df(x,y)}{dx} = 10x+10y+2dxdf(x,y)=10x+10y+2y
的偏导数:df(x,y)dy=10x+12y+3\frac{df(x,y)}{dy} = 10x+12y+3dydf(x,y)=10x+12y+3Sympy 实现方式:
f_xy = 5 * x * x + 6 * y * y + 10 * x * y + 2 * x + 3 * y
dx = Derivative(f_xy, x).doit()
dy = Derivative(f_xy, y).doit()
运行结果:dx=10x+10y+2dx = 10x+10y+2dx=10x+10y+2 ,dy=10x+12y+3dy = 10x+12y+3dy=10x+12y+3
3.3. 高阶导数
上面的微分计算求解的都是一阶导数,在寻找函数全局极值点的时候,还要用到高阶导数。
计算高阶导数也简单,上面 Derivative
函数的第三个参数就是求导的阶数(默认是1
)。
#高阶导数
f = x**5 - 3 * x**3 + 5 * x
#3阶导数
dx3 = Derivative(f, x, 3).doit()
#4阶导数
dx4 = Derivative(f, x, 4).doit()
运行结果:dx3=6(10x2−3)dx3 = 6(10x^2-3)dx3=6(10x2−3),dx4=120xdx4 = 120xdx4=120x
4. 积分计算
积分是微分的逆运算,手动计算的话一般需要查询积分表,非常麻烦。
使用Sympy
的话,就是一行代码的事儿。
from sympy import Integral
expr = 2 * x
Integral(expr).doit()
运行结果:x2x^2x2
除了可以得到积分后的表达式,也可以直接计算积分的值。比如计算:∫2.57.5(x2+2)\int_{2.5}^{7.5}(x^2+2)∫2.57.5(x2+2)
expr = x * x + 2
Integral(expr, (x, 2.5, 7.5)).doit()
#运行结果:145.416666666667
5. 总结回顾
本篇主要介绍了Sympy
在微积分方面的使用方法。
不过,能够计算微积分这些还不是Sympy
吸引我的地方,它最主要的特色是能够符号化程序中的变量和表达式,这样就使得编写的程序和用数学公式推导的过程极其类似,可以更加直观的表达自己的数学知识。
PS. 我在jupyter notebook中使用 Sympy
时,发现直接显示Sympy
的变量和表达式都非常漂亮,都是Latex
格式的。