Python同情 - 从等式中简化非零因子

时间:2015-09-22 20:46:28

标签: python sympy reduce simplify

我正在使用python3的sympy库,我正在处理方程式,如下所示:

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

my_equations完全按照我的定义打印((2 * a + b) * (a - b) / 2 == 0,即使用simplify或类似功能,我无法减少它。

我想要实现的是从等式(2 * a + b1 / 2)中简化非零因子;理想情况下,如果我确定a - b,我也希望能够简化a != b

我有什么方法可以实现这个目标吗?

1 个答案:

答案 0 :(得分:1)

关键是 simplify()不能(还)有关假设的复杂推理。我在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的某个未来版本中调用简化就足够了。