[Résolu] Traitement de fonctions mathématiques.

zarnac
[Résolu] Traitement de fonctions mathématiques.

Bonjour,

je suis actuellement en deuxième année de MASS, et j'ai un rapport à rendre dans le cadre de la programmation. Ayant vraiment peu d'expérience dans ce domaine là j'aurai besoin de votre avis par rapport à ce que j'ai fait et si possible éventuellement une ouverture pour me permettre de débloquer mes problèmes et d'avancer.

Le sujet est le suivant :

Écrire un programme opmath qui permet de réaliser diverses opérations de traitement sur une fonction mathématique dont l'expression f(x) est entrée par l'utilisateur. Le principe de fonctionnement est similaire à celui du programme stat dans lequel l'opération de traitement était spécifiée sous la forme d'un mot-clé dans la commande saisie par l'utilisateur. Néanmoins, à la différence de stat, le programme doit pouvoir correctement gérer un nombre variable d'arguments pour les différentes opérations. Voici les opérations qui doivent être réalisables :

* def expression : définir expression comme la fonction mathématique à utiliser pour les opérations suivantes (cf. exemple ci-dessous). La même fonction mathématique sera utilisée tant que l'utilisateur n'aura pas défini une nouvelle fonction avec la commande def
* val x : évaluer la fonction courante f(x) pour la valeur x
* root xmin xmax : déterminer toutes les racines de la fonction courante f(x) sur l'intervalle [xmin, xmax]. Pour cela, le plus simple est d'utiliser la technique de la dichotomie jusqu'à obtenir une précision donnée (généralement 10e-6 est largement suffisant). Le programme doit être capable de gérer le cas des racines multiples sur l'intervalle.
* min xmin xmax : déterminer toutes les valeurs de x qui fournissent la valeur minimale de la fonction courante f(x) sur l'intervalle [xmin, xmax]
* max xmin xmax : déterminer toutes les valeurs de x qui fournissent la valeur maximale de la fonction courante f(x) sur l'intervalle [xmin, xmax]
* area xmin xmax : déterminer l'aire comprise sous la fonction courante f(x) pour l'intervalle [xmin, xmax]. Pour cela, le plus simple est d'utiliser la méthode des trapèzes avec un pas d'échantillonnage donné (généralement, utiliser 10e6 échantillons sur l'intervalle est largement suffisant)

Exemple d'exécution :

================================================================================
OPMATH : perform miscellaneous processing on a mathematical function
================================================================================
Note : enter an empty line to stop the interaction loop
<> Enter command : def x*x - 1
f(x) = x*x - 1
<> Enter command : val 2.0
f(2.0) = 3.0
<> Enter command : min -2.0 3.0
min in [-2.0,3.0] : f(0.0) = -1.0
<> Enter command : max -2.0 3.0
max in [-2.0,3.0] : f(3.0) = 8.0
<> Enter command : root -2.0 3.0
root in [-2.0,3.0] : f(-1.0) = f(1.0) = 0.0
<> Enter command : area 0.0 3.0
area under [0.0,3.0] : 6.0
<> Enter command : def cos(x)
f(x) = cos(x)
<> Enter command :

Mon programme est le suivant: ( sachant que je ne me suis arrêté que à "val x"):

f=none

while 1:
command = raw_input("Enter command: ")
if not command:
print "End of program."
break
if command.startswith('def '):
f = command.lstrip('def ')
print "f(x)=%s" % f
elif command.startswith('val '):
x = float(command.lstrip('val '))
try:
print "f(%f)=%f" % (x,eval(f))
except TypeError:
print "No function defined.
else:
print "Unknown command."

J'ai plusieurs problèmes:
-le programme fonctionne trés bien pour le premier exemple: x*x-1
- je ne sais pas comment faire pour implanter plusieurs fonctions , c'est à dire mettre une fonction au hasard et calculer ses images.
- la seconde chose , je ne sais pas comment calculer le min et le max sur un intervalle donné.

Merci de bien vouloir me répondre si possible, et de m'apporter une aide qui me permettrait d'avancer dans mon programme.

Cordialement
Arnaud.

fredericmazue
Re: Traitement de fonctions mathématiques.

Bonjour, voici quelques éléments que je l'espère t'aideront.

Pour le min max, puisque tu as une liste de nombre, le plus simple et de trier la liste (ou une copie au besoin), puis de prendre l premeir et le dernier élément. Exemple:

maliste = [5, 8, 2, 7, 1]
print maliste
maliste.sort()
print maliste
print "min: ", maliste[0]
print "max", maliste[-1]

Pour appeler une fonction aléatoirement c'est tout simple. Dans une liste tu peux tout mettre, y compris un objet 'Callable', donc une fonction. Donc tu constitues une liste de fonction, tu tires un index au hasard, et tu invoque la fonction correspondante: Exemple:

def prog():
    print "Programmez!"

def abo():
    print "Abonnez-vous!"


listfunc = [prog, abo]
import random
thefunc = random.randint(0,1)
listfunc[thefunc]()

Python rulez ! :)

zarnac
Re: Traitement de fonctions mathématiques.

Bonjour,

merci de m'avoir répondu.

Mon problème déjà ne vient pas du min ou du max, le souci vient de la première étape c'est -à-dire écrire une fonction quelconque et calculer ses images déjà.
Le souci que j'ai avec ce programme est que lorsque j'inscris x*x-1 et que que je fais val 1.0 , il m'affiche les images, si je suis l'exemple tout en bas, je fais pour cos (x) alors je suis obligé de donner les conditions des fonctions trigonométriques non?

fredericmazue
Re: Traitement de fonctions mathématiques.

Quote:
obligé de donner les conditions des fonctions trigonométriques non

Si tu ne peux pas faire confiance à l'utilisateur, ça parait incontournable...
zarnac
Re: Traitement de fonctions mathématiques.

J'essaie d'appliquer avec la fonction cos(x) et ca ne marche pas.

Je comprends pas .

fredericmazue
Re: Traitement de fonctions mathématiques.

de l'appliquer à quoi ? Quel est le message d'erreur? Est-ce qu'il n'y a pas de de problème de syntaxe pour une fonction saisie par l'utilisateur (si je comprends bien)

zarnac
Re: Traitement de fonctions mathématiques.

Je définis une fonction cos(x) d'après l'exemple d'application.

et lorsque je calcule les images val 2.1 par exemple

J'ai un problème de syntaxe et je n'arrive pas à le régler .

zarnac
Re: Traitement de fonctions mathématiques.

Le message d'erreur est le suivant:

Traceback (most recent call last):
File "C:\Users\Arnaud\Desktop\progproject\exo.py", line 13, in
print "f(%f)=%f" % (x,eval(f))
File "", line 1, in
NameError: name 'cos' is not defined

Je rappelle que le programme ( calculer des images, min et max sur un intervalle, l'aire de la fonction etc...) doit être compatible pour n'importe quelle fonction. Donc je ne comprends pas ...

fredericmazue
Re: Traitement de fonctions mathématiques.

ah ok... Avec un message d'erreur tout est toujours plus clair :-) Tu n'as pas vraiment un problème de syntaxe. C'est autre chose
En effet cos est une fonction qui n'existe pas "toute seule". Elle existe dans le module math (et cmath aussi)

Donc au début ton script il te faut ajouter

from math import cos

et faire de même pour tout les fonctions susceptibles d'être saisies par l'utilisateur. Ou analyser les saisies utilisateur et faire les import à la volée

zarnac
Re: Traitement de fonctions mathématiques.

Je te remercie pour ce tuyau. Je le cherchais ...