SymPy教程展示了如何使用sympymodule在Python中进行符号计算。这是对SymPy的简要介绍。
计算机代数系统(CAS)是一种数学软件,能够以类似于数学家和科学家的传统手动计算的方式处理数学表达式。
符号计算以符号方式处理数学对象的计算。数学对象被精确地表示,而不是近似地表示,具有未计算变量的数学表达式以符号形式保留。
同情
SymPy是一个用于符号数学的Python库。它旨在成为一个功能齐全的计算机代数系统。SymPy包括从基本符号算术到微积分、代数、离散数学和量子物理学的各种功能。它能够在LaTeX中显示结果。
$ pip install sympy
SymPy使用pipinstallsympy
命令安装。
理性价值观
SymPy具有用于处理有理数的Rational
。有理数是任何可以表示为两个整数(分子p和非零分母q)的商或分数p/q的数。
#!/usr/bin/python from sympy import Rational r1 = Rational(1/10) r2 = Rational(1/10) r3 = Rational(1/10) val = (r1 + r2 + r3) * 3 print(val.evalf()) val2 = (1/10 + 1/10 + 1/10) * 3 print(val2)
该示例适用于有理数。
val = (r1 + r2 + r3) * 3 print(val.evalf())
表达式是符号形式;我们使用evalf
方法对其进行评估。
$ rational_values.py 0.900000000000000 0.9000000000000001
请注意,当不使用有理数时,输出中会出现一个小错误。
SymPy打印
pprint
用于在控制台上漂亮地打印输出。最好的结果是使用LaTeX实现的,例如在Jupyter笔记本中。
#!/usr/bin/python from sympy import pprint, Symbol, exp, sqrt from sympy import init_printing init_printing(use_unicode=True) x = Symbol('x') a = sqrt(2) pprint(a) print(a) print("------------------------") c = (exp(x) ** 2)/2 pprint(c) print(c)
程序美化了输出。
init_printing(use_unicode=True)
对于某些字符,我们需要启用unicode支持。
$ prettify.py â2 sqrt(2) ------------------------ 2â x ⯠ââââ 2 exp(2*x)/2
这是输出。请注意,使用Jupyternotebook可提供更好的输出。
平方根
平方根是一个数字,当它与自身相乘时产生指定的数量。
#!/usr/bin/python from sympy import sqrt, pprint, Mul x = sqrt(2) y = sqrt(2) pprint(Mul(x, y, evaluate=False)) print('equals to ') print(x * y)
程序输出一个包含平方根的表达式。
pprint(Mul(x, y, evaluate=False))
我们使用evaluate
属性延迟乘法表达式的计算。
$ square_root.py â2â â2 equals to 2
SymPy符号
符号计算使用符号进行计算,这些符号稍后可能会被计算。符号在使用前必须在SymPy中定义。
#!/usr/bin/python # ways to define symbols from sympy import Symbol, symbols from sympy.abc import x, y expr = 2*x + 5*y print(expr) a = Symbol('a') b = Symbol('b') expr2 = a*b + a - b print(expr2) i, j = symbols('i j') expr3 = 2*i*j + i*j print(expr3)
这些程序展示了在SymPy中定义符号的三种方法。
from sympy.abc import x, y
Symbols可以从sympy.abc
模块中导入。它将所有的拉丁字母和希腊字母导出为Symbols,这样我们就可以方便地使用它们。
a = Symbol('a') b = Symbol('b')
它们可以用Symbol
定义
i, j = symbols('i j')
可以使用symbols
方法定义多个符号。
SymPy规范表达式
SymPy会自动将表达式转换为规范形式。SymPy只做廉价的操作;因此可能无法将表达式计算为其最简单的形式。
#!/usr/bin/python from sympy.abc import a, b expr = b*a + -4*a + b + a*b + 4*a + (a + b)*3 print(expr)
我们有一个带有符号a
和b
的表达式。表达式可以很容易地简化。
$ canonical_form.py 2*a*b + 3*a + 4*b
SymPy扩展代数表达式
使用expand
,我们可以展开代数表达式;即该方法试图定义幂和乘法。
#!/usr/bin/python from sympy import expand, pprint from sympy.abc import x expr = (x + 1) ** 2 pprint(expr) print('-----------------------') print('-----------------------') expr = expand(expr) pprint(expr)
程序扩展了一个简单的表达式。
$ expand.py 2 (x + 1) ----------------------- ----------------------- 2 x + 2â x + 1
SymPy简化表达式
可以使用simplify
将表达式更改为更简单的形式。
#!/usr/bin/python from sympy import sin, cos, simplify, pprint from sympy.abc import x expr = sin(x) / cos(x) pprint(expr) print('-----------------------') expr = simplify(expr) pprint(expr)
该示例将sin(x)/sin(y)
表达式简化为tan(x)
。
$ simplify.py sin(x) ââââââ cos(x) ----------------------- tan(x)
SymPy比较表达式
SymPy表达式与equals
进行比较,而不是与==
运算符进行比较。
#!/usr/bin/python from sympy import pprint, Symbol, sin, cos x = Symbol('x') a = cos(x)**2 - sin(x)**2 b = cos(2*x) print(a.equals(b)) # we cannot use == operator print(a == b)
程序比较两个表达式。
print(a.equals(b))
我们用equals
比较两个表达式。在应用该方法之前,SymPy会尝试简化表达式。
$ expr_equality.py True False
SymPy求值表达式
可以通过替换符号来计算表达式。
#!/usr/bin/python from sympy import pi print(pi.evalf(30))
该示例将pi值计算为三十位。
$ evaluating.py 3.14159265358979323846264338328
#!/usr/bin/python from sympy.abc import a, b from sympy import pprint expr = b*a + -4*a + b + a*b + 4*a + (a + b)*3 print(expr.subs([(a, 3), (b, 2)]))
该示例通过用数字替换a
和b
符号来评估表达式。
$ evaluating.py 3.14159265358979323846264338328
SymPy求解方程
方程用solve
或solveset
求解。
#!/usr/bin/python from sympy import Symbol, solve x = Symbol('x') sol = solve(x**2 - x, x) print(sol)
该示例使用solve
求解一个简单的方程。
sol = solve(x**2 - x, x)
solve
的第一个参数是方程。方程写成特定形式,适合SymPy;即x**2-x
而不是x**2=x
。第二个参数是我们需要解决的符号。
$ solving.py [0, 1]
方程有两个解:0和1。
或者,我们可以使用Eq
来计算等式。
#!/usr/bin/python from sympy import pprint, Symbol, Eq, solve x = Symbol('x') eq1 = Eq(x + 1, 4) pprint(eq1) sol = solve(eq1, x) print(sol)
该示例求解一个简单的x+1=4
方程。
$ solving2.py x + 1 = 4 [3]
#!/usr/bin/python from sympy.solvers import solveset from sympy import Symbol, Interval, pprint x = Symbol('x') sol = solveset(x**2 - 1, x, Interval(0, 100)) print(sol)
使用solveset
,我们找到给定区间的解。
$ solving3.py {1}
SymPy序列
Sequence是对象的枚举集合,其中允许重复。序列可以是有限的或无限的。元素的数量称为序列的长度。与集合不同,相同的元素可以在序列中的不同位置出现多次。元素的顺序很重要。
#!/usr/bin/python from sympy import summation, sequence, pprint from sympy.abc import x s = sequence(x, (x, 1, 10)) print(s) pprint(s) print(list(s)) print(s.length) print(summation(s.formula, (x, s.start, s.stop))) # print(sum(list(s)))
该示例创建了一个数字序列1、2、…、10。我们计算这些数字的总和。
$ sequence.py SeqFormula(x, (x, 1, 10)) [1, 2, 3, 4, â¦] [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] 10 55
SymPy限制
limit是当输入(或索引)“接近”某个值时函数(或序列)“接近”的值。
#!/usr/bin/python from sympy import sin, limit, oo from sympy.abc import x l1 = limit(1/x, x, oo) print(l1) l2 = limit(1/x, x, 0) print(l2)
在示例中,我们有1/x
函数。它有左侧和右侧限制。
from sympy import sin, limit, sqrt, oo
oo
表示无穷大。
l1 = limit(1/x, x, oo) print(l1)
我们计算1/x
的极限,其中x接近正无穷大。
$ limit.py 0 oo
SymPy矩阵
在SymPy中,我们可以使用矩阵。矩阵是数字或其他数学对象的矩形数组,其中定义了加法和乘法等运算。
矩阵用于计算、工程或图像处理。
#!/usr/bin/python from sympy import Matrix, pprint M = Matrix([[1, 2], [3, 4], [0, 3]]) print(M) pprint(M) N = Matrix([2, 2]) print("---------------------------") print("M * N") print("---------------------------") pprint(M*N)
该示例定义了两个矩阵并将它们相乘。
$ matrix.py Matrix([[1, 2], [3, 4], [0, 3]]) â¡1 2⤠⢠⥠â¢3 4⥠⢠⥠â£0 3⦠--------------------------- M * N --------------------------- â¡6 ⤠⢠⥠â¢14⥠⢠⥠â£6 â¦
SymPy绘图
SymPy包含绘图模块。它建立在Matplotlib之上。
#!/usr/bin/python # uses matplotlib import sympy from sympy.abc import x from sympy.plotting import plot plot(1/x)
该示例绘制了1/x
函数的二维图形。
这是SymPy教程。
列出所有Python教程。