Python SymPy 奇怪的表达式结果

标签 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

当我运行这个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/

相关文章:

python - 如何以正确的方式显示 sympy 输出

python - 如何在 sympy + IPython 中禁用 init_printing

python - Sympy 失败,wxMaxima 没有

python - 如何有效地从稀疏矩阵中删除列?

python - 如何使用 sympy 解方程?

python - Python 保持套接字事件时遇到问题

python - 属性错误: 'LGEOS360' object has no attribute 'GEOSBufferWithParams'

python - 使用条件和函数向量化嵌套循环

Python pyqt5使settooltip的字体与按钮字体不同

python - 具有不断变化的 y 值的 Matplotlib 热图