2011-11-10 86 views
2

在我的項目中,我必須使用evaluate=false當我創建任何AddMul對象。在這種情況下,我在對這些對象應用等式檢查時遇到了一個問題。這個問題是因爲參數的順序。Python- Sympy問題與評估= False時表達式相等檢查

請考慮下面的例子:

k2=Mul(*[x,y,2],evaluate=False) 
k1=Mul(*[x,2,y],evaluate=False) 
print k1==k2 

結果是false作爲k2.args(x,y,2)k1.args(x,2,y)。 因此,雖然比較檢查元組相等性,但它返回false。 有什麼辦法可以得到想要的結果嗎?

此外,如果我把一些操作上的元組(如反轉順序,然後檢查),它在所述的情況下發生故障時​​和k2由不同的形成Mul對象(如當k1.args = 2*x,yk2.args = 2*y,x

我不能在這裏使用排序,因爲在這種情況下,Add([x+y,z],evaluate=False)Add([x+z,y],evaluate=False)將是兩個不同的表達式。另外,如果我使用evalaute=True,在這種情況下,Add([x+y],x])Add([2*x+y])將是相同的,我不想要。

回答

0

找到了解決辦法。

在添加/穆爾班的表達形成

使用下面的代碼

flatten_args = [] 
      for arg in args: 
       if (arg.__class__==cls): 
        flatten_args.extend(arg.args) 
       else: 
        flatten_args.append(arg) 

      obj = Expr.__new__(cls, *flatten_args) 

,並在平等檢查的時間拉平所有參數,我把一個額外的檢查 排序的args列表第一arg_list.sort()和比比較兩個列表

1

Mul不知道x和y都代表標量。矩陣乘法取決於參數的順序,所以在你的例子中k1和k2不一定相等。 如果您知道在您的程序中x和y將始終是標量(或其他類型的值,其中乘法是可交換和關聯的),可能有一種方法可以從每個項中分解常量,比較常量並比較排序條款清單。

+0

我發佈了這個問題,以便有人可以建議我這種方式進行比較。是的,我的乘法總是可交換的。請參閱我的問題 – gsagrawal

0

以下內容對您有幫助嗎?

print simplify(k1 - k2) == 0 # True 
print k1 == k2 # Still False 
+0

中的編輯部分。因爲在這種情況下,「x + 2y」和「x + y + y」是相同的。我不希望sympy執行任何操作。儘管我找到了一個解決方法。我首先將所有參數展平,而不是對其進行排序並進行比較。 – gsagrawal