[Python] Ensembles de Julia
Répondre à la discussion
Affichage des résultats 1 à 8 sur 8

[Python] Ensembles de Julia



  1. #1
    henryallen

    [Python] Ensembles de Julia


    ------

    Bonjour,

    Je cherche à réaliser, en Python, un programme permettant de dessiner un ensemble de Julia en utilisant Tkinter. Petite explication: on prend un point du plan d'affixe complexe z. On prend la suite définie par u0=z et un+1=u2+c, avec c un complexe. Si (un) diverge, on colorie le point en bleu. Sinon, on le colorie en noir.

    J'ai donc fait un programme, que j'ai lancé. Le problème était que j'avais de nombreux points noirs dans la partie qui, en théorie, devait être bleue. Au début je pensais que c'était dû à l'imprécision quant au fait que la suite diverge ou non. J'ai alors changé les couleurs, utilisant le rouge et le bleu, et je me suis aperçu qu'en réalité, les points problématiques restaient noirs ... Le problème venait donc plutôt soit de l'affichage, soit des points testés. J'ai réfléchi au problème, essayé différents changements, mais rien n'y fait, je suis toujours bloqué ... Voilà le code:

    Code:
    #*-coding:Latin-1-*
    
    from tkinter import * #On importe tkiner pour l'affichage.
    
    def suite(a, b):
        """Fonction prenant en arguments a et b (a+ib) et déterminant si le point correspondant est noir ou bleu."""
        i=0 #Correspond au nombre de termes calculés pour la suite.
        re=a
        im=b #Parties réelle et imaginaire.
        re2=im2=0 #Correspondront au carré des parties réelle et imaginaire (permettant de réduire légèrement le nombre de calculs).
        while i<40 and re2+im2<=4: #On calcule les 40 premiers termes, et on vérifie que leur distance à l'origine ne dépasse pas 2.
            tamp=re #Conserve la valeur de re.
            re2=re*re
            im2=im*im #On calcule les carrés de chaque partie.
            re=re2-im2-0.75 #On calcule la partie réelle de l'image du complexe précédent avec l'application f(z)=z*z-0.75.
            im=2*tamp*im #De même pour la partie imaginaire.
            i+=1 #i augmente de 1.      
        if i==40 and re2+im2<=4:
            return ("red") #Si la boucle s'est interrompue car i==40, le point sera rouge.
        else:
            return("blue") #Sinon il sera bleu.
    
    couleurs={} #Dictionnaire avec comme clé, les coordonnées, et comme valeur, les couleurs.
    zoom=100 #Sert à déterminer la taille (100 semble être une valeur minimale correcte).
    for al_re in range(int(-1.5*zoom), int(1.5*zoom)):
        for al_im in range(int(-1.2*zoom), int(1.2*zoom)): #Pour tous les points dans une portion du plan (espacés d'un certain intervalle):
            borne=suite(al_re/zoom, al_im/zoom) #borne prend la valeur de la couleur du point.
            couleurs[al_re, al_im]=borne #Le dictionnaire prend en clé le point et en valeur la couleur.
    
    fenetre=Tk()
    canvas=Canvas(fenetre, height=int(2.4*zoom), width=int(3*zoom))
    canvas.pack() #On crée notre fenêtre et notre Canevas.
    for key, couleur in couleurs.items(): #Pour chaque élément du dictionnaire:
        canvas.create_oval(int(1.5*zoom)+key[0], int(1.2*zoom)-key[1], int(1.5*zoom)+key[0], int(1.2*zoom)-key[1], fill=couleur) #On colorie les points.
    fenetre.mainloop()
    Si quelqu'un pouvait éclairer ma lanterne, parce que là, je ne vois vraiment pas ...

    Merci d'avance et bonne journée

    -----

  2. #2
    invite6c250b59

    Re : [Python] Ensembles de Julia

    A mon avis le problème est au niveau du dictionnaire, néanmoins quelques remarques sur la fonction
    1) sauf cas particulier (où a et b sont des variables globales), deux variables a et b passées à l'intérieur d'une fonction ne sont pas les a et b à l'extérieur de la fonction, il ne sert donc à rien de les remplacer par des variables temporaires
    2) en python on peut directement faire a, b = b, a sans besoin de créer une variable temporaire pour stocker le a
    3) plutôt que d’initialiser les variables dans le code il est souvent pratique et élégant de le faire dans le def
    4) c'est le genre de problème qui supplie pour qu'on le traite par récurrence tel que ci-dessous:

    Code:
    def julia(a, b, c=-0.75, maxt=40):
        """détermine si le point a, b du plan complexe diverge d'un ensemble de Julia
        défini par z => z*z+c en moins de maxt itérations. Si oui,non renvoi blue,red. """
        if a*a+b*b>4:
            return("blue")
        else:
            if maxt<1:
                return("red")
            else:
                return julia(a*a-b*b+c,2*a*b,c,maxt-1)
    Tu peux facilement vérifier que c'est bien la même fonction
    Code:
    zoom=100
    for a in range(int(-1.5*zoom), int(1.5*zoom)):
        for b in range(int(-1.2*zoom), int(1.2*zoom)):
            if suite(a,b)!=julia(a,b):
                print("attention résultat différent pour ", a, " et ", b)
                print("suite(",a,",",b,") donne ", suite(a,b))
                print("julia(",a,",",b,") donne ", julia(a,b))
    A+

  3. #3
    henryallen

    Re : [Python] Ensembles de Julia

    Bonsoir et merci pour la réponse
    1) Oui, je n’ai aucune idée de la raison pour laquelle j´ai fait ça ...
    2) Je le sais en effet, mais je dois dire que je n’ai pas le réflexe en général ... Bien que ce soit plus simple.

    Merci en tout cas, je vais essayer de regarder où peut être le problème s’il est avec le dictionnaire, puis je m´occuperai de rendre mon code plus sympa

    À bientôt, bonne soirée

  4. #4
    invite6c250b59

    Re : [Python] Ensembles de Julia

    Non en fait le dico a l'air ok, ça doit donc être tkiner le problème. Est-ce qu'il y a une raison pour ne pas utiliser matplotlib?

  5. A voir en vidéo sur Futura
  6. #5
    invite6c250b59

    Re : [Python] Ensembles de Julia

    PS: une version avec matplotlib. Si tu as besoin de l'intégrer dans tkinter je crois que le plus simple est encore de créer le graphique sous matplotlib et ensuite de l'importer (plutôt que de le créer directement dans tkinter qui est plus orienté sur l'interfaçage que le graphisme à proprement parlé)

    Code:
    import matplotlib.pyplot as plt
    
    def isjulia(a, b, c=-0.75, maxt=40):
        """détermine si le point a, b du plan complexe diverge d'un ensemble de Julia
        défini par z => z*z+c en moins de maxt itérations. """
        if a*a+b*b>4:
            return(False)
        else:
            if maxt<1:
                return(True)
            else:
                return isjulia(a*a-b*b+c,2*a*b,c,maxt-1)
    
    xmin, xmax, ymin, ymax, zoom = -1.5, 1.5, -1.2, 1.2, 100
    
    x = [xmin + i * (xmax-xmin)/zoom for i in range(zoom)]
    y = [ymin + i * (ymax-ymin)/zoom for i in range(zoom)]
    
    points = [[a,b] for a in x for b in y if isjulia(a,b)]
    X = [p[0] for p in points]
    Y = [p[1] for p in points]
    
    fig, ax = plt.subplots()
    ax.scatter(X, Y, c="black")
    plt.show()

  7. #6
    invite6c250b59

    Re : [Python] Ensembles de Julia

    PPS: est-ce que quelqu'un saurait simplifier ceci?

    Code:
    points = [[a,b] for a in x for b in y if isjulia(a,b)]
    X = [p[0] for p in points]
    Y = [p[1] for p in points]
    ...il me semble que ça devrait avoir besoin juste d'une ligne

  8. #7
    henryallen

    Re : [Python] Ensembles de Julia

    Bonsoir

    En fait je ne connais pas matplotlib, j’essayerai peut-être de regarder (et donc évidemment je ne peux pas répondre à votre question), merci.
    Je n’ai toujours pas compris où se trouve mon problème, mais j’ai réussi à le contourner en utilisant non pas Tkinter mais pygame. Là il n’y a aucun souci. J’essayerai, si j’y pense, de poster le code correspondant demain (après l’avoir légèrement modifié).

    Bonne soirée

  9. #8
    invite6c250b59

    Re : [Python] Ensembles de Julia

    Citation Envoyé par henryallen Voir le message
    pas compris où se trouve mon problème
    A la réflexion je soupçonne une histoire de compatibilité entre les versions 2.x et 3.x

Discussions similaires

  1. Langage Julia.
    Par skeptikos dans le forum Programmation et langages, Algorithmique
    Réponses: 1
    Dernier message: 01/12/2017, 12h14
  2. Tracer un ensemble de Julia
    Par AmigaOS dans le forum Mathématiques du supérieur
    Réponses: 33
    Dernier message: 26/01/2011, 00h18
  3. ensemble de Julia
    Par invitea1b8242a dans le forum Mathématiques du supérieur
    Réponses: 0
    Dernier message: 26/05/2009, 19h08
  4. Julia 74
    Par invite94ee7133 dans le forum Santé et médecine générale
    Réponses: 11
    Dernier message: 18/08/2007, 21h17
  5. Les ensembles de Julia
    Par invite4793db90 dans le forum Mathématiques du collège et du lycée
    Réponses: 1
    Dernier message: 03/12/2006, 17h50