Bibm@th

Forum de mathématiques - Bibm@th.net

Bienvenue dans les forums du site BibM@th, des forums où on dit Bonjour (Bonsoir), Merci, S'il vous plaît...

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

#1 04-10-2021 16:43:25

alexp02
Membre
Inscription : 04-10-2021
Messages : 4

Programme Python (identifier une racine d'un trinôme)

Bonjour à tous,

Je suis un grand néophyte de Python, mais j'essaie de créer un petit programme pour des élèves de Lycée pro.
Le but de ce programme est de déterminer une racine évidente d'un trinôme par tâtonnement.
Voici ce que j'ai créé :

def solution(a,b,c,start,end):
  def f(x):
    return a*x**2+b*x+c
    i=start
    while i<=end:
      if f(i)==0:
        print(i,"est une racine évidente")
        break
      else:
        i=i+0.1
solution(-5,3,2,-10,10)


Ici je cherche à déterminer la plus petite des deux racines du trinôme -5x²+3x+2 dans l'intervalle [-10;10].
Les deux racines sont x1=-0,4 et x2=1
Je m'attends donc à ce que la console écrive "-0,4 est une racine évidente"
Malheureusement, rien n'apparait lorsque je lance le programme.

Quelqu'un saurait-il me dire ce qui ne va pas avec mon code ?

Je vous remercie par avance.

Alex.

Hors ligne

#2 04-10-2021 17:09:14

Paco del Rey
Invité

Re : Programme Python (identifier une racine d'un trinôme)

Bonjour Alex.

C'est clairement un problème d'arrondi.

Si tu demande f(-.4), que te répond Python ?

Paco.

#3 04-10-2021 18:02:57

alexp02
Membre
Inscription : 04-10-2021
Messages : 4

Re : Programme Python (identifier une racine d'un trinôme)

Bonsoir Paco,

J'ai modifié mon trinôme pour avoir x² (donc a=, b= et c=0) avec un incrément i=i+1 au lieu de i=1+0.1
Je m'attend à ce qu'il m'affiche "0 est une racine évidente" mais en fait le résultat est toujours le même, rien ne s'affiche.

Je crois savoir qu'il peut y avoir des problèmes avec les virgules flottantes à cause du comptage en binaire. C'est ce que tu sous-entends ?

Désolé mais je suis vraiment un grand débutant Python et je n'ai pas réussi à demander le résultat de f(-0.4)... Quelle ligne faudrait-il que je rajoute ?


Merci.
Alex

Hors ligne

#4 04-10-2021 18:23:31

Paco del Rey
Invité

Re : Programme Python (identifier une racine d'un trinôme)

Tu peux directement demander f(-.4) à la console, ou bien rajouter une ligne à la fin de ton programme : print(f(-.4)).

Tu peux faire la même chose en demandant f(-4/10).

En gros, il n'est pas raisonnable de faire des test d'égalité sur des flottants.

Paco.

#5 04-10-2021 18:55:24

alexp02
Membre
Inscription : 04-10-2021
Messages : 4

Re : Programme Python (identifier une racine d'un trinôme)

Voilà ce que la console m'affiche quand je rentre sur une ligne
print(f(-.4))

File "C:/Users/Alex/.spyder-py3/racine.py", line 14, in <module>
    print(f(-.4))

  File "C:/Users/Alex/.spyder-py3/equ_droite.py", line 5, in f
    while i<=end:

NameError: name 'a' is not defined


Le 'a' ne fait pas référence au a de mon trinôme car j'ai remplacé le caractère par z :

def solution(z,b,c,start,end):
  def f(x):
    return z*x**2+b*x+c

mais il m'affiche la même réponse...



Tu penses que ce que je veux faire est aberrant ?

Hors ligne

#6 04-10-2021 19:24:11

Paco del Rey
Invité

Re : Programme Python (identifier une racine d'un trinôme)

Demander f(-.4) directement à la console n'était pas une bonne idée...
En effet, a, b et c ne sont pas définis.
Il aurait fallu demander à la console
a=-5;b=3;c=2;f(-.4)

Qu'à donné ma deuxième proposition ?

#7 04-10-2021 20:17:09

alexp02
Membre
Inscription : 04-10-2021
Messages : 4

Re : Programme Python (identifier une racine d'un trinôme)

En rentrant a=-5;b=3;c=2;f(-.4) sur la dernière ligne, il n'y a toujours rien qui s'affiche...

Hors ligne

#8 04-10-2021 20:19:59

Paco del Rey
Invité

Re : Programme Python (identifier une racine d'un trinôme)

Effectivement puisque a,b et c sont externes à f et internes à solution.

Paco

#9 04-10-2021 21:04:29

yoshi
Modo Ferox
Inscription : 20-11-2005
Messages : 16 944

Re : Programme Python (identifier une racine d'un trinôme)

Bonsoir,

il y a plusieurs choses générales à dire.
1. Toute valeur d'une variable interne à une fonction n'est pas connue à l'extérieur... Cette variable est locale.
Exemple
def simple_boucle (n):
    for i in range(0,12,4):
        n=n+4
    return i

simple_boucle(7)
La console affiche 8... Oui, c'est la valeur de i, elle est connue à cause du return i
Ma boucle utilise i comme compteur qui compte de 4 en 4 : 0, 8 et s'arrête parce qu'en Python la boucle for s'arrête ici avant d'atteindre 12.
Si je remplace 12 par 13, l'affichage sera bien 12.

Et maintenant on demande :
print(n)
Tu tapes print(n)
Réponse
Traceback (most recent call last):
  File "<pyshell#13>", line 1, in <module>
    i
NameError: name 'n' is not defined

n n'est pas connu de l'extérieur.
Alors, tu as une fonction solution (en fait, stricto sensu, une procédure pas une fonction : absence de return), et à l'intérieur tu as def f(x) une vraie fonction, mais elle n'est pas plus connue à l'extérieur...
Tu peux bien  lancer solution(-5,3,2,-10,10), la fonction f(x) ne serait pas plus connue de l'extérieur.
Tu peux bien appeler f(0.4) ; la fonction f(x) n'est pas connue, c'est inutile.

2. Tu écris :
def solution(a,b,c,start,end):
  def f(x):
    return a*x**2+b*x+c
......
le reste ne sert à rien, ii.
Pourquoi ?
Quand tu lances solution(-5,3,2,-10,10) (solution est connue), les valeurs a, b, c, start, end sont connues puisque passées à solution.
Mais après vient def f(x) qui ne fait que retourner ax**2+bx+c...
Oui, mais avant de retourner cela, il faut rentrer dans f(x)...
Lui passes-tu a, b, c ? non, seulement x... dont d'ailleurs la valeur est inconnue...

A quoi sert cette fonction f(x)?
A afficher : -5x^2+3x+2 ?
N-B : une solution évidente de -5x^2+3x+2 = 0 est 1: -5+3+2=0 et non -0.4 qui n'est pas évident du tout) et on en en déduit que l'autre vaut -2/5 = -0.4
Le produit des racines est c/a soit -2/5, la première solution x' = 1, donc x'x"=1*x"=-2/5, donc x" = -0.4
Si def f(x)sert à afficher, tu vas avoir quelques soucis de présentation (que j'ai moi rencontrés ici : https://www.bibmath.net/forums/viewtopic.php?id=14069 en pire à cause des puissances) avec les +, les - pour écrire en respectant les conventions d'écriture...

Pour le calcul ensuite tu afficheras print ("f("+str(i)+") =", a*i**2+b*i+c), soit :
f(-0.4) =-4.440892098500626e-16 que tu peux corriger en remplaçant par 0 directement sans calcul... (problème dû au calcul sur flottants)

Pour corriger cela, teste non pas si ==0, mais par exemple une valeur absolue du résultat inférieure à par ex ($10^{-10}$ ou $10^{-12}$)...

Je peux t'aider à corriger cela demain, si tu le souhaites...

@+

[EDIT]
C'est fait.
J'ai créé une procédure affiche_trinôme qui a pour seul comme son nom l'indique d'afficher le trinôme.
J'ai recréé ta procédure solution(a,b,c,start,end) qui commence par appeler la procédure affiche_trinôme et qui revient dans la procédure appelante où j'effectue les calculs.
J'ai besoin de deux variables supplémentaires, sol et result.
Je définis sol comme ça : sol=start
je définis result : result=1 (valeur bidon).
Je reprends ta boucle while mais j'écris

while abs(result)>=10**(-10):
    sol=sol+0.1
    result=a*sol**2+b*sol+c

Et en sortie de boucle while, j'affiche sol arrondi à 0.1 près sinon je me retrouve avec 16 décimales et des chiffres parasites sur la fin...
print(round(sol,1))

Voilà ce que m'affiche l'appel : solution(-5,3,2,-10,10)

Le trinôme du 2nd degré :
     -5x²+3x+2
admet -0.4 comme racine.

Avec solution(-5,2,3,-10,10) :

Le trinôme du 2nd degré :
     -5x²+2x+3
admet -0.6 comme racine.

[EDIT2]
J'ai ajouté une ligne entre def f(x) et son return : print ("Rentré ou pas rentré ?, telle est la question")
J'ai lancé ton programme (pas le mien) : La phrase ne s'affiche pas...
Alors j'ai voulu voir en remplaçant x par 3... : pas de phrase affichée, pas de valeur de a*x**2+b*x+c affichée...
Autre essai de confirmation : à la place de def f(x), j'écris x=3 et ligne suivante def(x,a,b,c):
Pas plus de résultats...
Ton programme shunte ta def f(x)...
Et ça m'interpelle (d'autant plus que je n'ai jamais procédé ainsi, j'ai toujours - à tort ou à raison trouvé cela "malsain")...

Dernière modification par yoshi (05-10-2021 11:27:35)


Arx Tarpeia Capitoli proxima...

Hors ligne

#10 05-10-2021 13:11:04

bridgslam
Membre
Lieu : Rospez
Inscription : 22-11-2011
Messages : 1 299

Re : Programme Python (identifier une racine d'un trinôme)

Bonjour,

Un bout de temps que je n'ai pas fait de Python, mais il me semble (contrairement à d'autres langages qui permettent les closures par exemple, comme javascript), sauf erreur, qu'on ne peut pas définir une fonction dans une autre ( un def dans un autre def).
Ou alors on est vraiment passé à une version de Python vraiment supérieure... j'en étais resté à 3.7 ou 3.8.
Les choses ont peut-être changé depuis.

Par-contre, on peut toujours passer une fonction f ( définie ailleurs) en argument d'une autre, ici du style solution( ..,..., f , start, end )

Alain

Dernière modification par bridgslam (05-10-2021 13:27:36)


"Ceux qui ne savent rien en savent toujours autant que ceux qui n'en savent pas plus qu'eux" -Pierre Dac
"Travailler sur un groupe haddock, ou être heureux comme un poisson dans l'eau..."

Hors ligne

#11 05-10-2021 14:28:02

bridgslam
Membre
Lieu : Rospez
Inscription : 22-11-2011
Messages : 1 299

Re : Programme Python (identifier une racine d'un trinôme)

Par exemple en pseudo-code python

import math

def trinome( x):
   a=..., b=..., c=...
   return ax^2 + .....+ c
-------------------------------

def autre_fonction(x):
   return xsin(x)
-------------------------------

def solution( f, debut, fin , pas): //retourne la première racine entre les bornes, au pas près
                                                     // ou affiche un message
     pour i variant de debut à fin par incrément de pas
             si f(i) est nul { return i  }
     print "racine non trouvée avec ces bornes et ce pas"
-------------------------------

//programme principal
solution( trinome , -10, 10 , 0.01)
solution( autre_fonction, 0, 20, math.PI )

Alain


"Ceux qui ne savent rien en savent toujours autant que ceux qui n'en savent pas plus qu'eux" -Pierre Dac
"Travailler sur un groupe haddock, ou être heureux comme un poisson dans l'eau..."

Hors ligne

#12 05-10-2021 14:39:07

Paco del Rey
Invité

Re : Programme Python (identifier une racine d'un trinôme)

Bonjour Alex

J'ai écrit le programme suivant :


def f(x):
    a=-5
    b=3
    c=2
    return(c+x*(b+a*x))

def g(x):
    a=-5
    b=3
    c=2
    return(c+b*x+a*x**2)

print(f(-.4))
print(g(-.4))
 

Il répond :
0.0
-3.3306690738754696e-16

Paco.

#13 05-10-2021 15:34:14

yoshi
Modo Ferox
Inscription : 20-11-2005
Messages : 16 944

Re : Programme Python (identifier une racine d'un trinôme)

Bonsoir,

Bon, bin puisque "tout le monde" y va de son code, je n'ai plus de raison de ne pas poster le mien...

def affiche_trinôme(a, b, c):
    print("Le trinôme du 2nd degré :")
    print("     "+str(a)+"x²",end="")
    if b>0:
          print ("+"+str(b)+"x",end="")
    else:
        print (str(b)+"x",end="")
    if c>0:
         print ("+"+str(c))
    else:
        print (str(c))

def solution(a,b,c,start):
    affiche_trinôme(a,b,c)
    sol, result=start,1   #1 valeur bidon pour amorcer la boucle while
    while abs(result)>=10**(-10):
        sol+=0.1
        result = a*sol**2+b*sol+c
    print ("admet", round(sol,1), "comme racine.")
   
solution(-5,3,2,-10)
 

Sortie :
Le trinôme du 2nd degré :
     -5x²+3x+2
admet -0.4 comme racine.

@+


Arx Tarpeia Capitoli proxima...

Hors ligne

Réponse rapide

Veuillez composer votre message et l'envoyer
Nom (obligatoire)

E-mail (obligatoire)

Message (obligatoire)

Programme anti-spam : Afin de lutter contre le spam, nous vous demandons de bien vouloir répondre à la question suivante. Après inscription sur le site, vous n'aurez plus à répondre à ces questions.

Quel est le résultat de l'opération suivante (donner le résultat en chiffres)?
quaranteneuf moins quatorze
Système anti-bot

Faites glisser le curseur de gauche à droite pour activer le bouton de confirmation.

Attention : Vous devez activer Javascript dans votre navigateur pour utiliser le système anti-bot.

Pied de page des forums