【问题标题】:SymPy does not evaluate Latex2SymPy conversion for sin(-x) or sin(pi)SymPy 不评估 sin(-x) 或 sin(pi) 的 Latex2SymPy 转换
【发布时间】:2018-04-05 22:07:51
【问题描述】:

我已经成功使用 Latex2SymPy 处理各种 LaTeX 输入已有一段时间了,但我在一些功能上遇到了麻烦。例如:

from latex2sympy.process_latex import process_sympy
from sympy import *

inputLatex = '\\sin{-x}\\sin{-x}'
trigsimp(process_sympy(inputLatex))

罪(x)**2

效果很好:trigsimp 很好地处理了简化。现在,如果我尝试:

inputLatex = '\\sin{-x}'
trigsimp(process_sympy(inputLatex))

罪(-x)

尽管这显然是正确的,但我希望 trigsimp() 给我 -sin(x) 作为答案。事实上,如果我直接从 sympy 表达式运行 trigsimp:

trigsimp(sin(-x))

-sin(x)

这是我所期望的。即使在没有 trigsimp() 命令的情况下运行 sin(-x) 也会返回 -sin(x)。我检查了我的 process_sympy('\\sin{-x}') 调用的对象类型,它是'sin'。

我认为这可能与 x 转换为 Symbol 类型的方式有关,但我随后尝试将 pi 放入 sin 函数中。

inputLatex = '\\sin{\\pi}'
trigsimp(process_sympy(inputLatex))

罪(pi)

如果我直接运行 sin(pi),无论有无 trigsimp(),我都会得到 0 作为答案。

你们中的任何人都可以解释一下吗?

【问题讨论】:

  • 你尝试过没有对罪的反斜杠吗?我有一种感觉,\\sin 并没有被识别为正弦函数,而是被称为 sin 的新符号。您可以通过运行复制此行为,例如测试 = sympy.symbols('sin');测试(3);测试(-3); sympy.trigsimp(test(-3))
  • 我使用 type() 检查了对象。 Latex2Sympy 正确处理它,将 LaTeX 转换为 Sympy 格式,并正确识别正弦函数(输入“sin”)。它只是不评估这一点。至于反斜杠,我需要它们,因为它是 LaTeX 格式。我也试过其他的简化函数,比如fu(),exptrigsimp(),同样的问题也出现了。
  • 嗨我无法运行上面的代码,你能指导一下你使用的是哪个python版本以及你是如何设置latex2sympy的

标签: sympy symbolic-math


【解决方案1】:

虽然可能为时已晚,但您可以通过调用从process_sympy(inputLatex) 获得的sympy 表达式中的doit() 方法来解决该问题。

当调用process_sympy 时,它会生成一个unevaluated sympy expression,而不是一个字符串。这个表达式不能仅仅通过调用sympify 来求值,因为它有一个属性告诉它不要求值。

您通过将该表达式转换为字符串然后对其进行符号化来解决问题,但更直接的方法是在表达式中使用doit() 方法:

inputLatex = '\\sin{-x}'
expr = process_sympy(inputLatex)
trigsimp(expr.doit())

会做的。

【讨论】:

    【解决方案2】:

    我还没有解开整个谜团,但我找到了一个肮脏的解决方法,那就是使用 sympify()。因此,如果其他人面临同样的问题,这是我为使其正常工作所做的工作:

    inputLatex = '\\sin{-x}'
    sympify(str(process_sympy(inputLatex)))
    

    现在的答案是 -sin(x),我想要的。

    至于 sin(pi) 的事情,问题是 process_sympy() 无法区分 pi 作为符号和 pi 作为数字。我在这里做了测试, type(process_sympy('\pi')) 返回符号类型,而不是数字。此处适用相同的解决方案。

    【讨论】: