1

这个答案中,解释了如何避免args在 SymPy 类中进行排序,例如MulAdd等等。

对于像这里解释的这样一个新创建的类,它可以在乘以 a 时转到右侧sympy.core.numbers.Floatsympy.core.numbers.Pi或者sympy.core.numbers.Integer,例如,给出:

print D(x) * 1.
1.0*D(x)

原始表达式0.在评估时给出,而新表达式给出D(x).

为了让这个微分算子正常工作,它必须留在左边:

print D(x) * 1.
D(x)*1.0

是否有任何隐藏参数(例如_op_priority更改__mul__()优先级)告诉 SymPy 更靠左或靠右的类型?

4

1 回答 1

1

Mul 的乘法并不像您期望的那样工作。

首先,打印顺序与任何事情无关。如果这就是您所关心的,您可以通过修改打印机来更改它。

您应该查看对象的.args. 但即使在这里,这也无所谓。当您将某物乘以一个乘法时,它不会按照看到的顺序“应用”每个乘法。相反,它创建了一个Mul包含所有 args 组合的新对象(可以肯定的是,在这种commutative=False情况下,args 保持有序)。Mul 不会对这些对象调用任何特殊的子方法。这是我们想要的功能(参见https://code.google.com/p/sympy/issues/detail?q=1941&id=1941https://github.com/sympy/sympy/wiki/Canonicalization),但是目前,还没有完成。

于 2013-06-05T21:46:47.587 回答