在Sympy中防止乘法表达式的计算

6
我将生成一个包含两个分数的表达式,并希望将其整体以LaTeX的形式漂亮地打印出来,然后放在工作表上。
例如,形式如下:
(5/7) * (3/4). 

然而,当我执行以下操作时:

fract1 = sympy.sympify(Fraction(5,7))
fract2 = sympy.sympify(Fraction(3,4))
expression = sympy.Mul(fract1,fract2,evaluate=False)

它返回结果。
5*3/(7*4)

显然它正在合并分数但没有实际计算,但我希望能够以适合作为数学工作表问题的格式生成它。


最终目标只是打印还是你希望稍后评估表达式? - hashcode55
是的,我想先打印它,然后稍后再进行评估。 - benjo456
SymPy的教程正在添加示例:https://github.com/sympy/sympy/pull/12232 - Francesco Bonazzi
2个回答

5
下一个SymPy版本将拥有UnevaluatedExpr
In [4]: uexpr = UnevaluatedExpr(S.One*5/7)*UnevaluatedExpr(S.One*3/4)

In [7]: uexpr
Out[7]: 5/7⋅3/4

要发布和评估它,只需使用 .doit()

In [8]: uexpr.doit()
Out[8]: 
15
──
28

LaTeX的输出结果如下:

In [10]: print(latex(uexpr))
\frac{5}{7} \frac{3}{4}

自 SymPy 1.1 版本起,此功能已经可用。请查看文档了解更多信息。


这是预先计划好的还是针对问题做出的回应?谢谢! - benjo456
该功能几个月前已添加到主开发分支。SymPy教程中的文档是针对这个问题添加的(之前缺失了)。 - Francesco Bonazzi

2

以下是一种非常简单的方法(仅适用于两个分数的情况):

def print_fractions(expr):
    print("({}) * ({})".format(*expr.args))

这是工作原理:

如下图所示:

In:  expr = sympy.Mul(sympy.S("5/7"), sympy.S("3/4"), evaluate=False)
In:  expr
Out: 5*3/(7*4)
In:  print_fractions(expr)
Out: (5/7) * (3/4)

您可以使用srepr来检查分数在expr中实际上没有组合,这只是sympy决定打印的方式:

In:  sympy.srepr(expr)
Out: 'Mul(Rational(5, 7), Rational(3, 4))'

另一种方法是扩展 sympy.Mul 并重写 __str__ 方法:

class MyMul(sympy.Mul):
    def __str__(self):
        return "({}) * ({})".format(*self.args)

然后你将拥有:
In:  expr = MyMul(sympy.S("5/7"), sympy.S("3/4"), evaluate=False)
In:  print(expr)
Out: (5/7) * (3/4)

编辑:如何使latex()正常工作

再次采用hackish方法,但是:

class MyMul(Mul):
    def _latex(self, _):
        return r"\left({} \cdot {}\right)".format(*map(latex, self.args))

现在:

In:  a = S("5/7")
In:  b = S("3/4")
In:  c = MyMul(a, b, evaluate=False)
In:  print(latex(c))
Out: \left(\frac{5}{7} \cdot \frac{3}{4}\right)

您IP地址为146.190.162.183,由于运营成本限制,当前对于免费用户的使用频率限制为每个IP每72小时10次对话,如需解除限制,请点击左下角设置图标按钮(手机用户先点击左上角菜单按钮)。

你好,谢谢您的回复。这个方法确实有效,但是一旦涉及到 LaTeX,问题就出现了,因为 sympy.latex 无法处理所创建的字符串。 - benjo456
@benjo456 没有任何阻止你对该类的 _latex 方法进行黑客攻击。我现在将其添加到答案中。 - avysk

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接