【问题标题】:Python SymPy weird expression resultPython SymPy 奇怪的表达式结果
【发布时间】:2017-12-21 21:37:56
【问题描述】:
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 不更改公式中元素的顺序,只用漂亮的乳胶打印出来,然后替换变量并再次打印,但保持第一个公式中所有元素的顺序? 我不想称之为任何形式的简化,至少现在还没有,因为这个公式已经足够简单了。

【问题讨论】:

    标签: python sympy


    【解决方案1】:

    打印的元素的顺序就是它的存储顺序——并且因为运算符“+”是法币可交换的,所以您不能指定打印它们的顺序。

    对于乘法和乘法运算符,可以指定不定数是不可交换的;例如

    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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-01-22
      • 2016-07-26
      • 1970-01-01
      相关资源
      最近更新 更多