Python SymPy奇怪的表达结果

时间:2017-12-21 21:37:57

标签: python sympy

import sympy
import math
from sympy import *
a, b, c, d, stf, lc = symbols('a b c d stf lc')
init_printing()
expr = (2*(sin (a) + sin (b)/2)*(sin (c) + sin (d)/2)*stf)+(2*(cos (a) + cos (b)/2)*(cos (c)+ cos (d)/2)*lc)*2
expr

当我运行这个时,ig给我的结果如下: 2 * lc *(2 * cos(a)+ cos(b))(cos(c)+ cos(d)/ 2)+ stf (2 * sin(a)+ sin(b ))*(sin(c)+ sin(d)/ 2)

我意识到expr中的第一个公式并不是最简单的,但是当我尝试将其打印出来时,它会进行一些奇怪的简化。 当我 替换所有变量并再次打印出来,它甚至更进一步: (2sin(30)+ SIN(40))(250sin(30)+ 500sin(60))+(cos(40)+ 2COS(30))(5000cos(60)+ 2500cos(30))

是否有任何选项可以让SymPy不改变公式中元素的顺序,只需将它打印出漂亮的乳胶,然后替换变量并再次打印,但保留第一个公式中所有元素的顺序? 我不想要任何简化,至少现在还没有,因为这个公式很简单。

1 个答案:

答案 0 :(得分:2)

打印元素的顺序是它的存储顺序 - 由于操作符“+”是通过命令交换的,因此您无法指定它们的打印顺序。

对于乘法运算符和乘法运算符,您可以指定不确定运算符是非可交换的; e.g。

A,B = symbols('A B', commutative=False)

B*A
# B*A

A*B
# A*B

您要记住的是,当您在REPL循环中键入类似“a + b”的内容时,解释器会创建一个带有SymPy类的新对象,计算表达式“a + b”,并设置创建的对象到该评估的结果。存储的不是公式“a + b”,而是表示“a + b”表示的数学对象的对象。同样,如果您输入:

a = 3 + 4

a设置为 7 ,而不是“公式” 3 + 4

另一方面,如果您不想实际评估表达式,或者想要跟踪其原始字符串形式,则可以使用UnevaluatedExpr属性:

from sympy import UnevaluatedExpr

UnevaluatedExpr( A ) + UnevaluatedExpr( B )
# A + B

UnevaluatedExpr( B ) + UnevaluatedExpr( A )
# B + A

小心但是:

UnevaluatedExpr( A + B)
# A + B

UnevaluatedExpr( B + A)
# A + B