Forum EduPython

Echanges autour d'EduPython.

Vous n'êtes pas identifié(e).

#1 2018-01-01 15:05:09

cchiavassa
Membre
Inscription : 2018-01-01
Messages : 1

écriture algorithme - Recherche d'un maximum

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

#2 2018-01-02 18:03:36

magicvinni
Administrateur
Inscription : 2017-12-22
Messages : 82

Re : écriture algorithme - Recherche d'un maximum

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

#3 2018-12-21 18:05:02

papaLya
Membre
Lieu : Niger
Inscription : 2018-12-21
Messages : 3
Site Web

Re : écriture algorithme - Recherche d'un maximum

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

#4 2018-12-29 18:17:32

Pacotille
Membre
Inscription : 2017-12-31
Messages : 7

Re : écriture algorithme - Recherche d'un maximum

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

Pied de page des forums