学习 Python 之 SymbolicPython库

学习 Python 之 SymbolicPython库

  • SymbolicPython库
    • SymbolicPython库
      • 为什么选择 SymPy ?
    • SymbolicPython库的简单使用
      • 1. 定义符号
        • (1). 使用symbols函数定义符号
        • (2). SymPy 的 abc 子模块导入所有拉丁字母和希腊字母
        • (3). symbols函数
          • 指定变量定义域
          • 定义多个变量
      • 2. 符号的基本操作
        • (1). 替换函数 subs()
        • (2). 字符串转换表达式函数 sympify()
        • (3). 转换为指定精度数值解的函数 evalf()
        • (4). 利用 lambdify() 函数将 SymPy 表达式转换为 NumPy 可使用的函数
        • (5). 化简函数 simplify()
        • (6). 多项式展开函数 expand()
        • (7). 多项式因式分解函数 factor()
        • (8). 多项式合并同类项函数 collect()
        • (9). 有理分式化简函数 cancel()
        • (10). 有理分式展开函数 apart()
      • 3. 函数求导数或偏导数
      • 4. 函数计算积分
        • (1). 不定积分 integrate()
        • (2). 定积分 integrate()
        • (3). 重积分 integrate()
      • 5. 函数求极限 limit()
      • 6. 函数泰勒级数展开 series()
      • 7. 解方程
        • (1). 构造方程 Eq()
        • (2). 解一元n次方程 solveset()
        • (3). 解微分方程 dsolve()
      • 8. 矩阵运算
        • 计算特征值
      • 9. 画图
        • (1). 画二维显式函数图像
        • (2). 画二维隐函数图像
        • (3). 画三维函数图像
    • SymbolicPython库中的其他函数
      • 1. 分数

SymbolicPython库

常用函数总结

函数 作用
.subs(符号, 替换量) 用来计算函数值
sympify(字符串) 将字符串转变为一个 SymPy 表达式
.evalf(精度) 转换为指定精度数值解的函数
lambdify(符号-自变量, SymPy表达式-函数, 'numpy') 将 SymPy 表达式转换为 NumPy 可使用的函数
simplify(SymPy表达式-函数) 将函数化为最简形式
expand(SymPy表达式-函数) 将多项式函数展开
factor(SymPy表达式-函数) 将多项式函数因式分解
collect(SymPy表达式-函数, 符号-自变量) 多项式合并同类项函数
cancel(SymPy表达式-函数) 有理分式化简函数
apart(SymPy表达式-函数) 有理分式展开函数
diff(SymPy表达式-函数, 符号-自变量, 阶数 = 1) 对自变量求导
integrate(SymPy表达式-函数, 符号-自变量) 对自变量求不定积分
integrate(SymPy表达式-函数, (符号-自变量, 积分下限, 积分上限)) 对自变量求不定积分
integrate(SymPy表达式-函数, (符号-自变量, 积分下限, 积分上限), (符号-自变量, 积分下限, 积分上限), ...) 对自变量求重积分
limit(SymPy表达式-函数, 符号-自变量, 数值, 符号) 对函数求数值处的极限, 符号表示左右极限
.series(符号-自变量, 展开点, 阶数) 将函数在指定站开点展开为指定阶数的泰勒级数, 余项是皮亚诺余项
Eq(方程左端表达式, 方程右端的表达式) 构造方程
solveset(方程, 符号-未知数, domain = 范围) 在指定数域内解方程, 默认为复数域
dsolve(方程, 方程中的函数 解微分方程
Matrix(列表) 构造矩阵
.T 矩阵转置
eye(阶数) 构造指定阶数的单位阵
zeros(阶数) 构造指定阶数的零矩阵
ones(阶数) 构造指定阶数的一矩阵
diag(a, b, c, ...) 构造对角阵, a, b, c, …为对角线元素
A**幂 矩阵的幂
A**-1 逆矩阵
.det() 计算方针行列式
.eigenvals() 计算特征值
plot(SymPy表达式-函数, (符号-自变量, 区间左端, 区间右端)) 画显式函数图像
plot_implicit(方程) 画隐函数图像
plotting.plot3d(SymPy表达式-函数, (符号-自变量, 区间左端, 区间右端), (符号-自变量, 区间左端, 区间右端), ...) 画3维图像

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}

字典的键表示特征值, 值表示特征值的重数

9. 画图

函数 作用
plot(SymPy表达式-函数, (符号-自变量, 区间左端, 区间右端)) 画显式函数图像
plot_implicit(方程) 画隐函数图像
plotting.plot3d(SymPy表达式-函数, (符号-自变量, 区间左端, 区间右端), (符号-自变量, 区间左端, 区间右端), ...) 画3维图像

(1). 画二维显式函数图像

import sympy

x = sympy.symbols('x')
y = x ** 2
sympy.plot(y, (x, -2, 2))

(2). 画二维隐函数图像

import sympy

x, y = sympy.symbols('x, y')
e = sympy.Eq(x**2 + y**2, 1)
sympy.plot_implicit(e)

(3). 画三维函数图像

import sympy

x, y = sympy.symbols('x, y')
z = x * sympy.exp(-x ** 2 - y ** 2)
sympy.plotting.plot3d(z, (x, -3, 3), (y, -2, 2))

SymbolicPython库中的其他函数

1. 分数

使用Rational()函数构造分数

import sympy

a = sympy.Rational(2, 2)
print(a)
print(type(a))

结果:

1/2

由于构造出来的a是对象, 所有打印出来以分数的形式, 而不是小数

你可能感兴趣的:(Python,python,学习)