首页 文章详情

数学神器!Sympy 模块解数学方程解微积分

FightingCoder | 234 2022-11-24 16:33 0 0 0
UniSMS (合一短信)
这是「进击的Coder」的第 758  篇技术分享 作者:Ckend 来源:Python 实用宝典

阅读本文大概需要 6 分钟。



SymPy 是一个 Python 库,专注于符号数学,它的目标是成为一个全功能的计算机代数系统,同时保持代码简洁、易于理解和扩展。

举一个简单的例子,比如说展开二次方程:

      
        from sympy import *
x = Symbol('x')
y = Symbol('y')
d = ((x+y)**2).expand()
print(d)
# 结果:x**2 + 2*x*y + y**2


你可以随便输入表达式,即便是十次方,它都能轻易的展开,非常方便:

      
        from sympy import *
x = Symbol('x')
y = Symbol('y')
d = ((x+y)**10).expand()
print(d)
# 结果:x**10 + 10*x**9*y + 45*x**8*y**2 + 120*x**7*y**3 + 210*x**6*y**4 + 252*x**5*y**5 + 210*x**4*y**6 + 120*x**3*y**7 + 45*x**2*y**8 + 10*x*y**9 + y**10


下面就来讲讲这个模块的具体使用方法和例子。

1.准备


      
        pip install Sympy
      
    


2.基本使用



简化表达式(化简)

sympy支持三种化简方式,分别是普通化简、三角化简、指数化简。

普通化简 simplify( ):

      
        from sympy import *
x = Symbol('x')
d = simplify((x**3 + x**2 - x - 1)/(x**2 + 2*x + 1))
print(d)
# 结果:x - 1


三角化简 trigsimp( ):

      
        from sympy import *
x = Symbol('x')
d = trigsimp(sin(x)/cos(x))
print(d)
# 结果:tan(x)


指数化简 powsimp( ):

      
        from sympy import *
x = Symbol('x')
a = Symbol('a')
b = Symbol('b')
d = powsimp(x**a*x**b)
print(d)
# 结果:x**(a + b)



解方程 solve()

第一个参数为要解的方程,要求右端等于 0,第二个参数为要解的未知数。

如一元一次方程:

      
        from sympy import *
x = Symbol('x')
d = solve(x * 3 - 6, x)
print(d)
# 结果:[2]


二元一次方程:

      
        from sympy import *
x = Symbol('x')
y = Symbol('y')
d = solve([2 * x - y - 3, 3 * x + y - 7],[x, y])
print(d)
# 结果:{x: 2, y: 1}


求极限 limit()

dir=’+’表示求解右极限,dir=’-‘表示求解左极限:

      
        from sympy import *
x = Symbol('x')
d = limit(1/x,x,oo,dir='+')
print(d)
# 结果:0
d = limit(1/x,x,oo,dir='-')
print(d)
# 结果:0


求积分 integrate( )

先试试求解不定积分:

      
        from sympy import *
x = Symbol('x')
d = integrate(sin(x),x)
print(d)
# 结果:-cos(x)


再试试定积分:

      
        from sympy import *
x = Symbol('x')
d = integrate(sin(x),(x,0,pi/2))
print(d)
# 结果:1


求导 diff()

使用 diff 函数可以对方程进行求导:

      
        from sympy import *
x = Symbol('x')
d = diff(x**3,x)
print(d)
# 结果:3*x**2

d = diff(x**3,x,2)
print(d)
# 结果:6*x


解微分方程 dsolve( )

以 y′=2xy 为例:

      
        from sympy import *
x = Symbol('x')
f = Function('f')
d = dsolve(diff(f(x),x) - 2*f(x)*x,f(x))
print(d)
# 结果:Eq(f(x), C1*exp(x**2))


3.实战一下



今天群里有同学问了这个问题,“大佬们,我想问问,如果这个积分用 Python 应该怎么写呢,谢谢大家”:

ab4d7a1d590c7b3a1f25283f03f8f4fc.webp


      
        # Python 实用宝典
from sympy import *
x = Symbol('x')
y = Symbol('y')
d = integrate(x-y, (y, 0, 1))
print(d)
# 结果:x - 1/2


为了计算这个结果,integrate 的第一个参数是公式,第二个参数是积分变量及积分范围下标和上标。

运行后得到的结果便是 x - 1/2 与预期一致。

如果大家也有求解微积分、复杂方程的需要,可以试试 sympy,它几乎是完美的存在。

06f087a0117e8fb7cfd6c24170591027.webp

End

崔庆才的新书《Python3网络爬虫开发实战(第二版)》已经正式上市了!书中详细介绍了零基础用 Python 开发爬虫的各方面知识,同时相比第一版新增了 JavaScript 逆向、Android 逆向、异步爬虫、深度学习、Kubernetes 相关内容,‍同时本书已经获得 Python 之父 Guido 的推荐,目前本书正在七折促销中!

内容介绍:《Python3网络爬虫开发实战(第二版)》内容介绍


0e15c740ebacb8617dedfd79f85922d5.webp


扫码购买


ae9924062b53feed987265b63eb414a2.webp



66f1ded31b72350dd8e212e92bb24266.webp

点个在看你最好看

a0a29b370e5cfc66d63188f1411d075b.webp
good-icon 0
favorite-icon 0
收藏
回复数量: 0
    暂无评论~~
    Ctrl+Enter