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
当我运行这个ine 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 不更改公式中元素的顺序,而只是用漂亮的 latex 打印出来,然后替换变量并再次打印,但保持第一个公式中所有元素的顺序? 我不想称之为任何形式的简化,至少现在还不想,因为这个公式足够简单。
最佳答案
打印元素的顺序就是它的存储顺序——并且因为运算符“+”是可交换的,所以您不能指定它们的打印顺序。
对于乘法和乘法运算符,您可以指定不定式是不可交换的;例如
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
关于Python SymPy 奇怪的表达式结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47933045/