简单方便, 在 VSCode 中使用 Latex 公式和 Python 进行科学计算

简单方便, 在 VSCode 中使用 Latex 公式和 Python 进行科学计算

简介

Latex Sympy Calculator 是一款 VSCode 插件, 它能够帮助你在 VSCode 写 Latex 或 Markdown 的时候, 一键计算 Latex 书写的数学公式.

当前支持的功能:

  1. 算术: 加 (+), 减 (-), 点乘 (·), 叉乘 (×), 除法 (/), 乘方 (^), 绝对值 (|x|), 开方 (√), 虚数 (i)…
  2. 字母表: 英文字母 a - z, A - Z, 希腊字母 α - ω, 下标 (x_1), 重音符 (ā)…
  3. 常见函数: 最大公约数 (gcd), 最小公倍数 (lcm), 下界 (floor), 上届 (ceil), 最大值 (max), 最小值 (min), 取对数 (log), 自然对数 (ln), 指数 (exp), 三角函数 (sin, cos, tan, csc, sec, cot, arcsin, sinh, arsinh)…
  4. 微积分: 求极限 (limnlim_{n\to\infty}), 求导/求微分 (ddx(x2+x)\frac{d}{dx}(x^2+x)), 求积分 (xdx\int xdx)…
  5. 线性代数: 矩阵 (Matrix), 行列式 (Determinant), 转置 (Transpose), 求逆 (Inverse), 初等变换 (Elementary Transformation)…
  6. 关系符: 大于 (>), 小于 (<), 大于等于 (≥), 小于等于 (≤), 相等 (=)…
  7. 其他: 二项式…

当然, 实际上还有很多其他的功能, 只要是 Python Sympy 包支持的运算, 都可以通过这个插件来实现.

通过这个插件, 你就不再需要一字一句地将 Latex 转译成其他语言, 然后用 Matlab 或 MMA 等数学软件进行科学计算了. 简单的 符号推导, 矩阵运算, 微积分, 科学计算, 完全可以利用这个插件来实现.

如果你也在 VSCode 中用 LatexMarkdown 写数学公式, 那么这就是你 必备的 VSCode 科学计算插件.

插件的 GitHub 页面.

latex2sympy2 包的 Github 页面.


PS: 如果你不希望在 VSCode 中使用, 也可以独立出来, 单独使用这个 latex2sympy2 包进行 Latex 公式的科学计算, 详情请拉到本文的最下方. 甚至你可以把这个包集成到其他环境, 可能的例子有 Typora 或其他 Latex 编辑器?


在 VSCode 中安装

在 VSCode 的插件商店中, 搜索 Latex Sympy Calculator 并安装 Install.

安装完成之后, 暂时还不能直接使用, 你还需要 安装 Python, 安装 Flask 包安装 latex2sympy2 包.

安装 Python:

你可以去 官网 下载 Python3.

如果你是 Windows, 而且觉得官网网络连接不稳定, 可以去 软件中心 下载.

如果你是 Mac, 可以使用 brew install python 安装 Python3.

如果你是 Linux, 可以执行以下命令安装 Python3 和 Pip3:

1
2
sudo apt install python3
sudo apt-get install python3-pip

安装 Flask 和 latex2sympy2 包:

执行以下命令:

1
2
pip install latex2sympy2
pip install Flask

如果使用的是 Mac 或 Linux, 并且安装失败了, 可以尝试用 pip3 替代 pip.

检查是否安装成功:

在命令行中, 输入 python 进入 Python 交互环境, 然后输入以下代码:

1
2
import latex2sympy2
import flask

如果没有报错, 就说明安装成功了.

在 VSCode 中使用

如同这个动图所展示的一样, 你可以选中一些内容, 然后按下快捷键, 就会输出相应的结果.

计算 Latex 公式并输出 Latex 结果

你可以选中一段 Latex 公式, 然后按下 Shift + Ctrl + Alt + E (equal) 获取相应的结果, 大概如下:

1
2
3
4
5
# 计算前
\frac{d}{dx}(x^3+x^2+1)

# 计算后
\frac{d}{dx}(x^3+x^2+1) = x \left(3 x + 2\right)

你也可以选中一段 Latex 公式, 然后按下 Shift + Ctrl + Alt + R (replace) 获取相应的结果, 这个快捷键与上一个的唯一区别是, 它会直接替换掉你选中的公式, 大概如下:

1
2
3
4
5
# 计算前
\frac{d}{dx}(x^3+x^2+1)

# 计算后
x \left(3 x + 2\right)

计算 Latex 公式并输出数值结果

你可以选中一些文本, 并按下 Shift + Ctrl + Alt + N (numerical) 来获取当前 Latex 公式的. It will like:

1
2
3
4
5
# 计算前
\sqrt{2}

# 计算后
\sqrt{2} = 1.41421356237310

变量

你可以定义并赋值一个变量. 使用 Shift + Ctrl + Alt + D (define) 快捷键和类似 y = x + 1 的语法实现这个功能.

1
2
3
4
5
6
7
8
9
10
# 按下 Shift + Ctrl + D 进行变量定义与赋值
y = x + 1

# Shift + Ctrl + E
# 计算前
2y
# 计算后
2y = 2 x + 2

# 你可以看出, y 被替换成了 x + 1 来参与计算

PS: 如果你计算的是 y == x + 1, 它不是变量定义与赋值, 它输出的是 truefalse, 代表着这个等式是否成立.

如果你想查看现有已定义的变量, 你可以按下 Shift + Ctrl + P, 然后输入 latex-sympy-calculator: Show Current variances 并运行, 然后你就会获取到类似这样的数据:

1
2
y = x + 1
z = 2x

如果你想清除这些已经定义的变量, 你可以按下 Shift + Ctrl + P, 然后输入 latex-sympy-calculator: Reset Current variances 并运行.

如果你想要关闭虚数 i 的支持, 可以按下 Shift + Ctrl + P, 然后输入 latex-sympy-calculator: Toggle Complex Number Support For Variances.

虚数功能类似这样: x = 1 + 2i, \int \cos xe^{-ikx}dx.

在 VSCode 中执行 Python 表达式

你可以用快捷键 Shift + Ctrl + Alt + P 计算一个 Python 表达式.

支持所有的 Sympy 和 latex2sympy2 包的功能.

例如, 你可以获取当前已经定义的变量值:

1
2
3
4
5
# 运算前
var['y']

# 运算后
var['y'] = x + 1

你可以解方程:

1
2
3
4
5
# 运算前
solve([2 * x - y - 3, 3 * x + y - 7],[x, y])

# 运算后
solve([2 * x - y - 3, 3 * x + y - 7],[x, y]) = {x: 2, y: 1}

将 Latex 转成 Sympy 和将 sympy 转成 latex:

1
2
3
4
5
6
7
8
# Latex to Sympy
expr = latex2sympy(r'x^2 + 3x + 1')

# Sympy to Latex
latex = latex(expr)

# Latex to Latex
result = latex2latex(r'\frac{d}{dx}(x^3+x^2+1)')

举一个更综合的例子吧, 你可以带着运算过程, 进行特征值的求解:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
对于矩阵: $A=\begin{bmatrix}	5 &6 &-3 \\	-1 &0 &1 \\	1 &2 &-1 \\\end{bmatrix}$

我们令 $B=\lambda\begin{bmatrix}1 &0 &0 \\0 &1 &0 \\0 &0 &1 \\\end{bmatrix}-\begin{bmatrix} 5 &6 &-3 \\ -1 &0 &1 \\ 1 &2 &-1 \\\end{bmatrix}=\left[\begin{matrix}\lambda - 5 & -6 & 3\\1 & \lambda & -1\\-1 & -2 & \lambda + 1\end{matrix}\right]$

它的行列式是 $latex(var["B"].doit().det()) = \lambda^{3} - 4 \lambda^{2} + 2 \lambda + 4$

对它进行因式分解可得: $latex(factor(var["B"].doit().det())) = \left(\lambda - 2\right) \left(\lambda^{2} - 2 \lambda - 2\right)$

求出对应的特征值 $latex(solve(var["B"].doit().det())) = \left[ 2, \ 1 - \sqrt{3}, \ 1 + \sqrt{3}\right]$

或我们可以用 Sympy 直接计算出结果: $latex(var["A"].eigenvals()) = \left\{ 2 : 1, \ 1 - \sqrt{3} : 1, \ 1 + \sqrt{3} : 1\right\}$

我们再令 $\lambda_1=2, \lambda_2=1-\sqrt{3}, \lambda_3=1+\sqrt{3}$

所以可知 $B_1=\lambda_1\begin{bmatrix}1 &0 &0 \\0 &1 &0 \\0 &0 &1 \\\end{bmatrix}-\begin{bmatrix} 5 &6 &-3 \\ -1 &0 &1 \\ 1 &2 &-1 \\\end{bmatrix}=\left[\begin{matrix}-3 & -6 & 3\\1 & 2 & -1\\-1 & -2 & 3\end{matrix}\right]$

赋值给变量: $B_1=\left[\begin{matrix}-3 & -6 & 3\\1 & 2 & -1\\-1 & -2 & 3\end{matrix}\right]$

用初等行变换化简:

$latex(var["B_1"].doit().rref()) = \left( \left[\begin{matrix}1 & 2 & 0\\0 & 0 & 1\\0 & 0 & 0\end{matrix}\right], \ \left( 0, \ 2\right)\right)$

对于特征值 $\lambda_1=2$, 它的一个特征向量是 $\xi_1=\begin{pmatrix}-2\\1\\0\end{pmatrix}$

所以对于特征值 $\lambda_1=2$, 它的全部特征向量是 $k_1\xi_1 \ (k_1\neq 0, k_1\in P)$

同样地, 我们可以获取到所有的特征值和特征向量:

$latex(var["A"].eigenvects()) = \left[ \left( 2, \ 1, \ \left[ \left[\begin{matrix}-2\\1\\0\end{matrix}\right]\right]\right), \ \left( 1 - \sqrt{3}, \ 1, \ \left[ \left[\begin{matrix}6 - 3 \sqrt{3}\\-2 + \sqrt{3}\\1\end{matrix}\right]\right]\right), \ \left( 1 + \sqrt{3}, \ 1, \ \left[ \left[\begin{matrix}3 \sqrt{3} + 6\\-2 - \sqrt{3}\\1\end{matrix}\right]\right]\right)\right]$

在非 VSCode 环境下使用

Sympy 是一个使用 Python 书写的符号运算包, 可以通过它进行各种各样的科学计算. 想要使用 Sympy, 你需要先写出一个 Sympy 表达式.

Sympy 表达式可以使用自带的功能转为 Latex 公式, 但是 Sympy 没有提供自带的 Latex 公式转 Sympy 表达式的功能.

所以我们需要另外一个, 我在开源项目的基础上进行过相应扩展的包: latex2sympy2. 它可以将 Latex 表达式转为 Sympy 表达式.

安装 Sympy 和 latex2sympy2 包

执行以下命令:

1
2
pip install latex2sympy2
pip install sympy

如果使用的是 Mac 或 Linux, 并且安装失败了, 可以尝试用 pip3 替代 pip.

检查是否安装成功:

在命令行中, 输入 python 进入 Python 交互环境, 然后输入以下代码:

1
2
import latex2sympy2
import sympy

如果没有报错, 就说明安装成功了.

计算 Latex 表达式并以 Latex 形式输出

1
2
3
4
5
from latex2sympy2 import latex2latex

result = latex2latex(r"\frac{d}{dx}(3x^2 + 2x + 1)")

print(result)

将 Latex 表达式转为 Sympy 表达式

1
2
3
4
5
6
7
8
9
10
11
12
13
14
from latex2sympy2 import latex2sympy
from sympy.abc import *
from sympy import latex

expr = latex2sympy(r"\frac{d}{dx}(3x^2 + 2x + 1)")

# 直接打印表达式
print(expr)

# 将这个表达式运算化简之后 (这里是求导), 加上 x 并输出
print(expr.doit() + x)

# 在上一个语句的基础上, 转成 Latex 形式之后再输出
print(latex(expr.doit() + x))

其他语法

更多的 Sympy 语法可以看看 Sympy 的官方文档.

里面有许多例子, 例如使用 latex2sympy("\sqrt{2}").evalf() 获取数值结果等功能, 这里就不多赘述.

在其他编辑器中集成

其实, 提供了这个 Python 包之后, 理论上只要一个编辑器支持使用插件, 并能够调用相应的 Python 包, 就能集成这个 Latex 公式科学计算的功能.

例如, 如果你在使用 Vim, 你可以用 UltiSnips 插件调用这个 Python 包, 然后取得计算的结果并输出.

再例如, 你想要在 Typora 中集成, 只要你想办法在 Typora 中写一个插件, 并调用相应的 Python 包和函数, 就能实现科学计算的功能. 由于 Typora 不开源, 并且对第三方插件还没有太好的支持, 所以我暂时没有办法为 Typora 实现相应的拓展.

最后, 如果你不想在任何编辑器中使用, 只是想要一个独立的软件或程序, 带有简洁的 UI 和简洁的 Latex 公式计算功能, 可以跟我反馈, 我后续可能考虑写一个简单的软件.

扩展 latex2sympy2 包的语法

如果你认为 latex2sympy2 包还不能满足你的需求, 可以考虑帮忙扩展 latex2sympy2 的语法!

latex2sympy2 包的 Github 页面.

latex2sympy2 是在 augustt198/latex2sympypurdue-tlt / latex2sympy 的基础上进行增强的项目.

其中转译器使用了 ANTLR, 你可以使用它进行语法的扩展.

其中语法定义在 PS.g4 文件中, 参考 ANTLR 的文档, 你可以轻易地定义一个新的语法. 在更新完语法之后, 你还需要在 latex2sympy2.py 中解析你的语法, 并转成 Sympy 表达式.

更详细的描述在 这里.

End

最后, 感谢你看到这里!

使用搜索:谷歌必应百度