2015-09-22 36 views
0

我使用python3的sympy庫簡化非零因素,我處理方程,如以下各項之一:的Python sympy - 從方程式

a, b = symbols('a b', positive = True) 
my_equation = Eq((2 * a + b) * (a - b)/2, 0) 

my_equations獲取打印正是我已經定義它(即,),即使使用simplify或類似函數,我也無法減少它。

我試圖實現的是簡化等式中的非零因子(2 * a + b1/2);理想情況下,我希望能夠簡化a - b以及,如果我確定a != b

有什麼辦法可以達到這個目標嗎?

回答

1

關鍵是簡化()是不是能夠(尚)複雜的推理假設。我使用Wolfram Mathematica的簡化測試了它,並且它可以工作。它看起來像是SymPy中的一個缺失功能​​。

無論如何,我建議一個功能來做你正在尋找的東西。

定義這個功能:

def simplify_eq_with_assumptions(eq): 
    assert eq.rhs == 0 # assert that right-hand side is zero 
    assert type(eq.lhs) == Mul # assert that left-hand side is a multipl. 
    newargs = [] # define a list of new multiplication factors. 
    for arg in eq.lhs.args: 
     if arg.is_positive: 
      continue # arg is positive, let's skip it. 
     newargs.append(arg) 
    # rebuild the equality with the new arguments: 
    return Eq(eq.lhs.func(*newargs), 0) 

現在,您可以撥打:

In [5]: simplify_eq_with_assumptions(my_equation) 
Out[5]: a - b = 0 

您可以輕鬆地適應這個功能您的需求。希望在未來的SymPy版本中,只需致電簡化即可。

+0

我認爲這個功能目前不存在,因爲它會在大多數情況下使simpl()太慢。當代碼處理假設在C++中被重寫時,它可能會被添加。 –

+0

謝謝,我終於做了這樣的事情。 – Delfad0r