Python Sympy:计算微积分利器

2023年 7月 14日 85.1k 0

微积分的计算也许平时用不到,会让人觉得有点高深。但其实它在数学专业的人眼中,也不过是一种极其普通的计算,是一种和加减乘除差不多的级别的常用计算方式。

微积分和求极限运算本身不是很难,只是它们的计算规则不像加减乘除那么简单。它们的计算过程中需要使用很多计算规则(这些不太容易记住),就像计算三角函数要记住很多三角函数的公式和定理一样。

使用 Sympy 可以有效减轻这方面的负担,让我们用编程的方式来解决微积分问题。

1. 极限计算

极限计算的应用场景很广,也是学习微积分的前置步骤。

1.1. 函数极限

比如这个简单的函数lim⁡x→∞1x\lim\limits_{x\rarr\infty}\frac{1}{x}x→∞lim​x1​,我们想知道它在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表示时间)计算瞬时速度时,步骤如下:

  • 假设初始路程 SSS
  • 经过 Δt\Delta tΔt时间后,路程变为ΔS=(t+Δt)2+2(t+Δt)+10\Delta S = (t+\Delta t)^2 + 2(t+\Delta t) + 10ΔS=(t+Δt)2+2(t+Δt)+10
  • 此时间间隔内的平均速度为:V=ΔS−SΔtV = \frac{\Delta S - S}{\Delta t}V=ΔtΔS−S​
  • 当 Δt\Delta tΔ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+2
  • 对变量y的偏导数:df(x,y)dy=10x+12y+3\frac{df(x,y)}{dy} = 10x+12y+3dydf(x,y)​=10x+12y+3
  • Sympy 实现方式:

    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格式的。

    相关文章

    JavaScript2024新功能:Object.groupBy、正则表达式v标志
    PHP trim 函数对多字节字符的使用和限制
    新函数 json_validate() 、randomizer 类扩展…20 个PHP 8.3 新特性全面解析
    使用HTMX为WordPress增效:如何在不使用复杂框架的情况下增强平台功能
    为React 19做准备:WordPress 6.6用户指南
    如何删除WordPress中的所有评论

    发布评论