2015-09-22 32 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