SymPy仅对方程进行部分化简

前端开发 2026-07-08

说明

我写了一个Jupyter Notebook用来检查一个恒等式是否成立:例如

在此处输入图片描述

$\tan{x}=\frac{\sin{x}}{\cos{x}}$

(这将被转换为 Eq(sin(x)**2, (1 - cos(x))/2)

返回

True

而对于

在此处输入图片描述

$\tan{x}=\frac{\cos{x}}{\sin{x}}$

(在 sympy Eq(tan(x), cos(x)/sin(x)) 中)

没有任何x 的取值能使它成立,所以程序只是返回化简后的表达式:

在此处输入图片描述

$\displaystyle \tan{\left(x \right)} = \frac{1}{\tan{\left(x \right)}}$

(等价于 Eq(tan(x), 1/tan(x))

代码 (Q29175.ipynb)

在此处输入图片描述

$\sin^{2}{x}=\frac{1-\cos{x}}{2}$
import json
from sympy import *
from latex2sympy2_extended import latex2sympy as l2s
tex=json.load(open("Q29175.ipynb"))["cells"][0]["source"][0]
l2s(tex).simplify()

错误

现在如果你用 ### Code 下提供的输入来运行它,结果有点奇怪:

在此处输入图片描述

$\displaystyle \sin^{2}{\left(x \right)} = \frac{1}{2} - \frac{\cos{\left(x \right)}}{2}$

(= Eq(sin(x)**2, -1*cos(x)/2 + 1/2))

作为人类,我们可以判断 [1-cos(x)]/2=1/2-cos(x)/2,但显然这被 sympy 忽略了——对可能发生的情况和如何修改程序以考虑这个边界情况,你有什么见解吗?

更新

  • 浏览了 Sympy simplify equation more 之后,似乎 factor() 或类似的方法或许有助于创建更健壮的实现,尽管需要以某种方式整合到验证流程中:也许我可以先对两边应用该方法,再进行最终的 simplify(),不过现在我还不太清楚这是否真的能解决问题,总之也不一定是最优雅的解决方案

备注

如果你想复现实验:

uv venv
. .venv/bin/activate
uv pip install jupyter sympy latex2sympy2_extended
jupyter-lab

现在浏览器中将打开一个新的Jupyter实例——在环境中创建一个名为 Q29175.ipynb 的新文件,并将 ### Code 下的每个代码块复制到一个单元格中,从头开始运行。你应该会看到类似这样的画面:

在此处输入图片描述

解决方案

原来 sympy 确实检测到了一个人为错误:给定 $\sin^{2}{x}=\frac{1-\cos{2x}}{2}$(会转换为 Eq(sin(x)**2, (1 - cos(2x))/2))时,会返回 True

错误的等式是 Eq(sin(x)**2, (1 - cos(x))/2)

站内所有文章版权归属LeftHeroAI导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。

相关文章