开放的编程资料库

当前位置:我爱分享网 > Python教程 > 正文

Python 使用 SymPy

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)

我们有一个带有符号ab的表达式。表达式可以很容易地简化。

$ 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)]))

该示例通过用数字替换ab符号来评估表达式。

$ evaluating.py
3.14159265358979323846264338328

SymPy求解方程

方程用solvesolveset求解。

#!/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教程。

未经允许不得转载:我爱分享网 » Python 使用 SymPy

感觉很棒!可以赞赏支持我哟~

赞(0) 打赏