学习 Python 之 SymbolicPython库

Posted _DiMinisH

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了学习 Python 之 SymbolicPython库相关的知识,希望对你有一定的参考价值。

学习 Python 之 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库的主要内容,如果未能解决你的问题,请参考以下文章

python学习笔记之运算符

python学习笔记之集合2

Python学习日记之记录

Python学习笔记之网络编程

python学习笔记之语句1

python学习笔记之字典2