前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Python 符号计算模块sympy 简介

Python 符号计算模块sympy 简介

作者头像
用户6021899
发布2019-08-14 17:21:26
3.5K0
发布2019-08-14 17:21:26
举报

众所周知,科学计算包括数值计算符号计算两种计算。在数值计算中,计算机处理的对象和得到的结果都是数值,而在符号计算中,计算机处理的数据和得到的结果都是符号。这种符号可以是字母、公式,也可以是数值,但它与纯数值计算在处理方法、处理范围、处理特点等方面有较大的区别。可以说,数值计算是近似计算;而符号计算则是绝对精确的计算。它不容许有舍入误差,从算法上讲,它是数学,它比数值计算用到的数学知识更深更广。最流行的通用符号计算软件有:MAPLE,Mathematica,Matlab,Python sympy等等。

Python sympy的一大优点在于免费且开源,可以通过pip在线安装。它不依赖于外部库。SymPy支持符号计算、高精度计算、模式匹配、绘图、解方程、微积分、组合数学、离散 数学、几何学、概率与统计、物理学等方面的功能。

  • 什么是符号计算?

举一个简单的例子,计算开8开根号,使用math模块得到近似浮点数,使用sympy模块得到2倍的根号2,不使用近似计算。

代码语言:javascript
复制
>>> import math
>>> import sympy
>>> math.sqrt(8)
2.8284271247461903
>>> sympy.sqrt(8)
2*sqrt(2)

我们看一下根号4的符号计算结果:

代码语言:javascript
复制
>>> sympy.sqrt(4)
2

好像是python的整数2,其实不对。我们看一下结果的数据类型, 返回的是sympy特有的整数类。

代码语言:javascript
复制
>>> type(sympy.sqrt(4))
<class 'sympy.core.numbers.Integer'>

我们再看分数怎么表示:

代码语言:javascript
复制
>>> 1/3 #python3 中,分数会以近似的浮点数来表示
0.3333333333333333
>>> sympy.Rational(1,3)
1/3
>>> type(sympy.Rational(1,3))#sympy中会以特有的分数类来表示
<class 'sympy.core.numbers.Rational'>
  • 如何创建符号变量?
代码语言:javascript
复制
>>> from sympy import *
>>> x = symbols('x') #创建单个符号变量
>>> x
x
代码语言:javascript
复制
>>> y, z , nu = symbols('y z nu') #同时创建多个符号变量
>>> y, z, nu
(y, z, nu)

注意,python变量的名字和符号变量的名字可以不一致:

代码语言:javascript
复制
>>> a, b = symbols(’b a’)#最好不要这样交叉写,容易产生混淆
>>> a
b
>>> b
a

可以将已有的符号变量的表达式赋值给新的符号变量,此时新的符号变量不用额外声明。注意sympy仍然遵从python的惯例,乘法用'*‘表示,幂运算用”**“表示,”^"还是表示异或(XOR)。

代码语言:javascript
复制
expr =  z**2 + 2*y

注意,重新绑定符号表达式中的符号变量的值,不会影响到该符号表达式。要想更新,需重新绑定一遍。

代码语言:javascript
复制
>>>expr =  z**2 + 2*y
>>> expr
2*y + z**2
>>>y = z+3 #将python变量y绑定到 符号表达式’z'+3 
>>>expr # 不影响
2*y + z**2
>>> expr =  z**2 + 2*y # 重新绑定
>>> expr #有了改变
z**2 + 2*z + 6
  • 如果改变表达式中符号变量的值?

用subs函数。

代码语言:javascript
复制
>>> (x+1).subs(x,100)
101
>>> expr = x+3*z
>>> expr.subs({x:1, z:2})
7
  • 相等的写法

用Eq函数。“=”依然表示赋值,“==”依然表示判断真假。

代码语言:javascript
复制
>>> Eq(x+1, z)
Eq(x + 1, z)
>>> Eq(x+1, x) #明显不等的直接返回False
False
>>> Eq(x+1, x+1) # 结构一样且相等会直接返回True
True
>>> Eq(x+1, x+1) == True # 和python的True 相等
True
>>> type(Eq(x+1, x+1)) # 但类型不一样
<class 'sympy.logic.boolalg.BooleanTrue'>
>>> Eq((x+1)**2, x**2 + 2*x +1)#数学上相等,但结构不一样,sympy不会直接判定为True
Eq((x + 1)**2, x**2 + 2*x + 1)
#可以通过做差后化简看是否等于0来判定
>>> expr = (x+1)**2 - (x**2 + 2*x +1)
>>> Eq(simplify(expr),0) # 化简用simplify函数
True
本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-06-10,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Python可视化编程机器学习OpenCV 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档