2010-11-13 6 views
5

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

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

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

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

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

+0

Это не должно быть закрыты, так как он хочет решить уравнение и не ищет что-то вроде javascripts eval(). – stacker

+2

Если вы не ограничиваете себя очень немногими формами уравнения (скажем, линейными вплоть до квартики), то это будет крупный проект. http://en.wikipedia.org/wiki/Comparison_of_computer_algebra_systems имеет несколько Java. –

ответ

3

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

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

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

Edit: Нашел: http://tech.dolhub.com/Code/MathEval

линейно-рекурсивная математика Evaluator

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

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

+2

За исключением того, что мой оценщик не будет * решать * уравнения, подобные примеру в вопросе, где переменная неизвестна. Он может принимать только различные значения x, используя пробную версию и ошибку, и оценивать '(25 + 36 + x) * 2', пока не будет указан ответ. 0. –

+1

Вам нужно было бы манипулировать уравнением, чтобы получить x самостоятельно на одной стороне (25 + 36 + x) * 2 = 25' => 'x = 25/2- (25 + 36)', если я правильно помню свою математику, оценивает (правильно) до -48.5, а не - 11. –

+0

Ну, да. Wolfram alpha использует какой-то фантастический AI для исправления недопустимого ввода, а '(25 + 36 + x) * 2 = 25' становится' Solve [(25 + 36 + x) * 2 == 25, x] ', поэтому я предположил, что ему нужно написать «линейный системный решатель» или сделать это вручную. – Margus

0

Я выпустил оценки выражений на основе Dijkstra's Shunting Yard алгоритма, в соответствии с условиями Apache License 2.0:

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

+0

выглядит красиво :), я могу добавить его в свой проект. хотя для калькулятора bootspeed java довольно медленный. может быть, мне нужно его пересмотреть и начать в C++. – Berty