Математическое выражение (строка) для нумерации в Java

Я пытаюсь найти нечто вроде плагина для встраивания Java (JEP), который может вычислять математическую формулу ( строка) и вернуть ответ.

Но он также должен вычислять переменную, например: (25+36+x)*2 = 25 должно дать: x = -11

Немного похоже на http://www.wolframalpha.com/, но не должно быть таким универсальным, и он должен работать в автономном режиме.

Предпочтение отдается открытым исходным кодам.

Он нужен мне для моего небольшого проекта калькулятора, http://sourceforge.net/projects/calex/.


person Berty    schedule 13.11.2010    source источник
comment
Это не должно быть закрыто, так как он хочет решить уравнение и не ищет что-то вроде javascripts eval().   -  person stacker    schedule 13.11.2010
comment
Если вы не ограничиваете себя очень немногими формами уравнения (скажем, от линейного до четвертого), то это будет крупный проект. en.wikipedia.org/wiki/Comparison_of_computer_алгебра_систем содержит несколько систем Java.   -  person Pete Kirkham    schedule 13.11.2010


Ответы (2)


Это называется Arithmetic evaluation. Один из самых простых способов реализовать это — использовать Shunting-yard_algorithm Эдсгера Дейкстры.

Алгоритм маневровой станции — это метод разбора математических уравнений, заданных в инфиксной записи. Его можно использовать для создания вывода в обратной польской нотации (RPN) или в виде абстрактного синтаксического дерева (AST). Алгоритм был изобретен Эдсгером Дейкстрой и назван алгоритмом маневровой станции, потому что его работа напоминает работу маневровой станции на железной дороге. Как и оценка RPN, алгоритм маневровой станции основан на стеке. Инфиксные выражения — это форма математической записи, к которой привыкло большинство людей, например, 3+4 или 3+4*(2−1). Для преобразования есть две текстовые переменные (строки), вход и выход. Существует также стек, содержащий операторы, еще не добавленные в очередь вывода. Для преобразования программа считывает каждый символ по порядку и делает что-то на основе этого символа.

Но я видел точное решение, которое вы ищете, в каком-то пользовательском блоге stackoverflow, но я не могу вспомнить адрес (это было похоже на «обезьяний код»). Это был легковесный класс, который можно было использовать в апплетах (также можно было определять константы и сбрасывать значения).

Изменить: Найдено: http://tech.dolhub.com/Code/MathEval

Линейно-рекурсивный математический оценщик

Этот оценщик математических выражений родился из-за необходимости иметь компактное и эффективное решение, которое могло бы достаточно эффективно оценивать произвольные выражения, не требуя предварительной компиляции. Мне нужно было что-то, что могло бы выполнять базовые математические операции с переменными, такими выражениями, как: Top+2, Bottom-2 и (Right+1-Left)/2.

Исследования в Интернете выявили ряд довольно хороших решений, все из которых вращались вокруг создания деревьев синтаксического анализа (что имеет смысл). Проблема заключалась в том, что все они были довольно громоздкими, и я не мог позволить себе добавить 100 КБ к размеру моего апплета только для математики. Поэтому я начал задумываться о линейно-рекурсивном решении проблемы. Конечным результатом является приемлемый по производительности единый класс без внешних зависимостей, весящий менее 10 КиБ.

person Margus    schedule 13.11.2010
comment
За исключением того, что мой оценщик не будет решать уравнения, подобные примеру в вопросе, где переменная является неизвестной. Он может только принимать различные значения x методом проб и ошибок и вычислять (25+36+x)*2 до тех пор, пока не будет получен ответ 25. - person Lawrence Dol; 13.11.2010
comment
Вам придется манипулировать уравнением, чтобы получить x сам по себе с одной стороны от равенства: я думаю, что (25+36+x)*2=25 => x=25/2-(25+36), если я правильно помню свою математику, оценивается (правильно) как -48,5, а не -11. - person Lawrence Dol; 13.11.2010
comment
Ну да. Wolfram alpha использует какой-то причудливый ИИ для исправления неверного ввода, и (25 + 36 + x)*2 = 25 становится Solve[(25 + 36 + x)*2 == 25, x], поэтому я предположил, что ему нужно написать «решатель линейных систем» или сделать это вручную. - person Margus; 14.11.2010
comment
вау, спасибо за быстрый ответ, я проверю и дам вам знать, какую алгебра_систему я использовал :) - person Berty; 15.11.2010

Я выпустил оценщик выражений на основе алгоритма маневровой станции Дейкстры в соответствии с условиями Лицензия Apache 2.0:

http://projects.congrace.de/exp4j/index.html

person fasseg    schedule 23.07.2011
comment
выглядит красиво :), я мог бы добавить его в свой проект. хотя для калькулятора скорость загрузки java довольно медленная. возможно, мне нужно пересмотреть его и начать заново на С++. - person Berty; 24.07.2011