SymPy仅对方程进行部分化简
说明
我写了一个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导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。





