0

假设我知道 x 大于 y 并且 x 和 y 都大于 0。

有人可以帮我写一个函数,它需要两个线性公式(仅+/-)并返回哪个更大?

例如:

foo("x+y","2*x") #should return 2
foo("2*x","x+y") #should return 1
foo("x","2*y") #should return 0 (can't decide)

多谢!

4

1 回答 1

0

在 SymPy 中做到这一点的最好方法是使用假设系统。

首先,不要尝试进行标记化。如果您必须输入为字符串,只需使用sympify,如果您不需要,只需使用符号创建表达式,例如

x, y = symbols('x y')
a = x - y
b = 2*x

请阅读SymPy 教程以获取更多信息。

假设系统尚不直接支持不等式,因此要表示x > y,您需要声明它x - y是积极的。要问是否2*x > x - y, 即如果2*x - (x - y)是肯定的, 假设x, y, 和x - y是肯定的, 做

In [27]: ask(Q.positive((2*x) - (x - y)), Q.positive(x) & Q.positive(y) & Q.positive(x - y))
Out[27]: True

第一个参数ask是你要问的,第二个参数是你假设的。&是合乎逻辑的,因此Q.positive(x) & Q.positive(y) & Q.positive(x - y)意味着假设所有这三件事。

如果它知道它是假的,它将返回 False,如果它无法确定,它将返回 None。请注意,SymPy 工作在一个复杂的领域,所以不积极并不一定意味着消极。因此,如果您得到 None,您可能也应该在否定表达式上调用 ask,或者使用negative而不是再次调用它positive。如果要包含 0(即,使用>=代替>,使用非负代替正,使用非正代替负。

它还没有达到应有的智能,所以当你知道答案时,你会得到很多无。特别是,我认为它x > y在这一点上不会真正很好地利用这个事实。

于 2014-02-24T03:05:34.107 回答