Упростить простое неравенство с Sympy
Допустим, я знаю, что 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)
большое спасибо!
1 ответ
Лучший способ сделать это в 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 работает в сложной области, поэтому не положительный не обязательно означает отрицательный. Следовательно, вы, вероятно, должны также вызвать ask для отрицательного выражения, если вы получили None, или вызвать его снова с помощью negative
вместо positive
, Если вы хотите включить 0 (т.е. используйте >=
вместо >
, используйте неотрицательный вместо положительного и не положительный вместо отрицательного.
Это не так умно, как могло бы быть, поэтому вы получите много Nones сейчас, когда ответ станет известен. В частности, я не думаю, что он действительно будет использовать x > y
Факт очень хорошо в этой точке.