IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Python Discussion :

Petit programme point fixe fonction.


Sujet :

Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éprouvé
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    1 124
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2003
    Messages : 1 124
    Par défaut Petit programme point fixe fonction.
    Bonjour

    Je souhaite réaliser un petit programme de teste de point fixe d'une fonction.

    Voici le code.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
     
    import math as mt
    import numpy as np
    import matplotlib.pyplot as plt
     
    def f(x):
     
        return -x(1+mt.exp(x)) + mt.exp(x)
     
    def pointfixe(f, x0, xmax, eps):
     
        itera = 0
     
        x = 0
     
        xt = {}
     
        while itera < xmax:
     
            try:
     
                x = f(x0)
            except OverflowError:
             break
     
            xt[itr] = x0
     
            if abs(x - x0) <= eps:
                return xt
     
     
        x0 = x
        itr += 1
     
        return "Aucun point fixe"
     
    def saisiretafficher():
     
         xin = input('Enter le nombre  ')
     
         xmx = input('Enter le nombre maximum ')
     
         try:
     
             x0=int(xin)
             xmax=int(xmx)
     
             if x0 >=0 and xmax >=0:
     
                print(pointfixe(f,x0,xmax, 0.0001))
     
             else:
     
                 print('Votre nombre n\'est pas superieur à 0')
     
         except ValueError:
     
     
            print('Vous n\'avez pas entrer un de nombre')
     
     
    saisiretafficher()
    Voici l'erreur que python signal.


    Traceback (most recent call last):
    File "C:\Users\EDMOND\Documents\programme python\exo7.py", line 82, in <module>
    saisiretafficher()
    File "C:\Users\EDMOND\Documents\programme python\exo7.py", line 70, in saisiretafficher
    print(pointfixe(f,x0,xmax, 0.0001))
    File "C:\Users\EDMOND\Documents\programme python\exo7.py", line 37, in pointfixe
    x = f(x0)
    File "C:\Users\EDMOND\Documents\programme python\exo7.py", line 17, in f
    return -x(1+mt.exp(x)) + mt.exp(x)
    TypeError: 'int' object is not callable
    Si j'ai bien compris, la fonction n'accepte pas d'entier.

    J'ai essayé avec float, ça ne fonctionne pas non plus.

    Que doit-je corriger dans la fonction saisiretafficher ?

    A bientôt

  2. #2
    Expert confirmé Avatar de papajoker
    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2013
    Messages
    2 323
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nièvre (Bourgogne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Septembre 2013
    Messages : 2 323
    Par défaut
    bonjour
    Citation Envoyé par argon Voir le message
    Si j'ai bien compris, la fonction n'accepte pas d'entier
    perdu Il te dit que int n'est pas une fonction ...

    ps: merci d'avoir décalé les lignes, il indique en dernière ligne du message d'erreur ligne 17 qui est ici ligne 8

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    return -x(1+mt.exp(x)) + mt.exp(x)
    essayes d'écrire 2(1+5), même erreur (bien logique)

  3. #3
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 830
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 830
    Billets dans le blog
    1
    Par défaut
    Bonjour
    Citation Envoyé par argon Voir le message
    Que doit-je corriger dans la fonction saisiretafficher ?
    Pourquoi corriger cette fonction alors que Python te dit explicitement "line 17, in f" donc que ça se passe dans f???

    Donc on regarde f
    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    def f(x):
    	return -x(1+mt.exp(x)) + mt.exp(x)
    Voilà. La fonction reçoit un "x". C'est quoi ce "x"? un int. Alors quand à la ligne du dessous tu lui mets des parenthèses et tente de l'utiliser comme une fonction, Python te signale (du verbe "signaler", 1er groupe) qu'un int n'est pas une fonction (un "callable")

    Ca aurait pu aussi se passer dans f mais sans être la faute de f. Si on écrit par exemple def f(x): return 1/x et qu'on appelle f(0) il y a aussi une erreur dans f mais la faute en revient à celui qui appelle f. C'est pour ça que Python te montre la pile des appels ayant amené à cette situation.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    Traceback (most recent call last):
    File "C:\Users\EDMOND\Documents\programme python\exo7.py", line 82, in <module>
    saisiretafficher()
    File "C:\Users\EDMOND\Documents\programme python\exo7.py", line 70, in saisiretafficher
    print(pointfixe(f,x0,xmax, 0.0001))
    File "C:\Users\EDMOND\Documents\programme python\exo7.py", line 37, in pointfixe
    x = f(x0)
    File "C:\Users\EDMOND\Documents\programme python\exo7.py", line 17, in f
    return -x(1+mt.exp(x)) + mt.exp(x)
    TypeError: 'int' object is not callable
    Et là on voit que si f n'est pas en cause alors il faut examiner pointfixe (et ça se passera quand elle appelle "f"). Si pointfixe n'est pas en cause alors on se concentre sur saisiretafficher (qui appelle "pointfixe") ; et si saisiretafficher n'est pas en cause alors c'est que ça vient du programme principal qui appelle "saisiretafficher".

    Citation Envoyé par argon Voir le message
    Si j'ai bien compris, la fonction n'accepte pas d'entier.
    Faut mieux lire que ça. Il ne t'a pas dit "function does not support int" (on se demanderait bien pourquoi) mais "int is not callable". Sujet à gauche "int", verbe "is", complément à droite "not callable" => on traduit "un entier n'est pas un appelable (une fonction)"
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  4. #4
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 737
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 737
    Par défaut
    Salut,

    Citation Envoyé par argon Voir le message
    Si j'ai bien compris, la fonction n'accepte pas d'entier.
    J'ai essayé avec float, ça ne fonctionne pas non plus.
    Pour corriger, il faut comprendre et si on ne voit pas ce qui cloche dans l'expression: x(1+mt.exp(x)) + mt.exp(x), on peut lancer l'interpréteur Python et essayer de simplifier pour cerner le problème.
    En partant de:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    >>> import math as mt
    >>> x = 1
    >>> x(1+mt.exp(x)) + mt.exp(x)
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
    TypeError: 'int' object is not callable
    >>>
    on vérifie qu'on reproduit bien la même erreur, et on choisit/réfléchit à quoi supprimer qui malgré tout préserve l'erreur.

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  5. #5
    Expert confirmé
    Avatar de popo
    Homme Profil pro
    Analyste programmeur Delphi / C#
    Inscrit en
    Mars 2005
    Messages
    2 964
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Analyste programmeur Delphi / C#
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 2 964
    Par défaut
    Citation Envoyé par papajoker
    perdu Il te dit que int n'est pas une fonction ...
    Attention, au raccourci qu'un débutant pourrait mal interpréter.
    Il existe bien une fonction int comme le montre cet appel
    L'erreur dit qu'un objet de type 'int' a été utilisé comme s'il s'agissait d'une fonction, ce qui est différent.

    Mais la suite de ton message est on ne peut plus explicite et permet de voir l'erreur très simplement :
    Citation Envoyé par papajoker
    essayes d'écrire 2(1+5), même erreur (bien logique)
    Je trouve qu'il y a beaucoup de bla bla pour au final ne pas dire clairement au PO où se situe son problème.

    Donc pour faire simple :
    Pour exprimer la multiplication, il faut le faire explicitement avec * car avec la parenthèse ouvrante placée directement derrière x, python considère qu'il s'agit d'une appel à une fonction;

  6. #6
    Membre éprouvé
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    1 124
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2003
    Messages : 1 124
    Par défaut
    Bonjour

    J'ai modifié le code de la fonction.

    Voici-dessous le code complet.

    De plus, j'ai fait une erreur de calcul (que j'ai corrigé) pour trouver la racine de l'équation de f.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
     
    from scipy import optimize
    from numpy import array, exp
    import matplotlib.pyplot as plt
     
    def f(x):
     
        return exp(x)/(1+ exp(x))
     
    def pointfixe(eps):
     
        xt = 1
        xa =f(xt)
     
        while abs(xa-xt)>eps:
     
            xt-xa
            xa = f(xt)
        return xa
     
     
    def g(x):
     
        return exp(x)*(1-x)
     
    def graph():
     
        x = array([0,1])
     
        fig, ax = plt.subplots(figsize=(10, 8), layout='constrained')
        plt.grid()
        ax.plot(x, f(x), label='f(x).')
        ax.plot(x, g(x), label='g(x).')
        plt.title("Point fixe.")
        plt.legend()
        plt.show()
     
    def saisiretafficher():
     
     
     
        graph()
     
        print(pointfixe(0.01))
     
     
    saisiretafficher()
    Il n'y a plus d'erreur, le programme tourne sans afficher le résultat.

    Traceback (most recent call last):
    File "C:\Users\EDMOND\Documents\programme python\TP3exo7.py", line 60, in <module>
    saisiretafficher()
    File "C:\Users\EDMOND\Documents\programme python\TP3exo7.py", line 54, in saisiretafficher
    print(pointfixe(0.01))
    File "C:\Users\EDMOND\Documents\programme python\TP3exo7.py", line 28, in pointfixe
    xa = f(xt)
    File "C:\Users\EDMOND\Documents\programme python\TP3exo7.py", line 17, in f
    return exp(x)/(1+ exp(x))
    KeyboardInterrupt
    Pourquoi le programme tourne sans afficher le résultat du calcul.

    A bientôt

  7. #7
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 830
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 830
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par argon Voir le message
    Pourquoi le programme tourne sans afficher le résultat du calcul.
    La réponse est dans la question: parce qu'il tourne sans faire autre chose (sortir, afficher un résultat, etc).

    Donc on va voir à quel endroit il tourne (en général une boucle) et c'est là qu'on tombe sur...
    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    while abs(xa-xt)>eps:
    	xt-xa
    	xa = f(xt)
    ... et qu'on se dit que tu pourrais au-moins checker ton code un minimum (46 lignes quoi !!!)
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  8. #8
    Expert confirmé
    Avatar de popo
    Homme Profil pro
    Analyste programmeur Delphi / C#
    Inscrit en
    Mars 2005
    Messages
    2 964
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Analyste programmeur Delphi / C#
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 2 964
    Par défaut
    Citation Envoyé par argon Voir le message
    Il n'y a plus d'erreur, le programme tourne sans afficher le résultat.
    Pourquoi le programme tourne sans afficher le résultat du calcul.
    Parce que xt ne bouge jamais dans ta boucle.
    Tu as donc toujours le même résultat et tu ne sors pas.

    Edit : Devancé par sve@r

  9. #9
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 737
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 737
    Par défaut
    Salut,

    Citation Envoyé par argon Voir le message
    Pourquoi le programme tourne sans afficher le résultat du calcul.
    Pour utiliser numpy, scipy, matplotlib, ... savoir programmer un minimum est un pré-requis sinon on ne comprendra pas ce que racontent les modes d'emploi et n'importe quel code sera trop long pour le comprendre et y trouver, le cas échéant, la cause d'une erreur.

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

Discussions similaires

  1. Réponses: 3
    Dernier message: 29/01/2009, 23h00
  2. Faisabilité d'un petit programme FTP...
    Par ptit_seb dans le forum Windows
    Réponses: 2
    Dernier message: 15/09/2005, 21h10
  3. [SRC] Petit programme avec BD
    Par Nico62 dans le forum C++Builder
    Réponses: 3
    Dernier message: 10/01/2005, 20h07
  4. Programmation d'une fonction dans Rn
    Par simone.51 dans le forum Algorithmes et structures de données
    Réponses: 5
    Dernier message: 12/11/2004, 11h30

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo