学习 Python 之 SymbolicPython库
Posted _DiMinisH
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了学习 Python 之 SymbolicPython库相关的知识,希望对你有一定的参考价值。
学习 Python 之 SymbolicPython库
- SymbolicPython库
SymbolicPython库
常用函数总结
SymbolicPython库
sympy是一个Python的科学计算库,用一套强大的符号计算体系完成多项式求值、求极限、解方程、求积分、微分方程、级数展开、矩阵运算等计算问题。
为什么选择 SymPy ?
SymPy 是自由软件, 免费开源, 而且使用 Python 编写而成, SymPy 具有很强的通用性, 而且上手简单
SymbolicPython库的简单使用
1. 定义符号
首先导入库
import sympy
(1). 使用symbols
函数定义符号
import sympy
x, y = sympy.symbols('x y')
(2). SymPy 的 abc 子模块导入所有拉丁字母和希腊字母
from sympy.abc import alpha, x, y
实际上, 该模块下面已经为我们定义好了, 下面是模块中已经定义好的符号
from sympy import symbols
a, b, c, d, e, f, g, h, i, j = symbols('a, b, c, d, e, f, g, h, i, j')
k, l, m, n, o, p, q, r, s, t = symbols('k, l, m, n, o, p, q, r, s, t')
u, v, w, x, y, z = symbols('u, v, w, x, y, z')
A, B, C, D, E, F, G, H, I, J = symbols('A, B, C, D, E, F, G, H, I, J')
K, L, M, N, O, P, Q, R, S, T = symbols('K, L, M, N, O, P, Q, R, S, T')
U, V, W, X, Y, Z = symbols('U, V, W, X, Y, Z')
alpha, beta, gamma, delta = symbols('alpha, beta, gamma, delta')
epsilon, zeta, eta, theta = symbols('epsilon, zeta, eta, theta')
iota, kappa, lamda, mu = symbols('iota, kappa, lamda, mu')
nu, xi, omicron, pi = symbols('nu, xi, omicron, pi')
rho, sigma, tau, upsilon = symbols('rho, sigma, tau, upsilon')
phi, chi, psi, omega = symbols('phi, chi, psi, omega')
需要注意, lambda是保留关键字, 定义符号时要使用lamda
, 没有’b’
(3). symbols
函数
指定变量定义域
参数 | 作用 |
---|---|
positive | 指定定义域, 默认是False, 即定义域是 x ∈ R |
import sympy
x, y = sympy.symbols('x y', positive = True)
这样在求解过程中x
必须满足这个前提条件
定义多个变量
import sympy
variables = sympy.symbols('x1:10')
print(variables)
结果
(x1, x2, x3, x4, x5, x6, x7, x8, x9)
2. 符号的基本操作
函数 | 作用 |
---|---|
subs(符号, 替换量) | 用来计算函数值 |
sympify(字符串) | 将字符串转变为一个 SymPy 表达式 |
evalf(精度) | 转换为指定精度数值解的函数 |
lambdify(符号-自变量, SymPy表达式-函数, 'numpy') | 将 SymPy 表达式转换为 NumPy 可使用的函数 |
simplify(SymPy表达式-函数) | 将函数化为最简形式 |
expand(SymPy表达式-函数) | 将多项式函数展开 |
factor(SymPy表达式-函数) | 将多项式函数因式分解 |
collect(SymPy表达式-函数, 符号-自变量) | 多项式合并同类项函数 |
cancel(SymPy表达式-函数) | 有理分式化简函数 |
apart(SymPy表达式-函数) | 有理分式展开函数 |
(1). 替换函数 subs()
作用: 计算函数值
import sympy
x = sympy.symbols('x')
y = 5 * x ** 2 + sympy.cos(x)
print(y.subs(x, 0))
结果:
1
(2). 字符串转换表达式函数 sympify()
作用: 将字符串转变为一个 SymPy 表达式
import sympy
string = 'cos(x) * (x + 3)'
y = sympy.sympify(string)
print('y = ', y)
结果:
y = (x + 3)*cos(x)
(3). 转换为指定精度数值解的函数 evalf()
将圆周率 PI 保留三位有效数字
import sympy
print(sympy.pi.evalf(3))
计算函数值, 并保留3位有效数字
结果:
3.14
(4). 利用 lambdify() 函数将 SymPy 表达式转换为 NumPy 可使用的函数
作用: 可以获得高精度, 如保留小数点后 1000 位
import sympy
import numpy
a = numpy.pi / 6
x = sympy.symbols('x')
y = sympy.sin(x)
f = sympy.lambdify(x, y, 'numpy')
print(f(a))
print(y.subs(x, sympy.pi / 3))
结果:
0.49999999999999994
sqrt(3)/2
(5). 化简函数 simplify()
作用: 化简函数表达式
import sympy
x = sympy.symbols('x')
y = sympy.sin(x)**2 + sympy.cos(x)**2
print('化简前\\ny =', y)
print('化简后\\ny =', sympy.simplify(y))
结果:
化简前
y = sin(x)**2 + cos(x)**2
化简后
y = 1
(6). 多项式展开函数 expand()
作用: 有理函数展开为多项式
import sympy
x = sympy.symbols('x')
y = (x + 1) ** 2
print('展开前\\ny =', y)
print('展开后\\ny =', sympy.expand(y))
结果:
展开前
y = (x + 1)**2
展开后
y = x**2 + 2*x + 1
(7). 多项式因式分解函数 factor()
作用: 有理函数因式分解
import sympy
x = sympy.symbols('x')
y = (x + 1) ** 2
print('展开前\\ny =', y)
print('展开后\\ny =', sympy.expand(y))
print('因式分解\\ny =', sympy.factor(y))
结果:
展开前
y = (x + 1)**2
展开后
y = x**2 + 2*x + 1
因式分解
y = (x + 1)**2
(8). 多项式合并同类项函数 collect()
作用: 有理函数合并同类项
(9). 有理分式化简函数 cancel()
作用: 消去分子分母的公因式使用
(10). 有理分式展开函数 apart()
作用: 将有理分式展开
3. 函数求导数或偏导数
函数 | 作用 |
---|---|
diff(SymPy表达式-函数, 符号-自变量, 阶数 = 1) | 对自变量求导 |
import sympy
x = sympy.symbols('x')
y = 5 * x ** 2 + sympy.cos(x)
print('y =', y)
print("y' =", sympy.diff(y, x))
结果:
y = 5*x**2 + cos(x)
y' = 10*x - sin(x)
4. 函数计算积分
函数 | 作用 |
---|---|
integrate(SymPy表达式-函数, 符号-自变量) | 对自变量求不定积分 |
integrate(SymPy表达式-函数, (符号-自变量, 积分下限, 积分上限)) | 对自变量求不定积分 |
integrate(SymPy表达式-函数, (符号-自变量, 积分下限, 积分上限), (符号-自变量, 积分下限, 积分上限), ...) | 对自变量求冲积分 |
(1). 不定积分 integrate()
import sympy
x = sympy.symbols('x')
y = 5 * x ** 2 + sympy.cos(x)
print('y =', y)
print("y的一个原函数 =", sympy.integrate(y, x))
结果:
y = 5*x**2 + cos(x)
y的一个原函数 = 5*x**3/3 + sin(x)
(2). 定积分 integrate()
import sympy
x = sympy.symbols('x')
y = sympy.exp(-x)
print("e的-x方从0到无穷大的定积分为", sympy.integrate(y, (x, 0, 'oo')))
结果:
e的-x方从0到无穷大的定积分为 1
(3). 重积分 integrate()
二重积分
import sympy
x, y = sympy.symbols('x y')
z = sympy.exp(-x**2 - y**2)
print(sympy.integrate(z, (x, '-oo', 'oo'), (y, '-oo', 'oo')))
结果:
pi
5. 函数求极限 limit()
函数 | 作用 |
---|---|
limit(SymPy表达式-函数, 符号-自变量, 数值, 符号) | 对函数求数值处的极限, 符号表示左右极限 |
符号取值: '+'
(右极限) 或 '-'
(左极限)
import sympy
x = sympy.symbols('x')
y = sympy.sin(x) / x
print(sympy.limit(y, x, 0, '-'))
结果:
1
6. 函数泰勒级数展开 series()
函数 | 作用 |
---|---|
series(符号-自变量, 展开点, 阶数) | 将函数在指定站开点展开为指定阶数的泰勒级数, 余项是皮亚诺余项 |
符号取值: '+'
(右极限) 或 '-'
(左极限)
import sympy
x = sympy.symbols('x')
y = sympy.sin(x)
print(y.series(x, 0, 4))
结果:
x - x**3/6 + O(x**4)
7. 解方程
函数 | 作用 |
---|---|
Eq(方程左端表达式, 方程右端的表达式) | 构造方程 |
solveset(方程, 符号-未知数, domain = 范围) | 在指定数域内解方程, 默认为复数域 |
dsolve(方程, 方程中的函数 | 解微分方程 |
(1). 构造方程 Eq()
import sympy
x = sympy.symbols('x')
e = sympy.Eq(x**2 - x, 0)
print(e)
结果:
Eq(x**2 - x, 0)
(2). 解一元n次方程 solveset()
import sympy
x = sympy.symbols('x')
e = sympy.Eq(x**2 - x, 0)
print('解:', sympy.solveset(e, x))
结果:
解: 0, 1
(3). 解微分方程 dsolve()
import sympy
x = sympy.symbols('x')
# 建立函数
f = sympy.symbols('f', cls = sympy.Function)
e = sympy.Eq(f(x).diff(x, 2) - 2*f(x).diff(x) + f(x), sympy.sin(x))
print('解:', sympy.dsolve(e, f(x)))
结果:
解: Eq(f(x), (C1 + C2*x)*exp(x) + cos(x)/2)
8. 矩阵运算
函数 | 作用 |
---|---|
Matrix(列表) | 构造矩阵 |
.T | 矩阵转置 |
eye(阶数) | 构造指定阶数的单位阵 |
zeros(阶数) | 构造指定阶数的零矩阵 |
ones(阶数) | 构造指定阶数的一矩阵 |
diag(a, b, c, ...) | 构造对角阵, a, b, c, …为对角线元素 |
A**幂 | 矩阵的幂 |
A**-1 | 逆矩阵 |
.det() | 计算方针行列式 |
.eigenvals() | 计算特征值 |
计算特征值
import sympy
A = sympy.Matrix([[3, -2, 4, -2], [5, 3, -3, -2], [5, -2, 2, -2], [5, -2, -3, 3]])
print(A.eigenvals())
结果:
3: 1, -2: 1, 5: 2
字典的键表示特征值, 值表示特征值的重数
SymbolicPython库中的其他函数
1. 分数
使用Rational()
函数构造分数
import sympy
a = sympy.Rational(2, 2)
print(a)
print(type(a))
结果:
1/2
<class 'sympy.core.numbers.Half'>
由于构造出来的a是对象, 所有打印出来以分数的形式, 而不是小数
以上是关于学习 Python 之 SymbolicPython库的主要内容,如果未能解决你的问题,请参考以下文章