Echanges autour d'EduPython.
Vous n'êtes pas identifié(e).
je ne parviens pas à écrire le programme de recherche de maximum en langage python. La fonction est -0.15x^2+x+1.5 définie sur l'intervalle [0;8].
Merci pour votre aide....
Hors ligne
Bonsoir,
ça semble compliqué de trouver le maximum sur l'intervalle [0;8] puisqu'il existe une infinité de nombres réels dans cet intervalle [0;8], on peut par contre avoir une idée du résultat en prenant un "petit" pas. Voici un exemple d'algorithme :
-> On définit la fonction f par exemple
-> Programme principal :
maxi <- f(0)
x <- 0
pas <- 0.1
TANT QUE x <= 8 :
SI f(x) > maxi ALORS #Si on trouve mieux que le maximum que l'on avait
maxi <- f(x) # On met à jour la valeur du maximum
FINSI
x <- x + pas
FIN TANT QUE
AFFICHER maxi
On peut alors jouer sur le pas pour étudier l'effet.
VM
Hors ligne
Bonjour à tous,
un petit programme permettant de saisir une fonction et d'effectuer un balayage sur un intervalle donné par l'utilisateur et d'un pas lui aussi ajustable. Des balayages décimaux posent la question du type float...
from math import * # permet la saisie de toutes les fonctions mathématiques # saisie de la fonction à étudier def initFonction(): image=input("saisissez la fonction à étudier(la variable doit être x):") return lambda x:eval(image) fonction = initFonction() # saisie de l'intervale de recherche print("Vous allez rechercher le maximum et le minimum par balayage sur l’intervalle [a;b]") xMin = int(input("saisir a:")) xMax = int(input("saisir b:")) # saisie du pas de la recherche pas = float(input("Quel pas pour le balayage ? (Entrez un nombre décimal)")) xMaximum = xMin # antécédent du maximum xMinimum = xMin # antécédent du minimum x = xMin # antécédent en cours maximum = fonction(xMin) # maximum de f sur [a;b] minimum = maximum # minimum de f sur [a;b] limite=xMax+pas while x < limite: x = x+pas image = fonction(x) if image>maximum: maximum = image xMaximum = x elif image<minimum: minimum = image xMinimum = x print("Le maximum est", maximum,"et il est atteint en x=",xMaximum) print("Le minimum est", minimum,"et il est atteint en x=",xMinimum) """ remarque sur les nombres flottants: 5*0.1 -> 0.5 3*0.1 -> 0.30000000000000004 0.1+0.1+0.1 -> 0.30000000000000004 """
Pas certain que j'ai choisi la meilleure manière de faire saisir la fonction par l'utilisateur, je ne garantis pas la robustesse de l'entrée des fonctions en toute circonstance...la fonction eval peut poser problème parfois!
Quelqu'un saurait-il nous indiquer une meilleure manière de faire saisir la fonction par un utilisateur?
Dernière modification par papaLya (2018-12-24 14:10:49)
Hors ligne
Bonjour,
J'ai réfléchi à ce problème récemment en lisant la ressource officielle python où ils y font mention (ils mentionnent alors les lambda)
Pour ma part, j'avais créé une fonction minimumlocal qui prend pour arguments une fonction, les deux bornes et éventuellement le pas, même si je ne suis pas fixé sur le fait de demander une fonction en argument d'une fonction, ça m'avait paru bizarre personnellement au départ, donc je me demande comment ça pourrait passer auprès des élèves.
Mais le code donnait ça :
def minimumlocal(f,a,b,h=0.1): #argument par défaut : pas de discrétisation de h égal à 0.1 """f est la fonction dont on étudie le minimum local entre a et b a est la borne la plus petite b est la borne la plus grande h est le pas de la discrétisation""" #J'ai pris le parti de faire ça en créant la liste des antécédents puis la liste des images à partir de la liste des antécédents (j'aurais pu obtenir la première liste L avec une boucle while et la seconde K avec une boucle for. assert a<b #stoppe si a est plus grand ou égal à b. n=int((b-a)/h) L=[ a+i*h for i in range(n+1) ] #Crée la liste à la manière dont on décrit des ensembles en maths, cette astuce est mentionnée dans la doc officielle if b not in L: # On aurait pu faire if L[-1]!=b (L[-1] prend le dernier élément de la liste) ou encore l=len(L) puis L[l-1]!=b L=L+[b] #ajoute b si la discrétisation ne tombait pas juste K=[f(i) for i in L] m=min(K) return m
On appelle ensuite cette fonction minimumlocal dans la console, mais se pose le problème de créer au préalable la fonction dont on cherche le minimum.
Je voyais alors 4 manières distinctes de procéder, sans vraiment être fixé sur la bonne du point de vue pédagogique :
1/ soit on crée une fonction dans la zone de traitement de texte comme :
def fonction1(x): return x**2-x-1
Et ensuite on appelle minimumlocal(fonction1,-2,2)
2/ Soit on ajoute un nouvel objet et on se tourne vers la solution des lambda qui sont quand même bien pratiques, et on peut écrire dans la zone de traitement de texte :
f1=lambda x:x**2-x-1
On appelle ensuite minimumlocal(f1,-2,2)
3/ On crée la fonction avec l'objet lambda directement dans la console et non dans l'éditeur de texte
4/ On crée la fonction directement dans l'appel de la fonction minimumlocal :
minimumlocal(lamba x:x**2-x-1,-2,2)
Du coup, personnellement je ne suis pas encore fixé sur la meilleure des proposition dans le cas où on choisit de créer une fonction minimumlocal qui prend en argument une fonction...
Hors ligne