2010-09-18 2 views
4

J'essaie de concevoir un moyen de représenter des équations mathématiques en tant qu'objets Java. Voilà ce que je suis venu avec jusqu'à présent:Représentation d'équations mathématiques en tant qu'objets Java

  • terme
  • champs -Comprend tels que le coefficient (qui pourrait être négatif), exposant et variable (x, y, z, etc.). Certains champs peuvent même être considérés comme leurs propres termes, introduisant la récursivité.
  • -Objets qui étendent terme comprendrait des choses telles que TrigTerm pour représenter les fonctions trigonométriques.

  • équation

  • -Ceci est une collection de terme de
  • -La méthode toString() de l'équation appellerait la méthode toString() de l'ensemble de ses s Term et concaténer les résultats.

L'idée générale est que je serais en mesure de manipuler par programme les équations (par exemple, une méthode dirivative qui renvoie une équation qui est la dérivée de l'équation, il a été demandé, ou une évaluation méthode qui évaluer une équation pour une certaine variable égale à une certaine valeur).


Ce que je fonctionne très bien pour des équations simples:
x^2 + 3
Ceci est juste deux Terme s: une avec une variable « x » et un exposant « 2 » et un autre qui est juste une constante "3."


Mais pas tant pour les équations plus complexes:
alt text
Oui, ceci est un exemple terrible mais je fais juste un point. Donc, maintenant pour la question: quelle serait la meilleure façon de représenter les équations mathématiques en tant qu'objets Java? Y a-t-il des bibliothèques qui le font déjà?

+7

Créer une arborescence d'expression. – NullUserException

+1

Google autour de Content MathML pour une approche à votre problème. –

+1

consultez le chapitre 5 de Foundations of Computer Science (http://infolab.stanford.edu/~ullman/focs.html) par Aho et Ullman pour une explication de la construction d'arbres d'expression simples –

Répondre

13

quelle serait la meilleure façon de représenter des équations mathématiques comme des objets Java ?

Je veux que vous remarquiez, vous n'avez aucune équation.Les équations ressemblent à ceci;

x = 3

Qu'est-ce que vous avez sont des expressions: collections de symboles qui pourraient, dans certaines circonstances, d'évaluer sur certaines valeurs particulières.

Vous devez écrire une expression de classe. L'expression a trois sous-classes: constante (par exemple 3), variable (par exemple x) et opération.

Une opération a un type (par exemple "exponentiation" ou "négation") et une liste d'expressions sur lesquelles travailler. C'est l'idée clé: une opération, qui est une expression, également a un certain nombre d'expressions. Donc, votre est SUM (EXP (X, 2), 3) - c'est-à-dire l'opération SUM, prenant deux expressions, la première étant l'exponentiation de la variable d'expressions X et de la constante 2, et la seconde étant the Constant 3.

Ce concept peut être élaboré à l'infini pour représenter toute expression que vous pouvez écrire sur papier.

La partie difficile est l'évaluation d'une chaîne qui représente votre expression et la production d'un objet Expression - comme quelqu'un l'a suggéré, lire quelques articles sur l'analyse. C'est la partie la plus difficile mais tout de même assez facile.

L'évaluation d'une expression (avec des valeurs fixes pour toutes vos variables) et l'impression d'une expression sont en fait relativement simples. Des transformations plus complexes (comme la différenciation et l'intégration) peuvent être difficiles mais ne sont pas encore une science de fusée.

1

Consultez un bon livre de compilation pour plus de détails sur la façon d'écrire la partie d'un compilateur qui convertit les entrées dans une arborescence d'expression.

Vous trouverez peut-être cette série d'inspiration: http://compilers.iecc.com/crenshaw/

Si vous « juste » voulez évaluer une chaîne d'entrée, alors jetez un oeil au compilateur extrait dans la bibliothèque Javassist.

0

Ici, j'ai décrit la représentation des expressions mathématiques analysées comme Abstract Syntax Trees dans le projet Symja.

La fonction D[f,x] dans le fichier D.java met en oeuvre une fonction dérivée en lisant les premières règles Derivative[] à partir du fichier System.mep.