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正文中
$$
这里插入刚才导出的字符串
$$
📓 输出日志