OVH Cloud OVH Cloud

fonctions mathématiques compliquées...

1 réponse
Avatar
Nicolas Aunai
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 : nicolas_aunai@hotmail.com

1 réponse

Avatar
kanze
Nicolas Aunai wrote in message
news:...

[...]
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.

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.)

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.

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.

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:
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