Python科学计算库SymPy初探

SymPy基础应用

 

 

 

SymPy基础应用

 

Rational值

SymPy 具有用于处理有理数的Rational。 有理数是可以表示为两个整数(分子 p 和非零分母 q)的商或分数 p / q 的任何数字。

In [1]:
from sympy import Rational

r = Rational(1/10)

val = r * 3
print(val.evalf())

val2 = 1/10 * 3
print(val2)
 
0.300000000000000
0.30000000000000004
In [2]:
print(type(val))
print(type(val2))
 
<class 'sympy.core.numbers.Rational'>
<class 'float'>
In [3]:
print(val.evalf())
print(val2)
 
0.300000000000000
0.30000000000000004
 

SymPy pprint

pprint()用于在控制台上漂亮地打印输出。 LaTeX 可以达到最佳效果,例如 在 Jupyter 笔记本中。

prettify.py

In [4]:
from sympy import pprint, Symbol, exp, sqrt
from sympy import init_printing

init_printing(use_unicode=True)  # 对于某些字符,我们需要启用 unicode 支持

x = Symbol('x')

a = sqrt(2)
pprint(a)
print(a)

print("------------------------")

c = (exp(x) ** 2)/2
pprint(c)
print(c)
 
√2
sqrt(2)
------------------------
 2⋅x
ℯ   
────
 2  
exp(2*x)/2
 

平方根

平方根是一个数字,乘以它会产生指定的数量。

In [5]:
from sympy import sqrt, pprint, Mul

x = sqrt(2)
y = sqrt(2)

pprint(Mul(x,  y, evaluate=False))  # 使用evaluate属性推迟对乘法表达式的求值。
print('equals to ')
print(x * y)
 
√2⋅√2
equals to 
2
In [6]:
Mul(x,y)
Out[6]:
$\displaystyle 2$
 

SymPy 符号

符号计算适用于符号,以后可以对其进行求值。 使用符号之前,必须在 SymPy 中定义符号。

In [7]:
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) 
 
2*x + 5*y
a*b + a - b
3*i*j
 

from sympy.abc import x, y 可以从sympy.abc模块导入符号。 它将所有拉丁字母和希腊字母导出为符号,因此我们可以方便地使用它们。

 

SymPy 规范表达形式

SymPy 会自动将表达式转换为规范形式。 SymPy 仅执行廉价操作; 因此,表达式可能无法求值为最简单的形式。

In [8]:
from sympy.abc import a, b
expr = b*a + -4*a + b + a*b + 4*a + (a + b)*3
print(expr)
 
2*a*b + 3*a + 4*b
 

SymPy 扩展代数表达式

使用expand(),我们可以扩展代数表达式; 即该方法尝试消除幂和乘法。

In [9]:
from sympy import expand, pprint
from sympy.abc import x

expr = (x + 1) ** 2

pprint(expr)

print('-----------------------')
print('-----------------------')

expr = expand(expr)
pprint(expr)
 
       2
(x + 1) 
-----------------------
-----------------------
 2          
x  + 2⋅x + 1
 

SymPy 简化表达式

可以使用simplify()将表达式更改为更简单的形式。

In [10]:
from sympy import sin, cos, simplify, pprint
from sympy.abc import x,y

expr = sin(x+y) / (sin(y)*cos(x))

pprint(expr)

print('-----------------------')

expr = simplify(expr)
pprint(expr)
 
  sin(x + y) 
─────────────
sin(y)⋅cos(x)
-----------------------
tan(x)    
────── + 1
tan(y)    
 

SymPy 比较表达式

SymPy 表达式与equals()而不是==运算符进行比较。

In [11]:
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)) #  在应用该方法之前,SymPy 尝试简化表达式。

# we cannot use == operator
print(a == b)
 
True
False
 

SymPy 求值表达式

可以通过替换符号来求值表达式。

In [12]:
from sympy import pi
print(pi.evalf(10))  # 保留十位有效数字
 
3.141592654
In [13]:
# 通过用数字替换a和b符号来求值表达式
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)]))
 
29
 

SymPy 求解方程

solve()solveset()求解方程。

In [14]:
from sympy import Symbol, solve
x = Symbol('x')
sol = solve(x**2 - x, x)
print(sol)
 
[0, 1]
 

solve()的第一个参数是公式。 该公式以适合 SymPy 的特定形式编写; 即x**2 - x代替x**2 = x。 第二个参数是我们需要解决的符号。

或者,我们可以将Eq用于公式。

In [15]:
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
[3]
In [16]:
from sympy.solvers import solveset
from sympy import Symbol, Interval, pprint

x = Symbol('x')

sol = solveset(x**2 - 1, x, Interval(0, 50))
print(sol)
 
{1}
 

使用solveset(),我们找到了给定间隔的解决方案。

 

SymPy 序列

序列是其中允许重复的对象的枚举集合。 序列可以是有限的或无限的。 元素的数量称为序列的长度。 与集合不同,同一元素可以在序列中的不同位置出现多次。 元素的顺序很重要。

In [17]:
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)))
 
SeqFormula(x, (x, 1, 10))
[1, 2, 3, 4, …]
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
10
55
 

SymPy 极限

极限是函数(或序列)“接近”作为输入(或索引)“接近”某个值的值。

In [18]:
from sympy import sin, limit, oo
from sympy.abc import x,y

l1 = limit(1/x, x, oo)
print(l1)

l2 = limit(exp(x)/(y), x, 1)
print(l2)
 
0
E/y
 

SymPy 矩阵

在 SymPy 中,我们可以使用矩阵。 矩阵是数字或其他数学对象的矩形数组,为其定义了运算(例如加法和乘法)。

矩阵用于计算,工程或图像处理。

In [19]:
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([[1, 2], [3, 4], [0, 3]])
⎡1  2⎤
⎢    ⎥
⎢3  4⎥
⎢    ⎥
⎣0  3⎦
---------------------------
M * N
---------------------------
⎡6 ⎤
⎢  ⎥
⎢14⎥
⎢  ⎥
⎣6 ⎦
 

SymPy 绘图

SymPy 包含用于绘图的模块。 它基于 Matplotlib 构建。

In [20]:
import sympy
from sympy.abc import x
from sympy.plotting import plot
plot(sin(x))
 
<Figure size 640x480 with 1 Axes>
Out[20]:
<sympy.plotting.plot.Plot at 0x227ddeceec8>
 

一元函数的导函数

In [21]:
from sympy import *
x = symbols('x')
expr = sin(x) * exp(x)
pprint(diff(expr, x))
 
 x           x       
ℯ ⋅sin(x) + ℯ ⋅cos(x)
 

求不定积分

In [22]:
from sympy import *
x = symbols('x')
expr = exp(x) * sin(x) + exp(x) * cos(x)
pprint(integrate(expr, x))
 
 x       
ℯ ⋅sin(x)
 

求定积分

In [23]:
from sympy import *
x = symbols('x')
expr = exp(x) * sin(x) + exp(x) * cos(x)
pprint(integrate(expr, x, (x,-oo,oo)))
 
<-∞, ∞>
 

求微分方程的解

In [24]:
from sympy import *
y = Function('y')
t = Symbol('t')
sol = dsolve(Eq(y(t).diff(t, t) - y(t), exp(t)), y(t))
print(sol)
 
Eq(y(t), C2*exp(-t) + (C1 + t/2)*exp(t))
 

打印latex公式

In [25]:
from sympy import *
x = symbols('x')
expr = cos(x)**2
latex(Integral(expr, (x, 0, pi)))
Out[25]:
'\\int\\limits_{0}^{\\pi} \\cos^{2}{\\left(x \\right)}\\, dx'
In [26]:
latex(expr)
Out[26]:
'\\cos^{2}{\\left(x \\right)}'
In [27]:
pprint(Integral(expr, (x, 0, pi)))
 
π           
⌠           
⎮    2      
⎮ cos (x) dx
⌡           
0           
 
posted @ 2020-03-15 11:46  雲無月  阅读(957)  评论(0编辑  收藏  举报