 |
C++Talk.NET C++ language newsgroups
|
| View previous topic :: View next topic |
| Author |
Message |
Nicolas Aunai Guest
|
Posted: Fri Jan 30, 2004 7:07 pm Post subject: fonctions mathématiques compliquées... |
|
|
salut,
dans le but de faire un projet de modélisation physique en c++, j'ai
besoin de me faire une petite biblio de fonctions/objets mathématiques
j'ai notamment besoin de coder tout ce qui est recherche d'un 0 d'une
fonction, résolutions d'équation différentielles etc...
à la base de tout ça se trouve l'expression mathématique a utiliser...
j'aimerai savoir si quelques un d'entre vous ont fait ce genre de truc,
comment "reconnaitre" une fonction passée par un utilisateur ?
faut-il demander une chaine et la parser puis créer des Objets en
conséquence ?
par exemple "3*x^2+2*x" serait reconnu en tant que polynome et il y
aurai création d'un objet "polynome" qui serait facilement manipulable
par la suite...
en revanche pour des expression bcp plus compliquées et courantes en
physique, je sèche complètement exemple :
3*ln(sqrt(x))*exp(-x^4)
ouah rien que ça... c'est assez immonde et j'ai pas vraiment d'idée !
merci d'avance pour vos idées....
--
Nico,
http://astrosurf.com/nicoastro
messenger : [email]nicolas_aunai (AT) hotmail (DOT) com[/email]
|
|
| Back to top |
|
 |
kanze@gabi-soft.fr Guest
|
Posted: Mon Feb 02, 2004 7:44 am Post subject: Re: fonctions mathématiques compliquées... |
|
|
Nicolas Aunai <nicolas.aunai (AT) free (DOT) fr> wrote
[...]
| Quote: | j'aimerai savoir si quelques un d'entre vous ont fait ce genre de
truc, comment "reconnaitre" une fonction passée par un utilisateur ?
|
C'est ce que fait le compilateur, en fin de compte, quand tu lui files
une expression dans ton programme.
| Quote: | faut-il demander une chaine et la parser puis créer des Objets en
conséquence ?
|
C'est la solution classique. (Historiquement, il y a eu d'autres
représentations, mais un arborescence d'objets me semble la solution la
plus appropriée, et la plus répandue, aujourd'hui.)
| Quote: | par exemple "3*x^2+2*x" serait reconnu en tant que polynome et il y
aurai création d'un objet "polynome" qui serait facilement manipulable
par la suite...
|
C'est un peu limité. Les polynomes ne sont qu'un cas particulier.
| Quote: | en revanche pour des expression bcp plus compliquées et courantes en
physique, je sèche complètement exemple :
3*ln(sqrt(x))*exp(-x^4)
|
Une arborescence. Les variables et les constantes constituent les
« feuilles » ; les opérations les vertices intérieur. On aurait donc
quelque chose du genre :
class Node
{
public:
virtual ~Node() {}
virtual double value() const = 0 ;
} ;
class Constant : public Node
{
public:
explicit Constant( double value )
: myValue( value )
{
}
virtual double value() const
{
return myValue ;
}
private:
double myValue ;
} ;
class Variable : public Node ...
mais surtout :
class Plus : public Node
{
public:
Plus( Node const* left, Node const* right )
: myLeft( left )
, myRight( right )
{
}
double value() const
{
return myLeft->value() + myRight->value() ;
}
private:
Node const* myLeft ;
Node const* myRight ;
} ;
etc.
| Quote: | ouah rien que ça... c'est assez immonde et j'ai pas vraiment d'idée !
|
C'est le genre de chose où yacc (ou bison) excelle, avec des règles
comme :
expr : expr '+' expr
{ $$ = new Plus( $1, $3 ) ; }
etc.
--
James Kanze GABI Software mailto:kanze (AT) gabi-soft (DOT) fr
Conseils en informatique orientée objet/ http://www.gabi-soft.fr
Beratung in objektorientierter Datenverarbeitung
11 rue de Rambouillet, 78460 Chevreuse, France, +33 (0)1 30 23 45 16
|
|
| Back to top |
|
 |
|
|
You cannot post new topics in this forum You cannot reply to topics in this forum You cannot edit your posts in this forum You cannot delete your posts in this forum You cannot vote in polls in this forum
|
|