Решите уравнение (строку) с Python для каждого символа - PullRequest
0 голосов
/ 26 апреля 2018

Я должен решить уравнение в Python, которое я получаю в виде ввода строки. Я не знаю, сколько символов в уравнении или какова их подпись. Типичным символом может быть «мм», «см», «х» или что-то вроде этого. Функция должна возвращать некий массив / json с решенным уравнением.

Маленький пример того, как это должно выглядеть:

solve("x/2=4")
>> ["x=8"]
>>
solve("x + 2 = y - 1")
>> ["x=y-3", "y=x+3"]

Я пытался использовать SymPy-Module для этого, но я не нашел способа ввести динамическую строку, как описано выше. Кажется, что SymPy принимает только «жестко закодированные» символы.

Примечание. Строка происходит из параметра "sys.argv".

Ответы [ 2 ]

0 голосов
/ 26 апреля 2018

SymPy может анализировать строки с sympify, но его формат для уравнений - Eq(x/2, 4) вместо x/2 = 4. Поэтому необходима небольшая предварительная обработка: окружите строку Eq( ) и замените "=" запятой.

eq = "x/2=4"
sympy_eq = sympify("Eq(" + eq.replace("=", ",") + ")")
solve(sympy_eq)   # [8]

и

eq = "x + 2 = y - 1"
sympy_eq = sympify("Eq(" + eq.replace("=", ",") + ")")
solve(sympy_eq)   # [{x: y - 3}]

В последнем случае SymPy выбрал одну из переменных для решения. Чтобы выбрать, какой это должен быть, вы можете предоставить символ:

solve(sympy_eq, Symbol('y'))   # [x + 3]

Или, чтобы решить для каждого символа:

[solve(sympy_eq, sym, dict=True) for sym in sympy_eq.free_symbols] 

возвращает [[{y: x + 3}], [{x: y - 3}]]. Список является вложенным, поскольку для каждого символа может появиться несколько решений. При необходимости выровняйте вложенный список.

Опции list=True и dict=True из solve удобны для принудительного применения определенных форм вывода.

0 голосов
/ 26 апреля 2018

Ответ, скорее всего, две разные части.

Синтаксический:

Синтаксический анализ означает превращение некоторого ввода в пригодный для использования вывод, где в вашем случае ввод представляет собой некоторую строку, а вывод - что-то, с чем может работать sympy. Например, простой шаг разбора - преобразование строк в целые числа с помощью команды int(your_string) В вашем случае вы должны перебирать вашу строку и находить переменные, единицы измерения и т. Д., Например, сравнивая со словарем или списком строк. Разбор произвольного ввода довольно сложен, поэтому лучше всего начинать с небольшого набора параметров, например искать в строке вхождения типичных имен переменных, таких как x, y и z, сравнивая их со списком variables=['x','y','z'].

Вычислительный

Когда синтаксический анализ будет чистым, просто подключите все к своим решающим / решающим задачам, используемым sympy.

Чтобы увидеть, как такая система может работать, если все сделано правильно, вы можете взглянуть на вольфрам альфа. Они выполняют неплохую обработку синтаксического анализа / естественного языка и пытаются угадать, что делать дальше.

...