gpt4 book ai didi

Python SymPy 奇怪的表达式结果

转载 作者:行者123 更新时间:2023-12-01 02:21:11 25 4
gpt4 key购买 nike

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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com