我目前正在为另一个软件项目编写一个简化工具,我想简化一些数学。
我给出了一组方程和不等式,
x = a
y + 1 = b
x = y
z = c
y > z
我想得到一组简化的方程和不等式,其中最好有更少的S={x,y,z}
的变量,并且在方程的一边以某种方式归一化为0
0 = b - (a + 1)
0 > c - b + 1
因此,S
中的变量充当中间存储,或变量{a,b,c}
之间的连接。
- 所有变量和常量都可以被认为是整数
- 如果不存在这种简化,
- 结果不需要是最佳的
- 如果这也适用于非线性方程,这将是一个加号,但不是必须的
- 我可以使用其他python库而不是sympy
- 我想有一个通用的方法,给出的约束条件只是一个例子,我事先并不知道方程的结构
我试着去理解sympy.solve,sympy.simplify和sympy.reduce_inequalities。
- 我没有设法让simplify处理一组约束,而不是一个表达式。
- solve似乎只能处理等式,而不能处理不等式。我也不认为我想解决这些方程,而是删除变量。
- reduce_inequalities似乎仅限于一个变量。我不知道如何一次只对一个变量执行这个函数。它还考虑了方程。
我不需要完整的源代码,但一个粗略的方法如何解决这个问题,或者如果它是在所有可行的sympy。
非常感谢
1条答案
按热度按时间cxfofazt1#
一种可能的方法是使用Groebner基。我将引入一个新的符号
t
和一个新的方程t = y - z
,这样不等式就变成了t > 0
(我们将单独记住)。然后,系统被转换为仅方程:现在你可以计算Groebner基了(注意符号的顺序很重要):
最后两个不涉及x,y,z的方程就是你想要的。具有
t
的方程可以求解t
以恢复不等式:更一般地说,这里的方法是:
对于更复杂的多项式输入,计算Groebner基可能非常昂贵,因此这种方法是否实用取决于您开始时的条件的复杂性。如果所有条件都是线性的,就像例子中那样,那么它会很快。