Sympify改变一切的顺序

时间:2018-01-26 17:49:25

标签: python sympy

我的Sympy脚本中有以下符号

e0 = Symbol('e0',commutative=False)
e1 = Symbol('e1',commutative=False)
e2 = Symbol('e2',commutative=False)
e3 = Symbol('e3',commutative=False)

u = Symbol('u',commutative=False)

d0 = Symbol('d0',commutative=False)
d1 = Symbol('d1',commutative=False)
d2 = Symbol('d2',commutative=False)
d3 = Symbol('d3',commutative=False)


A_0 = (Symbol('a_00',commutative=False),Symbol('a_01',commutative=False),Symbol('a_02',commutative=False),Symbol('a_03',commutative=False))
A_1 = symbols('a_10:14',commutative=False)
A_2 = symbols('a_20:24',commutative=False)
A_3 = symbols('a_30:34',commutative=False)

B = symbols('b_0:4',commutative=False)

C = Symbol('C',commutative=False)

我有一个非常大的字符串:

e0*((d0*a_00)*(-e1*d1*u-e2*d2*u-e3*d3*u)+a_00*(-e1*(-e1*d1*d1*u-e2*d1*d2*u-e3*d1*d3*u)-e2*(-e1*d2*d1*u-e2*d2*d2*u-e3*d2*d3*u)-e3*(-e1*d3*d1*u-e2*d3*d2*u-e3*d3*d3*u))) + e1*((d0*a_01)*(-e1*d1*u-e2*d2*u-e3*d3*u)+a_01*(-e1*(-e1*d1*d1*u-e2*d1*d2*u-e3*d1*d3*u)-e2*(-e1*d2*d1*u-e2*d2*d2*u-e3*d2*d3*u)-e3*(-e1*d3*d1*u-e2*d3*d2*u-e3*d3*d3*u))) + e2*((d0*a_02)*(-e1*d1*u-e2*d2*u-e3*d3*u)+a_02*(-e1*(-e1*d1*d1*u-e2*d1*d2*u-e3*d1*d3*u)-e2*(-e1*d2*d1*u-e2*d2*d2*u-e3*d2*d3*u)-e3*(-e1*d3*d1*u-e2*d3*d2*u-e3*d3*d3*u))) + e3*((d0*a_03)*(-e1*d1*u-e2*d2*u-e3*d3*u)+a_03*(-e1*(-e1*d1*d1*u-e2*d1*d2*u-e3*d1*d3*u)-e2*(-e1*d2*d1*u-e2*d2*d2*u-e3*d2*d3*u)-e3*(-e1*d3*d1*u-e2*d3*d2*u-e3*d3*d3*u))) + e0*((d0*a_10)*(d1*u)+a_10*(-e1*d1*d1*u-e2*d1*d2*u-e3*d1*d3*u)) + e1*((d0*a_11)*(d1*u)+a_11*(-e1*d1*d1*u-e2*d1*d2*u-e3*d1*d3*u)) + e2*((d0*a_12)*(d1*u)+a_12*(-e1*d1*d1*u-e2*d1*d2*u-e3*d1*d3*u)) + e3*((d0*a_13)*(d1*u)+a_13*(-e1*d1*d1*u-e2*d1*d2*u-e3*d1*d3*u)) + e0*((d0*a_20)*(d2*u)+a_20*(-e1*d2*d1*u-e2*d2*d2*u-e3*d2*d3*u)) + e1*((d0*a_21)*(d2*u)+a_21*(-e1*d2*d1*u-e2*d2*d2*u-e3*d2*d3*u)) + e2*((d0*a_22)*(d2*u)+a_22*(-e1*d2*d1*u-e2*d2*d2*u-e3*d2*d3*u)) + e3*((d0*a_23)*(d2*u)+a_23*(-e1*d2*d1*u-e2*d2*d2*u-e3*d2*d3*u)) + e0*((d0*a_30)*(d3*u)+a_30*(-e1*d3*d1*u-e2*d3*d2*u-e3*d3*d3*u)) + e1*((d0*a_31)*(d3*u)+a_31*(-e1*d3*d1*u-e2*d3*d2*u-e3*d3*d3*u)) + e2*((d0*a_32)*(d3*u)+a_32*(-e1*d3*d1*u-e2*d3*d2*u-e3*d3*d3*u)) + e3*((d0*a_33)*(d3*u)+a_33*(-e1*d3*d1*u-e2*d3*d2*u-e3*d3*d3*u)) + e0*((d0*b_0)*u+b_0*(-e1*d1*u-e2*d2*u-e3*d3*u)) + e1*((d0*b_1)*u+b_1*(-e1*d1*u-e2*d2*u-e3*d3*u)) + e2*((d0*b_2)*u+b_2*(-e1*d1*u-e2*d2*u-e3*d3*u)) + e3*((d0*b_3)*u+b_3*(-e1*d1*u-e2*d2*u-e3*d3*u)) + e_1*((d1*a_00)*(-e1*d1*u-e2*d2*u-e3*d3*u)+a_00*(-e1*d1*d1*u-e2*d1*d2*u-e3*d1*d3*u)) + -e0*((d1*a_01)*(-e1*d1*u-e2*d2*u-e3*d3*u)+a_01*(-e1*d1*d1*u-e2*d1*d2*u-e3*d1*d3*u)) + e3*((d1*a_02)*(-e1*d1*u-e2*d2*u-e3*d3*u)+a_02*(-e1*d1*d1*u-e2*d1*d2*u-e3*d1*d3*u)) + -e2*((d1*a_03)*(-e1*d1*u-e2*d2*u-e3*d3*u)+a_03*(-e1*d1*d1*u-e2*d1*d2*u-e3*d1*d3*u)) + e_1*((d1*a_10)*(d1*u)+a_10*(d1*d1*u)) + -e0*((d1*a_11)*(d1*u)+a_11*(d1*d1*u)) + e3*((d1*a_12)*(d1*u)+a_12*(d1*d1*u)) + -e2*((d1*a_13)*(d1*u)+a_13*(d1*d1*u)) + e_1*((d1*a_20)*(d2*u)+a_20*(d1*d2*u)) + -e0*((d1*a_21)*(d2*u)+a_21*(d1*d2*u)) + e3*((d1*a_22)*(d2*u)+a_22*(d1*d2*u)) + -e2*((d1*a_23)*(d2*u)+a_23*(d1*d2*u)) + e_1*((d1*a_30)*(d3*u)+a_30*(d1*d3*u)) + -e0*((d1*a_31)*(d3*u)+a_31*(d1*d3*u)) + e3*((d1*a_32)*(d3*u)+a_32*(d1*d3*u)) + -e2*((d1*a_33)*(d3*u)+a_33*(d1*d3*u)) + e_1*((d1*b_0)*u+b_0*(d1*u)) + -e0*((d1*b_1)*u+b_1*(d1*u)) + e3*((d1*b_2)*u+b_2*(d1*u)) + -e2*((d1*b_3)*u+b_3*(d1*u)) + e2*((d2*a_00)*(-e1*d1*u-e2*d2*u-e3*d3*u)+a_00*(-e1*d2*d1*u-e2*d2*d2*u-e3*d2*d3*u)) + -e3*((d2*a_01)*(-e1*d1*u-e2*d2*u-e3*d3*u)+a_01*(-e1*d2*d1*u-e2*d2*d2*u-e3*d2*d3*u)) + -e0*((d2*a_02)*(-e1*d1*u-e2*d2*u-e3*d3*u)+a_02*(-e1*d2*d1*u-e2*d2*d2*u-e3*d2*d3*u)) + e1*((d2*a_03)*(-e1*d1*u-e2*d2*u-e3*d3*u)+a_03*(-e1*d2*d1*u-e2*d2*d2*u-e3*d2*d3*u)) + e2*((d2*a_10)*(d1*u)+a_10*(d2*d1*u)) + -e3*((d2*a_11)*(d1*u)+a_11*(d2*d1*u)) + -e0*((d2*a_12)*(d1*u)+a_12*(d2*d1*u)) + e1*((d2*a_13)*(d1*u)+a_13*(d2*d1*u)) + e2*((d2*a_20)*(d2*u)+a_20*(d2*d2*u)) + -e3*((d2*a_21)*(d2*u)+a_21*(d2*d2*u)) + -e0*((d2*a_22)*(d2*u)+a_22*(d2*d2*u)) + e1*((d2*a_23)*(d2*u)+a_23*(d2*d2*u)) + e2*((d2*a_30)*(d3*u)+a_30*(d2*d3*u)) + -e3*((d2*a_31)*(d3*u)+a_31*(d2*d3*u)) + -e0*((d2*a_32)*(d3*u)+a_32*(d2*d3*u)) + e1*((d2*a_33)*(d3*u)+a_33*(d2*d3*u)) + e2*((d2*b_0)*u+b_0*(d2*u)) + -e3*((d2*b_1)*u+b_1*(d2*u)) + -e0*((d2*b_2)*u+b_2*(d2*u)) + e1*((d2*b_3)*u+b_3*(d2*u)) + e3*((d3*a_00)*(-e1*d1*u-e2*d2*u-e3*d3*u)+a_00*(-e1*d3*d1*u-e2*d3*d2*u-e3*d3*d3*u)) + e2*((d3*a_01)*(-e1*d1*u-e2*d2*u-e3*d3*u)+a_01*(-e1*d3*d1*u-e2*d3*d2*u-e3*d3*d3*u)) + -e1*((d3*a_02)*(-e1*d1*u-e2*d2*u-e3*d3*u)+a_02*(-e1*d3*d1*u-e2*d3*d2*u-e3*d3*d3*u)) + -e0*((d3*a_03)*(-e1*d1*u-e2*d2*u-e3*d3*u)+a_03*(-e1*d3*d1*u-e2*d3*d2*u-e3*d3*d3*u)) + e3*((d3*a_10)*(d1*u)+a_10*(d3*d1*u)) + e2*((d3*a_11)*(d1*u)+a_11*(d3*d1*u)) + -e1*((d3*a_12)*(d1*u)+a_12*(d3*d1*u)) + -e0*((d3*a_13)*(d1*u)+a_13*(d3*d1*u)) + e3*((d3*a_20)*(d2*u)+a_20*(d3*d2*u)) + e2*((d3*a_21)*(d2*u)+a_21*(d3*d2*u)) + -e1*((d3*a_22)*(d2*u)+a_22*(d3*d2*u)) + -e0*((d3*a_23)*(d2*u)+a_23*(d3*d2*u)) + e3*((d3*a_30)*(d3*u)+a_30*(d3*d3*u)) + e2*((d3*a_31)*(d3*u)+a_31*(d3*d3*u)) + -e1*((d3*a_32)*(d3*u)+a_32*(d3*d3*u)) + -e0*((d3*a_33)*(d3*u)+a_33*(d3*d3*u)) + e3*((d3*b_0)*u+b_0*(d3*u)) + e2*((d3*b_1)*u+b_1*(d3*u)) + -e1*((d3*b_2)*u+b_2*(d3*u)) + -e0*((d3*b_3)*u+b_3*(d3*u))

这就是我要表达的意见:

ns={"e0":e0,"e1":e1,"e2":e2,"e3":e3,"u":u,"d0":d0,"d1":d1,"d2":d2,"d3":d3,"a_00":A_0[0],"a_01":A_0[1],"a_02":A_0[2],"a_03":A_0[3],"a_10":A_1[0],"a_11":A_1[1],"a_12":A_1[2],"a_13":A_1[3],"a_20":A_2[0],"a_21":A_2[1],"a_22":A_2[2],"a_23":A_2[3],"a_30":A_3[0],"a_31":A_3[1],"a_32":A_3[2],"a_33":A_3[3]}
print(sympify(result,locals=ns,evaluate=False))

结果与我的结果非常不同:

e_1*(a_00*(d1*(-e1)*d1*u - e2*d1*d2*u - e3*d1*d3*u) + d1*a_00*(d1*(-e1)*u - e2*d2*u - e3*d3*u)) + e_1*(d1*b_0*u + b_0*d1*u) + e_1*(a_10*d1*d1*u + d1*a_10*d1*u) + e_1*(a_20*d1*d2*u + d1*a_20*d2*u) + e_1*(a_30*d1*d3*u + d1*a_30*d3*u) + e0*(a_00*(-e2*(d2*(-e1)*d1*u - e2*d2**2*u - e3*d2*d3*u) - e3*(d3*(-e1)*d1*u - e2*d3*d2*u - e3*d3**2*u) + (d1*(-e1)*d1*u - e2*d1*d2*u - e3*d1*d3*u)*(-e1)) + d0*a_00*(d1*(-e1)*u - e2*d2*u - e3*d3*u)) + e0*(a_10*(d1*(-e1)*d1*u - e2*d1*d2*u - e3*d1*d3*u) + d0*a_10*d1*u) + e0*(a_20*(d2*(-e1)*d1*u - e2*d2**2*u - e3*d2*d3*u) + d0*a_20*d2*u) + e0*(a_30*(d3*(-e1)*d1*u - e2*d3*d2*u - e3*d3**2*u) + d0*a_30*d3*u) + e0*(d0*b_0*u + b_0*(d1*(-e1)*u - e2*d2*u - e3*d3*u)) + e1*(a_01*(-e2*(d2*(-e1)*d1*u - e2*d2**2*u - e3*d2*d3*u) - e3*(d3*(-e1)*d1*u - e2*d3*d2*u - e3*d3**2*u) + (d1*(-e1)*d1*u - e2*d1*d2*u - e3*d1*d3*u)*(-e1)) + d0*a_01*(d1*(-e1)*u - e2*d2*u - e3*d3*u)) + e1*(a_03*(d2*(-e1)*d1*u - e2*d2**2*u - e3*d2*d3*u) + d2*a_03*(d1*(-e1)*u - e2*d2*u - e3*d3*u)) + e1*(a_11*(d1*(-e1)*d1*u - e2*d1*d2*u - e3*d1*d3*u) + d0*a_11*d1*u) + e1*(a_21*(d2*(-e1)*d1*u - e2*d2**2*u - e3*d2*d3*u) + d0*a_21*d2*u) + e1*(a_31*(d3*(-e1)*d1*u - e2*d3*d2*u - e3*d3**2*u) + d0*a_31*d3*u) + e1*(d0*b_1*u + b_1*(d1*(-e1)*u - e2*d2*u - e3*d3*u)) + e1*(d2*b_3*u + b_3*d2*u) + e1*(a_13*d2*d1*u + d2*a_13*d1*u) + e1*(a_23*d2*d2*u + d2*a_23*d2*u) + e1*(a_33*d2*d3*u + d2*a_33*d3*u) + e2*(a_00*(d2*(-e1)*d1*u - e2*d2**2*u - e3*d2*d3*u) + d2*a_00*(d1*(-e1)*u - e2*d2*u - e3*d3*u)) + e2*(a_01*(d3*(-e1)*d1*u - e2*d3*d2*u - e3*d3**2*u) + d3*a_01*(d1*(-e1)*u - e2*d2*u - e3*d3*u)) + e2*(a_02*(-e2*(d2*(-e1)*d1*u - e2*d2**2*u - e3*d2*d3*u) - e3*(d3*(-e1)*d1*u - e2*d3*d2*u - e3*d3**2*u) + (d1*(-e1)*d1*u - e2*d1*d2*u - e3*d1*d3*u)*(-e1)) + d0*a_02*(d1*(-e1)*u - e2*d2*u - e3*d3*u)) + e2*(a_12*(d1*(-e1)*d1*u - e2*d1*d2*u - e3*d1*d3*u) + d0*a_12*d1*u) + e2*(a_22*(d2*(-e1)*d1*u - e2*d2**2*u - e3*d2*d3*u) + d0*a_22*d2*u) + e2*(a_32*(d3*(-e1)*d1*u - e2*d3*d2*u - e3*d3**2*u) + d0*a_32*d3*u) + e2*(d0*b_2*u + b_2*(d1*(-e1)*u - e2*d2*u - e3*d3*u)) + e2*(d2*b_0*u + b_0*d2*u) + e2*(d3*b_1*u + b_1*d3*u) + e2*(a_10*d2*d1*u + d2*a_10*d1*u) + e2*(a_11*d3*d1*u + d3*a_11*d1*u) + e2*(a_20*d2*d2*u + d2*a_20*d2*u) + e2*(a_21*d3*d2*u + d3*a_21*d2*u) + e2*(a_30*d2*d3*u + d2*a_30*d3*u) + e2*(a_31*d3*d3*u + d3*a_31*d3*u) + e3*(a_00*(d3*(-e1)*d1*u - e2*d3*d2*u - e3*d3**2*u) + d3*a_00*(d1*(-e1)*u - e2*d2*u - e3*d3*u)) + e3*(a_02*(d1*(-e1)*d1*u - e2*d1*d2*u - e3*d1*d3*u) + d1*a_02*(d1*(-e1)*u - e2*d2*u - e3*d3*u)) + e3*(a_03*(-e2*(d2*(-e1)*d1*u - e2*d2**2*u - e3*d2*d3*u) - e3*(d3*(-e1)*d1*u - e2*d3*d2*u - e3*d3**2*u) + (d1*(-e1)*d1*u - e2*d1*d2*u - e3*d1*d3*u)*(-e1)) + d0*a_03*(d1*(-e1)*u - e2*d2*u - e3*d3*u)) + e3*(a_13*(d1*(-e1)*d1*u - e2*d1*d2*u - e3*d1*d3*u) + d0*a_13*d1*u) + e3*(a_23*(d2*(-e1)*d1*u - e2*d2**2*u - e3*d2*d3*u) + d0*a_23*d2*u) + e3*(a_33*(d3*(-e1)*d1*u - e2*d3*d2*u - e3*d3**2*u) + d0*a_33*d3*u) + e3*(d0*b_3*u + b_3*(d1*(-e1)*u - e2*d2*u - e3*d3*u)) + e3*(d1*b_2*u + b_2*d1*u) + e3*(d3*b_0*u + b_0*d3*u) + e3*(a_10*d3*d1*u + d3*a_10*d1*u) + e3*(a_12*d1*d1*u + d1*a_12*d1*u) + e3*(a_20*d3*d2*u + d3*a_20*d2*u) + e3*(a_22*d1*d2*u + d1*a_22*d2*u) + e3*(a_30*d3*d3*u + d3*a_30*d3*u) + e3*(a_32*d1*d3*u + d1*a_32*d3*u) + (a_01*(d1*(-e1)*d1*u - e2*d1*d2*u - e3*d1*d3*u) + d1*a_01*(d1*(-e1)*u - e2*d2*u - e3*d3*u))*(-e0) + (a_01*(d2*(-e1)*d1*u - e2*d2**2*u - e3*d2*d3*u) + d2*a_01*(d1*(-e1)*u - e2*d2*u - e3*d3*u))*(-e3) + (a_02*(d2*(-e1)*d1*u - e2*d2**2*u - e3*d2*d3*u) + d2*a_02*(d1*(-e1)*u - e2*d2*u - e3*d3*u))*(-e0) + (a_02*(d3*(-e1)*d1*u - e2*d3*d2*u - e3*d3**2*u) + d3*a_02*(d1*(-e1)*u - e2*d2*u - e3*d3*u))*(-e1) + (a_03*(d1*(-e1)*d1*u - e2*d1*d2*u - e3*d1*d3*u) + d1*a_03*(d1*(-e1)*u - e2*d2*u - e3*d3*u))*(-e2) + (a_03*(d3*(-e1)*d1*u - e2*d3*d2*u - e3*d3**2*u) + d3*a_03*(d1*(-e1)*u - e2*d2*u - e3*d3*u))*(-e0) + (d1*b_1*u + b_1*d1*u)*(-e0) + (d1*b_3*u + b_3*d1*u)*(-e2) + (d2*b_1*u + b_1*d2*u)*(-e3) + (d2*b_2*u + b_2*d2*u)*(-e0) + (d3*b_2*u + b_2*d3*u)*(-e1) + (d3*b_3*u + b_3*d3*u)*(-e0) + (a_11*d1*d1*u + d1*a_11*d1*u)*(-e0) + (a_11*d2*d1*u + d2*a_11*d1*u)*(-e3) + (a_12*d2*d1*u + d2*a_12*d1*u)*(-e0) + (a_12*d3*d1*u + d3*a_12*d1*u)*(-e1) + (a_13*d1*d1*u + d1*a_13*d1*u)*(-e2) + (a_13*d3*d1*u + d3*a_13*d1*u)*(-e0) + (a_21*d1*d2*u + d1*a_21*d2*u)*(-e0) + (a_21*d2*d2*u + d2*a_21*d2*u)*(-e3) + (a_22*d2*d2*u + d2*a_22*d2*u)*(-e0) + (a_22*d3*d2*u + d3*a_22*d2*u)*(-e1) + (a_23*d1*d2*u + d1*a_23*d2*u)*(-e2) + (a_23*d3*d2*u + d3*a_23*d2*u)*(-e0) + (a_31*d1*d3*u + d1*a_31*d3*u)*(-e0) + (a_31*d2*d3*u + d2*a_31*d3*u)*(-e3) + (a_32*d2*d3*u + d2*a_32*d3*u)*(-e0) + (a_32*d3*d3*u + d3*a_32*d3*u)*(-e1) + (a_33*d1*d3*u + d1*a_33*d3*u)*(-e2) + (a_33*d3*d3*u + d3*a_33*d3*u)*(-e0)

1 个答案:

答案 0 :(得分:0)

您在B中未包含ns,因此b符号是通过自动同意作为交换符号创建的(顺便说一下,您也从未定义e_1)。

我建议您更好地使用流程来避免这样的问题:

  • 在数字后缀之前与_与否_保持一致。到处都使用a_0或a0。

  • 将变量命名为与符号名称相同。

  • 如果您在执行时有字符串,请不要使用sympify。相反,只需定义符号名称并将字符串作为表达式(expr = e0*((d0*a_00)*(-e1...)执行。这样,如果您有未定义的符号名称,Python将自动警告您。

  • 如果您必须解析字符串,则可以使用parse_expr来避免自动符号定义:

    from sympy.parsing.sympy_parser import parse_expr, standard_transformations, auto_symbol
    
    transformations = list(standard_transformations)
    transformations.remove(auto_symbol)
    
    parse_expr('a*b', local_dict={'a': Symbol('a', commutative=False)}, transformations=transformations)
    

    注意这是如何给出关于b未被定义的错误,而不仅仅是将其定义为可交换符号。