防止Sympy中的乘法表达式求值

问题描述 投票:4回答:2

我正在生成一个带有两个分数的表达式,并希望使用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)

显然它是组合分数而不是实际评估,但我希望能够以适合作为数学工作表问题的格式生成它。

python python-3.x numpy latex sympy
2个回答
2
投票

下一个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开始,此功能可用。见documentation to find out more


2
投票

这是非常hackish的方式(仅适用于两个分数的情况):

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)

Eidt:如何使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)

当然,您可以在上面的_latex定义中更改您输出的确切内容。

© www.soinside.com 2019 - 2024. All rights reserved.