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 :

Modèle de Kac en physique statistique


Sujet :

Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2015
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Mai 2015
    Messages : 14
    Par défaut Modèle de Kac en physique statistique
    Bonjour à tous!
    Dans le cadre d'un cours de physique statistique, j'ai tenté de simuler le modèle de Kac (on prend un cercle, sur lequel se trouvent N sites contenant chacun une boule, blanche ou noire. Certains sites contiennent aussi un "marqueur". A chaque pas de temps, on déplace toutes les boules d'une position sur le cercle, et celles qui arrivent sur un marqueur voient leur couleur modifiée).
    Le code que j'ai tapé est le suivant :
    #!/usr/bin/python
    # -*- coding: UTF-8 -*-

    Aleatoire = False
    Marqueurs = []
    Etat_initial = []
    Etat_actuel = []
    Taille_de_la_chaine = 20
    Nombre_de_tours = 5
    seuil = 20
    Somme = 0
    Pourcentage_blanches = []
    Pourcentage_differences = []
    Differences = 0
    temporaire = []

    i = 0
    j = 0
    k = 1
    l = 0
    m = 0
    n = 0
    o = 0

    #Création des marqueurs
    while i <= Taille_de_la_chaine - 1 :
    import random
    r = random.randint(1,100)
    i+=1 #incrémentation

    if r < seuil :
    Marqueurs.append(1)
    else :
    Marqueurs.append(0)

    print("Emplacement des marqueurs")
    print(Marqueurs)

    if Aleatoire:

    #Création de l'état initial aléatoire :
    while j<= Taille_de_la_chaine - 1:
    import random
    r = random.randint(1,100)
    j+=1 #incrémentation

    if r < 50 :
    Etat_initial.append(1)
    Etat_actuel.append(1)
    temporaire.append(1)
    else :
    Etat_initial.append(0)
    Etat_actuel.append(0)
    temp.append(0)

    else :
    while j <= Taille_de_la_chaine - 1:
    j+=1
    Etat_initial.append(1) #On crée une liste de boules blanches
    Etat_actuel.append(1)
    temporaire.append(1)

    print("Etat de départ")
    print(Etat_initial)
    print(Etat_actuel)
    print(temporaire)
    #
    #
    #
    #Fin de l'initialisation
    #
    #
    #
    print("Evolution des boules")


    while k <= Nombre_de_tours : #Première indentation : nombre d'évolutions


    print(Etat_actuel)
    print("temp =")
    print(temporaire)
    #On construit la variable "pourcentage de billes blanches"
    while m <= Taille_de_la_chaine - 1:
    Somme = Somme + Etat_actuel[m]
    m+=1

    #On construit la variable "pourcentage de différences"
    while n <= len(Etat_initial)-1:
    Differences = Differences + (temporaire[n]+Etat_initial[n])%2
    n+=1

    Pourcentage_blanches.append(100*Somme/(Taille_de_la_chaine))
    Pourcentage_differences.append(Differences*100/(Taille_de_la_chaine))

    #On fait tourner les billes et éventuellement changer leur couleur
    while l <= 2*len(Etat_actuel) :
    if l<= len(Etat_actuel)-1 :
    Etat_actuel[l] = (temporaire[l-1] + Marqueurs[l])%2
    l+=1
    elif l==len(Etat_actuel) :
    del(temporaire[:])
    temporaire.append(Etat_actuel[0])
    l+=1
    else :
    temporaire.append(Etat_actuel[l-len(Etat_actuel)-1])
    l+=1


    k+=1

    print(Pourcentage_blanches)
    print(Pourcentage_differences)

    L'objectif est de sortir les suites "pourcentages, le reste ne sert qu'à vérifier si le code marche. (un 1 représente une boule blanche, 0 une boule noire)
    Si vous le faites tourner, vous vous apercevrez qu'il ne fonctionne pas : durant les opérations d'évolution, il ne se passe rien, "temporaire" garde toujours la même valeur, et même la première étape d'évolution ne fonctionne pas correctement.

    Auriez vous une idée pour le dépanner?
    Merci d'avance !

  2. #2
    Expert confirmé

    Homme Profil pro
    Inscrit en
    Octobre 2008
    Messages
    4 307
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2008
    Messages : 4 307
    Par défaut
    Salut,

    Mets ton code entre des balises [code] parce que sans les indentations c'est peu lisible.

    Il n'y a pas erreur ici:
    temp ou temporaire ?

  3. #3
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2015
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Mai 2015
    Messages : 14
    Par défaut
    Oups désolé, voilà la version avec indentations :
    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
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
     
    #!/usr/bin/python
    # -*- coding: UTF-8 -*-
     
    Aleatoire = False
    Marqueurs = []
    Etat_initial = []
    Etat_actuel = []
    Taille_de_la_chaine = 20
    Nombre_de_tours = 5
    seuil = 20
    Somme = 0
    Pourcentage_blanches = []
    Pourcentage_differences = []
    Differences = 0
    temporaire = []
     
    i = 0
    j = 0
    k = 1
    l = 0 
    m = 0
    n = 0
    o = 0
     
    #Création des marqueurs
    while i <= Taille_de_la_chaine - 1 :
    	import random
    	r = random.randint(1,100)
    	i+=1 #incrémentation
     
    	if r < seuil :
    		Marqueurs.append(1)
    	else :
    		Marqueurs.append(0)
     
    print("Emplacement des marqueurs")		
    print(Marqueurs)
     
    if Aleatoire:
     
    		#Création de l'état initial aléatoire :
    	while j<= Taille_de_la_chaine - 1:
    		import random
    		r = random.randint(1,100)
    		j+=1 #incrémentation
     
    		if r < 50 :
    			Etat_initial.append(1)
    			Etat_actuel.append(1)
    			temporaire.append(1)
    		else :
    			Etat_initial.append(0)
    			Etat_actuel.append(0)
    			temp.append(0)
     
    else :
    	while j <= Taille_de_la_chaine - 1: 
    		j+=1
    		Etat_initial.append(1) #On crée une liste de boules blanches
    		Etat_actuel.append(1)
    		temporaire.append(1)
     
    print("Etat de départ")
    print(Etat_initial)
    print(Etat_actuel)
    print(temporaire)
    #
    #
    #
    #Fin de l'initialisation
    #
    #
    #
    print("Evolution des boules")
     
     
    while k <= Nombre_de_tours : #Première indentation : nombre d'évolutions
     
     
    	print(Etat_actuel)
    	print("temp =")
    	print(temporaire)
    	#On construit la variable "pourcentage de billes blanches"
    	while m <= Taille_de_la_chaine - 1:
    		Somme = Somme + Etat_actuel[m]
    		m+=1
     
    	#On construit la variable "pourcentage de différences"
    	while n <= len(Etat_initial)-1:
    		Differences = Differences + (temporaire[n]+Etat_initial[n])%2
    		n+=1
     
    	Pourcentage_blanches.append(100*Somme/(Taille_de_la_chaine))
    	Pourcentage_differences.append(Differences*100/(Taille_de_la_chaine))
     
    	#On fait tourner les billes et éventuellement changer leur couleur
    	while l <= 2*len(Etat_actuel) :
    		if l<= len(Etat_actuel)-1 :
    			Etat_actuel[l] = (temporaire[l-1] + Marqueurs[l])%2 
    			l+=1
    		elif l==len(Etat_actuel) :
    			del(temporaire[:])
    			temporaire.append(Etat_actuel[0])
    			l+=1
    		else :
    			temporaire.append(Etat_actuel[l-len(Etat_actuel)-1])
    		l+=1
     
     
    	k+=1
     
    print(Pourcentage_blanches)
    print(Pourcentage_differences)
    C'est une petite erreur en effet, mais je doute que cela vienne de là : j'ai effectué le changement "temp" en "temporaire" à la toute fin dans une tentative désespérée

  4. #4
    Expert confirmé

    Homme Profil pro
    Inscrit en
    Octobre 2008
    Messages
    4 307
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2008
    Messages : 4 307
    Par défaut
    Salut,

    Plusieurs choses:

    Tu peux supprimer ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    i = 0
    j = 0
    k = 1
    l = 0 
    m = 0
    n = 0
    o = 0
    Inutile en Python

    On importe les modules (ex: random) en début de script et pas à l'intérieur de toutes les boucles.

    Si je te suis bien, ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    	while m <= Taille_de_la_chaine - 1:
    		Somme = Somme + Etat_actuel[m]
    		m+=1
    est égal à cela:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
        Somme = sum(Etat_actuel[:Taille_de_la_chaine - 1])
    Lorsque le nombre d'iterations d'une boucle est connu, préfère for in à while

    Une fois simplifié ton code devient plus lisible:
    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
    63
    64
    65
    66
    67
    68
    69
    70
    71
     
    # -*- coding: UTF-8 -*-
     
    import random
     
    Aleatoire = False
    Marqueurs = []
    Etat_initial = []
    Etat_actuel = []
    Taille_de_la_chaine = 20
    Nombre_de_tours = 5
    seuil = 20
    Pourcentage_blanches = []
    Pourcentage_differences = []
    temporaire = []
    Differences = 0
     
    #Création des marqueurs
    for i in range(Taille_de_la_chaine - 1):
    	r = random.randint(1,100)
    	if r < seuil :
    		Marqueurs.append(1)
    	else :
    		Marqueurs.append(0)
     
    if Aleatoire:
    	for j in range(Taille_de_la_chaine - 1):
    		r = random.randint(1,100) 
    		if r < 50 :
    			Etat_initial.append(1)
    			Etat_actuel.append(1)
    			temporaire.append(1)
    		else :
    			Etat_initial.append(0)
    			Etat_actuel.append(0)
    			temporaire.append(0)
     
    else :
    	for j in range(Taille_de_la_chaine - 1):
    		Etat_initial.append(1)
    		Etat_actuel.append(1)
    		temporaire.append(1)
     
    print("Etat de départ")
    print(Etat_initial)
    print(Etat_actuel)
    print(temporaire)
    print("Evolution des boules")
     
    for k in range(Nombre_de_tours):
    	print(Etat_actuel)
    	print("temp =")
    	print(temporaire)
    	Somme = sum(Etat_actuel[:Taille_de_la_chaine - 1])
    	for n in range(len(Etat_initial)-1):
    		Differences = Differences + (temporaire[n]+Etat_initial[n])%2
     
    	Pourcentage_blanches.append(100*Somme/(Taille_de_la_chaine))
    	Pourcentage_differences.append(Differences*100/(Taille_de_la_chaine))
     
    	for l in range(2*len(Etat_actuel)):
    		if l <= len(Etat_actuel)-1 :
    			Etat_actuel[l] = (temporaire[l-1] + Marqueurs[l])%2 
    		elif l == len(Etat_actuel) :
    			del(temporaire[:])
    			temporaire.append(Etat_actuel[0])
    		else :
    			temporaire.append(Etat_actuel[l-len(Etat_actuel)-1])
     
    print(Pourcentage_blanches)
    print(Pourcentage_differences)
    À quoi sert if Aleatoire: ? Aleatoire est déclaré False au début et ne change pas.

    Pour le résultat j'obtiens ceci:
    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
     
    Etat de départ
    [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]
    [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]
    [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]
    Evolution des boules
    [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]
    temp =
    [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]
    [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 0, 1, 1, 1, 0]
    temp =
    [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 0, 1, 1, 1]
    [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, 0, 1, 0]
    temp =
    [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, 0, 1]
    [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 0, 1, 1, 1]
    temp =
    [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 0, 1, 1]
    [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 0, 1, 0, 0]
    temp =
    [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 0, 1, 0]
    [95.0, 75.0, 70.0, 75.0, 65.0]
    [0.0, 15.0, 35.0, 55.0, 75.0]

  5. #5
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2015
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Mai 2015
    Messages : 14
    Par défaut
    Salut !
    Je ne connaissais pas la boucle "for in", d'où mes boucles while (pas très élégantes, en effet...)
    D'ailleurs c'est de là que venait le problème : je ne réinitialisais pas les indices de sommation dans la boucle principale, je ne faisais donc l'évolution qu'une seule fois !

    La variable "Aléatoire" permet juste de choisir si on démarre d'une configuration avec 50% de boules blanches et 50% de boules noires ou d'une avec 100% de boules blanches sans avoir à remodifier le code.

    Merci beaucoup pour ton aide !

Discussions similaires

  1. Modèle mathématique et phénomène physique
    Par TopCao dans le forum Algorithmes et structures de données
    Réponses: 2
    Dernier message: 20/04/2011, 14h12
  2. Réponses: 1
    Dernier message: 13/09/2008, 07h01
  3. Réponses: 1
    Dernier message: 15/05/2007, 23h38
  4. Générer un modèle physique
    Par wekka dans le forum Rational
    Réponses: 3
    Dernier message: 22/01/2007, 18h54
  5. Logiciel de conception de modèle conceptuel et physique
    Par snoopy69 dans le forum Décisions SGBD
    Réponses: 2
    Dernier message: 05/10/2005, 10h30

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