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自然对数的底数 esp.EulerGamma欧拉-马歇罗尼常数 γsp.GoldenRaito黄金分割比例 ϕsp.true逻辑真(True)sp.false逻辑假(False)sp.I虚数单位 i(−1)sp.S.infinity正无穷(与 sp.oo 雷同)sp.S.zero0sp.s.One1sp.S.Halfsp.S.EmptySet空集 ∅sp.S.UniversalSet全集sp.S.ComplexSet复数聚集 Csp.S.Reals实数聚集 Rsp.S.Rationals有理数聚集 Qsp.S.Integer整数聚集 Zsp.S.Naturals自然数聚集 Nsp.S.Naturals0包罗零的自然数聚集 N0sp.Symbol('x')未赋值界说的符号(变量)sp.Dummy('x')暂时符号(用于克制辩论)Sympy初等函数表达式
当我们必要举行符号运算的表达式中含有一些根本初等函数时,我们必要借助其在sympy下的函数来对其举行表现。
指对函数
指对函数在sympy中的表现(自然指数函数)sp.exp(自然对数函数)sp.ln(指数函数)sp.Pow(a,x)(对数函数)sp.log(x,a)三角函数
根本三角函数在sympy中的表现sin(正弦)sp.sincos(余弦)sp.costan(正切)sp.tancot(余切)sp.cotsec(正割)sp.seccsc(余割)sp.cscarcsin(反正弦)sp.asinarccos(反余弦)sp.acosarctan(反正切)sp.atanarcsec(反正割)sp.asecarccsc(反余割)sp.acsc 双曲函数
双曲函数在sympy中的表现sinh(双曲正弦)sp.sinhcosh(双曲余弦)sp.coshtanh(双曲正切)sp.tanhcoth(双曲余切)sp.cothsech(双曲正割)sp.sechcsch(双曲余割)sp.cscharcsinh(反双曲正弦)sp.asinharccosh(双反曲余弦)sp.acosharctanh(反双曲正切)sp.atanharcsech(反双曲正割)sp.asecharccsch(反双曲余割)sp.acsch其他函数
| (根号函数) | sp.sqrt | | |x|(绝对值函数) | sp.Abs | | u(x)(阶跃函数) | sp.Heaviside | | sign(x)(符号函数) | sp.Sign | | (阶乘函数) | sp.factorial | | (伽马函数) | sp.gamma | | (贝塔函数) | sp.beta | 其他范例的函数,诸如幂函数,多项式函数等都可以使用界说过的符号变量,使用python中的运算符举行组合得到。
Sympy表达式化简
因式睁开sp.expand()
sp.expand()函数可以实现将给定的表达式睁开, 这里,我们对这个式子睁开- 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()重要用于将多项式举行因式分解。这里我们以为例- 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()多用于有理函数分式的因式分解。这里我们以为例。- 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()
分式拆分化简是指将分式差分成多少个多项式与分式或分式与分式之和的分式,好比我们最常见的裂项相消的情势,它可以拆分成两个分式相加的情势。- 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()函数用来将多个分式之间(也可以包罗多项式)求和的情势和并为同一个分式。这里我们以为例。- 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()是思量到了一系列三角函数关系后专门针对三角函数表达式举行化简的函数。
这里我们以为例。- 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()是思量到了指数函数的性子后专门针对指数函数表达式举行化简的函数。这里我们以为例。- #指数函数化简
- 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()
嵌套指数是指形如:的情势,使用sp.powdenest()后将被化简为,固然,直接使用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()重要用来归并相加的对数表达式。这里我们以为例,留意(必须在界说变量时,指明该变量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()重要用来化简根式,特别是对根式举行有理化操纵时。这里我们以为例。- #根式化简
- 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相对应的各个变量的值构成的元祖 | 这里我们以化简后,带入盘算为例: - 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在数学运算中的一些应用,敬请期待。
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。 |