众所周知,科学计算包括数值计算和符号计算两种计算。在数值计算中,计算机处理的对象和得到的结果都是数值,而在符号计算中,计算机处理的数据和得到的结果都是符号。这种符号可以是字母、公式,也可以是数值,但它与纯数值计算在处理方法、处理范围、处理特点等方面有较大的区别。可以说,数值计算是近似计算;而符号计算则是绝对精确的计算。它不容许有舍入误差,从算法上讲,它是数学,它比数值计算用到的数学知识更深更广。最流行的通用符号计算软件有:MAPLE,Mathematica,Matlab,Python sympy等等。
Python sympy的一大优点在于免费且开源,可以通过pip在线安装。它不依赖于外部库。SymPy支持符号计算、高精度计算、模式匹配、绘图、解方程、微积分、组合数学、离散 数学、几何学、概率与统计、物理学等方面的功能。
举一个简单的例子,计算开8开根号,使用math模块得到近似浮点数,使用sympy模块得到2倍的根号2,不使用近似计算。
>>> import math
>>> import sympy
>>> math.sqrt(8)
2.8284271247461903
>>> sympy.sqrt(8)
2*sqrt(2)
我们看一下根号4的符号计算结果:
>>> sympy.sqrt(4)
2
好像是python的整数2,其实不对。我们看一下结果的数据类型, 返回的是sympy特有的整数类。
>>> type(sympy.sqrt(4))
<class 'sympy.core.numbers.Integer'>
我们再看分数怎么表示:
>>> 1/3 #python3 中,分数会以近似的浮点数来表示
0.3333333333333333
>>> sympy.Rational(1,3)
1/3
>>> type(sympy.Rational(1,3))#sympy中会以特有的分数类来表示
<class 'sympy.core.numbers.Rational'>
>>> from sympy import *
>>> x = symbols('x') #创建单个符号变量
>>> x
x
>>> y, z , nu = symbols('y z nu') #同时创建多个符号变量
>>> y, z, nu
(y, z, nu)
注意,python变量的名字和符号变量的名字可以不一致:
>>> a, b = symbols(’b a’)#最好不要这样交叉写,容易产生混淆
>>> a
b
>>> b
a
可以将已有的符号变量的表达式赋值给新的符号变量,此时新的符号变量不用额外声明。注意sympy仍然遵从python的惯例,乘法用'*‘表示,幂运算用”**“表示,”^"还是表示异或(XOR)。
expr = z**2 + 2*y
注意,重新绑定符号表达式中的符号变量的值,不会影响到该符号表达式。要想更新,需重新绑定一遍。
>>>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函数。
>>> (x+1).subs(x,100)
101
>>> expr = x+3*z
>>> expr.subs({x:1, z:2})
7
用Eq函数。“=”依然表示赋值,“==”依然表示判断真假。
>>> 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
本文分享自 Python可视化编程机器学习OpenCV 微信公众号,前往查看
如有侵权,请联系 cloudcommunity@tencent.com 删除。
本文参与 腾讯云自媒体分享计划 ,欢迎热爱写作的你一起参与!