Упростить простое неравенство с 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 Факт очень хорошо в этой точке.

Другие вопросы по тегам