Использование SymPy для общего анализа и решения уравнений

Я хочу иметь возможность анализировать строковые уравнения (которые равны 0), а затем решать их с помощью словаря переменных, к которым у меня есть доступ.

например:

s = '(x/z)-y'
eq = parse(s)
eq.solve({'x': 10, 'y': 5})
print(eq)
>>> {'z': 2}
Я написал код, который сделал что-то подобное месяц назад, но я просто не могу найти его. Однако я помню, что я использовал SymPy и его функцию sympify, а также его функцию решения. Я проверил документацию по этим функциям, но я не смог обернуть голову как заставить их работать, как я хочу.

и дополнительный вопрос: Можно ли как-то обернуть переменные, чтобы я мог использовать для них нечто большее, чем просто письмо? Пример: вместо " x "я мог бы иметь" {myvar-42}"

EDIT:

хорошо, мне наконец удалось написать код, который сделал то, что я хотел:

eq = sympify('(x/y)-z', locals={'x': 10, 'z': 5})
solution = solve(eq, dict=True)
print(solution)
>>> [{'z': 2}]

но мой "дополнительный" вопрос остается.

1 ответов


как вы обнаружили, sympify преобразует строки в сочувствующие выражения.

чтобы ответить на ваш другой вопрос, имена символов могут быть любыми, но sympify будет анализировать только допустимые идентификаторы Python для имен символов. Но вы можете сделать

>>> Symbol('{myvar-42}') + 1
{myvar-42} + 1

и обратите внимание, что действует на Python idenfifiers не должны быть отдельные буквы. Они могут быть любой комбинацией букв, цифр и подчеркиваний, которая не начинается с числа, например x_2 или abc123.

если вы нужно все еще делать синтаксический анализ строк, но хотите недействительные идентификаторы Python в качестве имен символов, вероятно, самым чистым способом было бы использовать обычные имена и заменять их другими, например

>>> expr = sympify('x + 1')
>>> expr.subs(Symbol('x'), Symbol('{myvar-42}')
{myvar-42} + 1

наконец, чтобы заменить символы буквами, вы можете использовать locals аргумент к sympify, как вы сделали, или, если вы хотите заменить их позже, использовать подводные лодки:

>>> x, y, z = symbols('x y z')
>>> expr = sympify('x/z - y')
>>> expr.subs({x: 10, y: 5})
10/z - 5