2013-06-05 18 views
1

this answer中解釋瞭如何避免args在SymPy類中排序,如Mul,Add等。Sympy,是否有可能迫使一個類停留在表達式的左側或右側

對於新創建的類like this one explained here當由sympy.core.numbers.Floatsympy.core.numbers.Pisympy.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是不會變型更多到左邊還是右邊?

+1

這個問題本身就沒有問題,但如果您使用它來創建差分運算符對象,則可能是以錯誤的方式進行的。首先,對差分運算符使用乘法是符號不一致的濫用。此外,這種方法不能清楚地表示嵌套的微分​​算子或常量和微分算子的和等。另外,微分算子已經在'diffgeom'模塊中實現。 – Krastanov

+0

感謝您的評論!我已經經歷了很多使用這個差分運算器的問題,但它工作到目前爲止。你知道如何強制給定的課程留在SymPy的左側/右側嗎? –

+1

我不知道有足夠的細節來寫這個答案,但你可以嘗試使用'commutative = False'。我真的不喜歡這種方法,並希望在未來版本的sympy中將這個刪除(沒有這樣的計劃),但是如果你知道你在做什麼繼續嘗試。 – Krastanov

回答

1

Mul的乘法並不按照您期望的方式工作。

首先,打印順序與任何內容無關。如果這就是你所關心的,你可以通過修改打印機來改變它。

您應該改爲查看對象的.args。但即使在這裏,這並不重要。當乘以某個乘數時,它不會按照它看到的順序「應用」每個乘法。相反,它創建了一個新的Mul對象,並且所有參數組合在一起(可以肯定的是,在commutative=False的情況下,參數保持有序)。 Mul不會在這些對象上調用任何特殊的子方法。這是我們想要的功能(請參閱https://code.google.com/p/sympy/issues/detail?q=1941&id=1941https://github.com/sympy/sympy/wiki/Canonicalization),但目前尚未完成。

相關問題