SymPy符号计算

0. 概要

像我这种粗心的小孩,在推导一些复杂的公式 (尤其是矩阵运算) 的时候,经常容易算错数,一步推错,步步错。万能的Python有什么方法可以帮我们节省时间,减少出错率呢?

有一个包叫做 SymPy ,它可以帮我们自动的进行 符号化计算 。所谓符号化计算的含义是指,带入运算的不是某个具体的数值,而是抽象的数学符号,并且还可以帮我们将最终得到的结果进行归并简化 (例如 sin cos 函数的合并)。

这篇文章会用案例的方式,给大家展示一下sympy的常用功能。

1. 安装工具包

Windows下安装Sympy

pip install sympy

Linux下安装Sympy

sudo pip3 install sympy

2. 导入工具包

🖌 代码片段

import sympy as sym
from sympy import sin,cos

3. 符号

sympy支持latex表达式

theta = symbols('theta')
theta
delta_t = sym.symbols('delta_t')
delta_t

同时定义多个符号

# 定义符号
theta_1, theta_2,theta_3, l_2, l_3 = sym.symbols('theta_1, theta_2, theta_3, l_2, l_3')

4. 函数

4.1 三角函数

theta = symbols('theta')
a = cos(theta) * cos(theta) - sin(theta)*sin(theta)
Eq(a)

📓 输出日志

4.2 函数简化

可以调用 simplify 函数进行结果的简化。

sym.simplify(a)

📓 输出日志

4.3 多元函数

x, y = sym.symbols('x y')
f = (x + 2)**2 + 5*y
sym.Eq(f)

📓 输出日志

4.4 带入数值

给变量赋值,计算函数的结果。

f.evalf(subs = {x:1,y:2})

📓 输出日志

5. 矩阵

5.1 定义矩阵

dt = sym.symbols('delta_t')
# 定义矩阵T
T = sym.Matrix(
    [[1, 0, 0, 0], 
     [1, dt, dt**2, dt**3], 
     [0, 1, 0, 0],
     [0, 1, 2*dt, 3*dt**2]])
T

📓 输出日志

5.2 矩阵行列式

测试行列式求解

# 计算行列式
sym.det(T)

📓 输出日志

5.3 矩阵求逆

# 矩阵求逆
T_inverse = T.inv()
# 逆矩阵
T_inverse

📓 输出日志

6. 打印Latex表达式

运算得到的结果可以直接插到论文里,不用自己再手敲一遍latex。

直接导出结果的latex字符

sym.print_latex(T_inverse)

📓 输出日志

\left[\begin{matrix}1 & 0 & 0 & 0\\0 & 0 & 1 & 0\\- \frac{3}{\delta_{t}^{2}} & \frac{3}{\delta_{t}^{2}} & - \frac{2}{\delta_{t}} & - \frac{1}{\delta_{t}}\\\frac{2}{\delta_{t}^{3}} & - \frac{2}{\delta_{t}^{3}} & \frac{1}{\delta_{t}^{2}} & \frac{1}{\delta_{t}^{2}}\end{matrix}\right]

可以copy,插入到markdown正文中

$$
这里插入刚才导出的字符串
$$

📓 输出日志