Sympy入门之变量基本操作

        

        Sympy是一个专注于符号数学计算的数学工具,使得用户可以轻松地进行复杂的符号运算,如求解方程、求导数、积分、级数展开、矩阵运算等。其中比较流行的深度学习框架pytorch的用到了Sympy,主要用于将模型的计算图转换为符号化表达式,以便进行分析和优化。

获取方式

pip install -i https://mirrors.tuna.tsinghua.edu.cn/pypi/web/simple sympy

模块导入

import sympy as sp
#or
from sympy import *

Sympy符号定义

        符号定义是指将特定字符经过sympy下的symbols函数或Symbol类后变成一个sympy变量,这些变量可以在后续的符号计算中被识别和操作。

定义单个变量

import sympy as sp
#使用Symbol类定义单个变量
x=sp.Symbol('x')
y=sp.Symbol('y')
import sympy as sp
#使用symbols函数定义单个变量
x=sp.symbols('x')
y=sp.symbols('y')

 同时定义多个变量

import sympy as sp
#同时定义三个变量
x,y,z=sp.symbols('x y z')

注意,当同时定义多个变量时,symbols函数内的多个字符之间需要使用逗号或空格分隔开。

批量定义变量

当我们想要使用sympy定义诸如:x1,x2,x3,x4....这样的变量时,我们只需:

import sympy as sp
# 同时定义多个符号变量
variables = sp.symbols('x1:5')  # 定义 x1, x2, ... x4
print(variables)

定义带上下标的变量


from IPython.display import display, Math
import sympy as sp
sp.init_printing()
# 同时定义多个符号变量
variablesx=sp.symbols('x^1:5')  # 定义 x1, x2, ..., x5
variablesy=sp.symbols('y_1:5')
#sp.latex:用来将表达式按照latex输出
#display,Math:在 JupyterNotebook中,对sympy的latex表达式使用display(Math())会自动将其渲染为好看的数学公式样式
display(Math(sp.latex(variablesx)))
display(Math(sp.latex(variablesy)))

结果 

变量类型参数 

sympy符号变量类型设定
positive=True正数
negative=True负数
imaginary=True虚数
complex=True复数

特殊符号

符号/常量说明
sp.oo正无穷(+∞)
sp.S.NegativeInfinity负无穷(−∞)
sp.zoo复无穷(复数无穷)
sp.nan非数值(Not a Number)
sp.pi圆周率 π
sp.E自然对数的底数 e
sp.EulerGamma欧拉-马歇罗尼常数 γ
sp.GoldenRaito黄金分割比例 ϕ
sp.true逻辑真(True
sp.false逻辑假(False
sp.I虚数单位 i(−1​)
sp.S.infinity正无穷(与 sp.oo 相同)
sp.S.zero0
sp.s.One1
sp.S.Half\frac{1}{2}
sp.S.EmptySet空集 ∅
sp.S.UniversalSet全集
sp.S.ComplexSet复数集合 C
sp.S.Reals实数集合 R
sp.S.Rationals有理数集合 Q
sp.S.Integer整数集合 Z
sp.S.Naturals自然数集合 N
sp.S.Naturals0包含零的自然数集合 N0​
sp.Symbol('x')未赋值定义的符号(变量)
sp.Dummy('x')临时符号(用于避免冲突)

Sympy初等函数表达式 

        当我们需要进行符号运算的表达式中含有一些基本初等函数时,我们需要借助其在sympy下的函数来对其进行表示。

指对函数

指对函数在sympy中的表示
e^x(自然指数函数)sp.exp
lnx(自然对数函数)sp.ln
a^x(指数函数)sp.Pow(a,x)
\log_{a}x(对数函数)sp.log(x,a)

三角函数

基本三角函数在sympy中的表示
sin(正弦)sp.sin
cos(余弦)sp.cos
tan(正切)sp.tan
cot(余切)sp.cot
sec(正割)sp.sec
csc(余割)sp.csc
arcsin(反正弦)sp.asin
arccos(反余弦)sp.acos
arctan(反正切)sp.atan
arcsec(反正割)sp.asec
arccsc(反余割)sp.acsc

 双曲函数

双曲函数在sympy中的表示
sinh(双曲正弦)sp.sinh
cosh(双曲余弦)sp.cosh
tanh(双曲正切)sp.tanh
coth(双曲余切)sp.coth
sech(双曲正割)sp.sech
csch(双曲余割)sp.csch
arcsinh(反双曲正弦)sp.asinh
arccosh(双反曲余弦)sp.acosh
arctanh(反双曲正切)sp.atanh
arcsech(反双曲正割)sp.asech
arccsch(反双曲余割)sp.acsch

其他函数 

\sqrt{x}(根号函数)sp.sqrt
|x|(绝对值函数)sp.Abs
u(x)(阶跃函数)sp.Heaviside
sign(x)(符号函数)sp.Sign
x!(阶乘函数)sp.factorial
\Gamma(x)(伽马函数)sp.gamma
\beta(P,Q)(贝塔函数)sp.beta

        其他类型的函数,诸如幂函数,多项式函数等都可以使用定义过的符号变量,使用python中的运算符进行组合得到。

Sympy表达式化简

因式展开sp.expand()

        sp.expand()函数可以实现将给定的表达式展开, 这里,我们对(x+\frac{1}{y}+\frac{3}{z})^2这个式子展开


from IPython.display import display, Math
import sympy as sp
# 同时定义多个符号变量
x,y,z=sp.symbols('x,y,z')
#sp.latex:用来将表达式按照latex输出
#display,Math:在 JupyterNotebook中,对symoy的latex表达式使用display(Math())会自动将其渲染为好看的数学公式样式
expressions=(x+1/y+3/z)**2
expanded_expressions=sp.expand(expressions)
display(Math(sp.latex(expanded_expressions)))

结果

 因式分解sp.factor()

sp.factor()主要用于将多项式进行因式分解。这里我们以x^3-1为例

from IPython.display import display,Math
import sympy as sp
x,y=sp.symbols('x y')
expressions=x**3-1
result=sp.factor(expressions)
display(Math(sp.latex(result)))

结果:

 分式因式分解sp.cancel()

        sp.cancel()和sp.factor()函数用法一致,都可以用来进行因式分解,不过sp.cancel()多用于有理函数分式的因式分解。这里我们以\frac{x^2-1}{x^3-1}为例。

from IPython.display import display,Math
import sympy as sp
x,y=sp.symbols('x y')
expressions=(x**2-1)/(x**3-1)
result=sp.cancel(expressions)
display(Math(sp.latex(result)))

结果:

分式拆分(裂项)化简sp.apart()

        分式拆分化简是指将分式差分成若干个多项式与分式或分式与分式之和的分式,比如我们最常见的裂项相消的形式\frac{1}{(x+1)x},它可以拆分成两个分式相加的形式。

from IPython.display import display,Math
import sympy as sp
x,y=sp.symbols('x y')
expressions=(1/(x**2+x))
result=sp.apart(expressions)
display(Math(sp.latex(result)))

结果:

分式合并sp.together()

        与sp.apart()函数恰恰相反,sp.together()函数用来将多个分式之间(也可以包含多项式)求和的形式和并为同一个分式。这里我们以\frac{1}{x}+\frac{1}{x+1}+x为例。

from IPython.display import display,Math
import sympy as sp
x,y=sp.symbols('x y')
expressions=(1/x)+1/(x+1)+x
result=sp.together(expressions)
display(Math(sp.latex(result)))

结果:

三角函数化简sp.trigsimp()

        sp.trigsimp()是考虑到了一系列三角函数关系后专门针对三角函数表达式进行化简的函数。

这里我们以\sin(x)+\cos(x)为例。

from IPython.display import display,Math
import sympy as sp
x,y=sp.symbols('x y')
expressions=sp.sin(x)+sp.cos(x)
result=sp.trigsimp(expressions)
display(Math(sp.latex(result)))

结果: 

指数化简sp.powsimp()

        sp.powsimp()是考虑到了指数函数的性质后专门针对指数函数表达式进行化简的函数。这里我们以2e^xe^{y^2}为例。

#指数函数化简
from IPython.display import display,Math
import sympy as sp
x,y=sp.symbols('x y')
expressions=2*sp.exp(x)*sp.exp(y**2)
result=sp.powsimp(expressions)
display(Math(sp.latex(result)))

结果:

嵌套指数化简sp.powdenest() 

        嵌套指数是指形如:(x^a)^b的形式,使用sp.powdenest()后将被化简为x^{ab},当然,直接使用sp.powsimp()函数也可以实现该类型化简。

#嵌套指数化简
from IPython.display import display,Math
import sympy as sp
x,y=sp.symbols('x y')
expressions=2*sp.exp(x)**2
result=sp.powdenest(expressions)
display(Math(sp.latex(result)))

结果:

对数合并sp.logcombine()

        sp.logcombine()主要用来合并相加的对数表达式。这里我们以lnx+ln(x^2)为例,注意(必须在定义变量时,指明该变量positive=True)才可以使用该方法合并对数表达式。

#对数函数化简合并
from IPython.display import display,Math
import sympy as sp
x,y=sp.symbols('x y',positive=True)
expressions=sp.log(x)+sp.log(x**2)
result=sp.logcombine(expressions)
display(Math(sp.latex(result)))

 结果:

根式化简sp.sqrtsimp()

   sp.sqrtsimp()主要用来化简根式,特别是对根式进行有理化操作时。这里我们以\frac{1}{\sqrt{1+x}-\sqrt{x}}为例。

#根式化简
from IPython.display import display,Math
import sympy as sp
x,y=sp.symbols('x y')
expressions=1/(sp.sqrt(1+x)-sp.sqrt(x))
result=sp.radsimp(expressions)
display(Math(sp.latex(result)))

结果:

Sympy表达式赋值计算

        当我们定义了一些符号变量,并对其表达式进行合并化简后,我们需要将变量的值带入表达式进行数值计算时,可以使用sp.Subs()类对其进行赋值,接着使用该类下的evalif()或doit方法实现该功能。

sp.Subs()类参数:

expr表达式
variablles表达式中的变量构成的元祖:比如(x,y,z)
point与variables相对应的各个变量的值构成的元祖

这里我们以\frac{1}{\sqrt{1+x}-\sqrt{x}}化简后,x=\pi带入计算为例: 

from IPython.display import display,Math
import sympy as sp
x,y=sp.symbols('x y')
expressions=1/(sp.sqrt(1+x)-sp.sqrt(x))
simplify_result=sp.radsimp(expressions)
result1=sp.Subs(expr=simplify_result,variables=x,point=sp.pi).doit()
result2=sp.Subs(expr=simplify_result,variables=x,point=sp.pi).evalf()
display(Math(sp.latex(result1)))
display(Math(sp.latex(result2)))

结果 :

        注意:当我们需要精确计算的时候,使用evalif方法即可,如果想要得到最后结果的表达式,那么我们使用doit方法即可,doit方法返回的是将指定的值带入表达式后的样子。

Sympy格式化输出的几种方法

当我们想要将Sympy表达式pretty_print()的时候,总共有以下几种方法:

1.jupyter notebook环境

        在jupyter notebook环境中,Sympy的表达式是会被默认按照latex格式渲染后输出的,若你只有一个变量,我们只需要在最后一行将表达式的变量名重写一遍即可(jupyter notebook中,在代码最后一行写变量名称会默认打印该变量)。

        若我们的变量较多,可以使用jupyter notebook环境自带的display()函数,当然也可以从IPython中导入。

 2.Python环境

        在python环境中,sympy的表达式是很难被直接渲染然后pretty_print的,不过sympy仍然提供了一个sp.pprint()函数用来尽可能的在python环境的终端中pretty_print表达式

import sympy as sp
x,y=sp.symbols('x y')
expressions=1/(sp.sqrt(1+x)-sp.sqrt(x))
simplify_result=sp.radsimp(expressions)
sp.pprint(simplify_result)

结果:

        显然没有在jupyter notebook中latex格式被渲染后好看。

3.返回表达式的Latex字符

        当我们需要获取表达式的Latex格式字符串时,可以使用sp.latex()函数来实现。

#获取Latex表达式
import sympy as sp
x,y=sp.symbols('x y')
expressions=1/(sp.sqrt(1+x)-sp.sqrt(x))
simplify_result=sp.radsimp(expressions)
print(sp.latex(simplify_result))

结果:

\sqrt{x} + \sqrt{x + 1} 

总结

      以上便是Sympy入门之关于变量的一些基本操作,接下来我们还将介绍Sympy在数学运算中的一些应用,敬请期待。

评论 58
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值