我正在使用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 + b
和1 / 2
)中简化非零因子;理想情况下,如果我确定a - b
,我也希望能够简化a != b
。
我有什么方法可以实现这个目标吗?
答案 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的某个未来版本中调用简化就足够了。