Использование 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