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

Calcul scientifique Python Discussion :

Representation de tan(x) avec Tk et math [Python 2.X]


Sujet :

Calcul scientifique Python

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Webdesigner
    Inscrit en
    Juillet 2014
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Cuba

    Informations professionnelles :
    Activité : Webdesigner

    Informations forums :
    Inscription : Juillet 2014
    Messages : 10
    Points : 7
    Points
    7
    Par défaut Representation de tan(x) avec Tk et math
    Bonjour tout le monde !

    Je dois réaliser une fonction qui représente tan() tel que y=tan(x) dans un canvas. J'ai le droit qu'aux modules Tk et math.

    Voila mon 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
    #! /usr/bin/env python
    # -*- coding: utf-8 -*-
     
    from Tkinter import *
    from math import *
     
    # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ animation
    def manager(event) :
    	affichage(event)
     
    def pixel(w, x, y, c) : # widget, abs, ord, color
    	w.create_rectangle(x, y, x, y, fill=c, outline=c)
     
    def scale(val) : return round(val * H/3, 2)
     
    def affichage(click) :
    	afficheur ['text'] = "Pas de : 10 \nX = 25 \nY = 150"
    # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ widgets
    T = Tk()
    T.title('Tangente 0.0')
    W = 300	# width
    H = 300	# height
    F = Canvas(T,width=W, height=H, bg='light yellow')
    F.pack()
     
    X = W / 12		 # decalage horizontal
    Y = H / 2		# decalage verticale
    F.create_line(-57*10, Y, 57*10, Y)	  # axe x
    F.create_line(X, X, X, H-20)		  # axe 
    for angle in xrange(0, int(radians(360) * 100), 10) :	   # revolution complete
    	x = angle / 100.										
    	y = scale(tan(x)) + Y
    	x = x * 10 + X						   # graduation
    	pixel(F, x, y, 'red')					   # tracage
     
    F.bind("<Button-1>", manager)
    afficheur = Label(T)
    afficheur.pack()
    T.mainloop()
    Le problème est qu'a l’exécution de mon script j’obtiens la fonction mais :
    - l'axe des ordonnées croit vers le bas
    - la représentation de tan() me semble fausse
    - l'axe des x devrait aller de -57 a 57 et la ça me trace limite une ligne continue....

    Si quelqu'un pourrait m’éclairer ?

  2. #2
    Membre chevronné

    Profil pro
    Account Manager
    Inscrit en
    Décembre 2006
    Messages
    2 301
    Détails du profil
    Informations personnelles :
    Localisation : France, Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Account Manager

    Informations forums :
    Inscription : Décembre 2006
    Messages : 2 301
    Points : 1 752
    Points
    1 752
    Par défaut
    Bonjour.

    Il serait bien d'indiquer que c'est pour l'ISN. À moins que je me trompe...

    Sinon, si l'on choisit un pas de 1, le tracé semble correct à une symétrie axiale près. Non ?

    Question. Comment fonctionnent les axes dans une interface graphique ? De gauche à droite ? De haut en bas ? Où est le point de coordonnées (0, 0) pour l'interface graphique ?

  3. #3
    Futur Membre du Club
    Homme Profil pro
    Webdesigner
    Inscrit en
    Juillet 2014
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Cuba

    Informations professionnelles :
    Activité : Webdesigner

    Informations forums :
    Inscription : Juillet 2014
    Messages : 10
    Points : 7
    Points
    7
    Par défaut
    Bonjour,

    Euh désolé mais, c'est quoi ISN ? :$

    Les axes fonctionnent de gauche a droite et de haut en bas vu que le point d'origine se trouve tout haut a gauche...

    Donc la représentation que j'obtiens est juste ?

  4. #4
    Membre du Club

    Homme Profil pro
    Lycéen
    Inscrit en
    Avril 2015
    Messages
    19
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 24
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Avril 2015
    Messages : 19
    Points : 53
    Points
    53
    Par défaut
    Bonjour,

    Ton code revu (n'hésite pas à poser des questions) :
    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
    # -*- coding: utf-8 -*-
    from Tkinter import *
    from math import tan, pi
     
     
    def trace(f, a, b, step, scale, translate):
        """
            Trace la représentation graphique
            d'une fonction f de l'abscisse a à b.
        """
        x0, y0 = translate
        x = a
        lines = []
        while x <= b:
            x1 = (x * scale) + x0
            y1 = - (f(x) * scale) + y0
            x2 = ((x - step) * scale) + x0
            y2 = (- f(x - step) * scale) + y0
            lines.append([x1, y1, x2, y2])
            x += step
        return lines
     
    # GUI
    Win = Tk()
    Win.title('Plot')
     
    width = 500
    height = 500
     
    Frame = Canvas(Win, width=width, height=height, bg='white')
    Frame.pack()
     
    x0 = width / 2.
    y0 = height / 2.
    # coordonnées du centre de la fenêtre
     
    Frame.create_line(- width, y0, width, y0)    # axe x
    Frame.create_line(x0, - height, x0, height)    # axe y
     
    lines = trace(tan, 0, 2 * pi, .001, 20, (x0, y0))    # paramètres du tracé
     
    for line in lines:
        x1, y1, x2, y2 = line
        Frame.create_line(x1, y1, x2, y2, fill='blue')
    # trace y = tan x
    Le programme est scindé en deux parties :
    • l'une est une fonction qui renvoie des points de la représentation graphique d'une fonction
    • l'autre se charge de l'interface graphique



    l'axe des ordonnées croit vers le bas
    C'est normal, il te suffit de prendre l'opposé de tan(x).

  5. #5
    Futur Membre du Club
    Homme Profil pro
    Webdesigner
    Inscrit en
    Juillet 2014
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Cuba

    Informations professionnelles :
    Activité : Webdesigner

    Informations forums :
    Inscription : Juillet 2014
    Messages : 10
    Points : 7
    Points
    7
    Par défaut
    Merci pour ton code ! Mais j'essaye de créer mon propre code plutôt que de m'approprier celui de quelqu’un d'autre

    C'est pas un devoir ou un truc a rendre c'est juste qu'un ami m'a refiler ses cours et exos de fac sur Python mais sans corrigé ^^

    Mais ton code m'a beaucoup aider pour améliorer le mien !

  6. #6
    Membre du Club

    Homme Profil pro
    Lycéen
    Inscrit en
    Avril 2015
    Messages
    19
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 24
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Avril 2015
    Messages : 19
    Points : 53
    Points
    53
    Par défaut
    De rien !

    Le code était là pour donner un exemple, mais ce n'est sûrement pas le meilleur.
    Pense aussi à séparer les fonctions qui font des calculs des fonctions GUI : ça permet de déboguer plus facilement.
    Maintenant, tu peux tracer toutes sortes de fonctions (il suffit de remplacer la fonction tan par une autre, comme sin, cos ...)

    Autre chose, même si la courbe tan x est discontinue, le programme va t'afficher une courbe continue ... mais on peut considérer les tracés en trop comme des asymptotes ...

    Je te conseille PyQt pour les interfaces graphiques, voire PySide (même si ce dernier serait mort ???)

  7. #7
    Futur Membre du Club
    Homme Profil pro
    Webdesigner
    Inscrit en
    Juillet 2014
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Cuba

    Informations professionnelles :
    Activité : Webdesigner

    Informations forums :
    Inscription : Juillet 2014
    Messages : 10
    Points : 7
    Points
    7
    Par défaut
    Oui c'est vraiment que la séparation permet de mieux s'y retrouver ^_^

    Pour l'instant dans le cours que je suis c'est imposer de ne rien utiliser d'autres. Mais un peu plus loin normalement je vais utiliser PyQt et aussi numpy et matplotlib pour les fonctions ça sera plus facile.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [Compiler] problème avec la Symbolic Math Toolbox ( apres building )
    Par AkuX7 dans le forum MATLAB
    Réponses: 9
    Dernier message: 29/03/2011, 17h26
  2. Problème avec le module Math::Trig
    Par Hoopsy dans le forum Modules
    Réponses: 2
    Dernier message: 05/08/2010, 23h04
  3. Problème avec la libraire math.h sous ubuntu
    Par boula dans le forum Bibliothèque standard
    Réponses: 4
    Dernier message: 26/06/2009, 17h12
  4. probléme avec le fonction math.random()
    Par dv-2008 dans le forum Débuter avec Java
    Réponses: 7
    Dernier message: 19/03/2008, 20h32
  5. problème avec la bib math.h
    Par tenderstoune dans le forum C++
    Réponses: 6
    Dernier message: 01/11/2007, 21h13

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