2010-09-18 4 views
4

Я пытаюсь создать способ представления математических уравнений в качестве объектов Java. Это то, что я придумал до сих пор:Представляем математические уравнения как объекты Java

  • Срок
  • -Включает поля, такие как коэффициент (который может быть отрицательным), показатель и переменной (х, у, г, и т.д.). Некоторые поля могут даже квалифицироваться как их собственные термины alltogether, вводя рекурсию.
  • -Объекты, расширяющие срок будет включать в себя такие вещи, как TrigTerm представлять тригонометрические функции.

  • Уравнение

  • -Этот представляет собой набор Term сек
  • -The ToString() метод уравнения будет вызывать метод ToString() всех его Срок сек и объединить результаты.

Общая идея заключается в том, что я мог бы программно манипулировать уравнениями (например, дирижативным методом, который возвращал бы уравнение, являющееся производной уравнения, для которого он был вызван, или метод оценки, который оценить уравнение для определенной переменной, равную некоторому значению).


То, что я прекрасно работает для простых уравнений:
x^2 + 3
Это только два Срок s: один с переменной «х» и показателем степени «2», а другой, который только постоянная "3."


Но не так много для более сложных уравнений:
alt text
Да, это ужасный пример, но я просто сделать точку.


Так что теперь на вопрос: что было бы лучшим способом представить математические уравнения как объекты Java? Существуют ли библиотеки, которые уже делают это?

+7

Постройте дерево выражений. – NullUserException

+1

Google для контента MathML для одного подхода к вашей проблеме. –

+1

ознакомьтесь с главой 5 «Основы информатики» (http://infolab.stanford.edu/~ullman/focs.html) Ахо и Ульмана для объяснения построения деревьев простого выражения –

ответ

13

, что было бы лучшим способом представляют собой математические уравнения в виде Java объектов?

Я хочу, чтобы вы заметили, что у вас нет никаких уравнений.Уравнения выглядят так:

х = 3

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

Вы должны написать класс Expression. Выражение имеет три подкласса: Константа (например, 3), Переменная (например, x) и Операция.

Операция имеет тип (например, «возведение в степень» или «отрицание») и список выражений для работы. Это ключевая идея: операция, в которой есть выражение, также имеет некоторое количество выражений.

Таким образом, ваш представляет собой СУММ (EXP (X, 2), Константа 3.

Эта концепция может быть бесконечно разработана, чтобы представлять любое выражение, которое вы можете писать на бумаге.

Жесткая часть оценивает строку, которая представляет ваше выражение и создает объект Expression - как кто-то предложил, прочитал несколько статей о разборе. Это самая сложная часть, но все еще довольно легко.

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

1

Проконсультируйтесь с хорошей компиляционной книгой, чтобы узнать, как написать часть компилятора, которая преобразует входные данные в дерево выражений.

Вы можете найти эту серию вдохновляющую: http://compilers.iecc.com/crenshaw/

Если вы «просто» хотите, чтобы оценить входную строку, то есть посмотреть на сниппет компиляторе в библиотеке Javassist.

0

Здесь я описал представление проанализированных математических выражений как Abstract Syntax Trees в проекте Symja.

D[f,x] функция в файле D.java реализует производную функции, прочитав начальные Derivative[] правила из файла System.mep.