自动简化冗余算术关系

2024-10-04 11:34:45 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在寻找一种自动确定(a < 12) & (a < 3) & (c >= 4)(a < 3) & (c >= 4)相同的方法。我研究了Matlab的符号工具箱和Python中的symphy,但它们显然只能简化纯布尔逻辑(例如simplify(a & b | b & a) -> ans=(a & b)

有没有一种方法可以像上面描述的那样使用这些符号数学工具

编辑

正如对@user12750353答案的评论中所指出的,我还想简化用布尔或(例如,((a < 12) & (a < 3) & (c >= 4)) | (a < 1))连接的关系系统


Tags: 工具方法答案编辑关系评论符号工具箱
2条回答

SymPy集可用于进行单变量简化,例如((x < 3) & (x < 5)).as_set() -> Interval.open(-oo, 3),集可转换回关系。下面将复杂表达式转换为cnf形式,根据自由符号分隔参数,并简化单变量的参数,同时保持多变量参数不变

def f(eq):
    from collections import defaultdict
    from sympy import to_cnf, ordered
    cnf = to_cnf(eq)
    args = defaultdict(list)
    for a in cnf.args:
        args[tuple(ordered(a.free_symbols))].append(a)
    _args = []
    for k in args:
        if len(k) == 1:
            _args.append(cnf.func(*args[k]).as_set().as_relational(k[0]))
        else:
            _args.append(cnf.func(*args[k]))
    return cnf.func(*_args)

例如:

>>> from sympy.abc import a, c
>>> f((a < 1) | ((c >= 4) & (a < 3) & (a < 12)))
(a < 3) & ((c >= 4) | (a < 1))

您可以在sympy inequality solvers中查看一些选项

我可以用reduce_inequalities来解决你的问题

from sympy.abc import a, c
import sympy.solvers.inequalities as neq
t = neq.reduce_inequalities([a < 12, a < 3, c >= 4])

结果呢 (4 <= c) & (-oo < a) & (a < 3) & (c < oo)

它还适用于一些更复杂的示例 enter image description here

只要每个不等式有一个变量

相关问题 更多 >