Comme certains l´on peut etre deja lu sur un autre topic, j´ai fait récemment une classe en c++ qui peut recevoir une chaine de caractère, par exemple: sin(3*ln(4*x-1)^2)-2*tan(2/(x+1)), qui possède d´autre part une fonction qui teste la validité mathématique de la formule ( on ne peut pas écrire: 3sincos(x+a) par exemple), une fonction qui renvoie la valeur réelle pour un certain x et une fonction qui renvoie la valeur de la dérivée en x.
J´ai tenté de faire une fonction qui calcule l´intégrale entre deux bornes a et b. Je l´ai fait avec la technique de Riemann càd prendre de tout petits intervalles de largeur p et pour chacun on calcule les valeurs de la fonction et on additionne ces valeurs que l´on a multilpiées par p. On obtient ainsi une approximation relativement bonne ( elle est d´autant meilleur si on a pris des intervalles p très petits...) de l´intégrale.
Le problème c´est que pour avoir une précision satisfaisantes ( 0.00001) je suis obligé de découper mon intervalle en 100000 petits intervalles et ma fonction prend beaucoup de temps ( +-15 secondes sur un AMD3600).
Je me suis demandé s´il n´existe pas un algorithme plus approprié ( soit pour sortir la valeur d´une fonction soit pour l´intégration) qui soit plus rapide...
D´autre part j´ai envisagé autre chose pour ma lecture de fonction, mais je sais pas si c´est faisable:
Plutot que de devoir " scanner" ma cahine de caractères à chaque fois que je veux calculer une valeur, est-ce qu´il serait possible de demander à ma classe de faire ceci quand on lui propose une chaine:
- la classe recoit la cahine et test sa validité mathématique.
- la classe " crée" code source ( en c++ par exemple ou en asm si j´ai pas d´autre choix) en fonction de la chaine recue, puis le compile. Dans ce code se trouvera seulement une fonction semblable à celle qui a été introduite dans la chaine et lors de l´execution du programme celui-ci renvoie la valeur de la formule en fonction de x.
par exemple si l´utilisateur rentre la chaine:
sin(3*x)+1
on crée le code source suivant:
int nvellefonction(double dX)
{
return sin(3*dX)+1;
}
qui sera executé beaucoup plus rapidement que le " scanning" recurssif de ma fonction.
PS: si vous avez d´autres idées à rajouter dans la classe fonction, dite le moi !
Merci.