Suite de Syracuse sur python (Graph)

Réponses à toutes vos questions de la 2nde à la Terminale toutes séries
dragzfx
Membre Naturel
Messages: 11
Enregistré le: 06 Fév 2020, 21:15

Suite de Syracuse sur python (Graph)

par dragzfx » 06 Fév 2020, 21:46

Salut,
Alors j'ai un TP/DM à rendre prochainement mais je suis bloqué dans la partie 1 depuis plus de 3 jours, j'ai cherché sur Internet des solutions possibles et je trouve pas, j'espère que quelqu'un peut m'aider. Mon problème est simple: comme vous pouvez le voir mon programme fonctionne pas en raison de plusieurs erreurs, j'ai probablement pas bien rempli les lignes 10, 11 et 13 (Voir photos). Il convient de noter que je doit créer un graphique (d'où l'importance de matplotlib ici). Le programme est Thonny> https://thonny.org/
TP photo > https://i.imgur.com/HgymcBf.jpg
Mon programme et erreurs > https://i.imgur.com/HgymcBf.jpg



infernaleur
Membre Irrationnel
Messages: 1071
Enregistré le: 20 Avr 2017, 18:45

Re: Suite de Syracuse sur python (Graph)

par infernaleur » 06 Fév 2020, 23:01

Salut,
le lien de ton travail est le même que le lien du sujet de mon côté tu peux modifier ?

dragzfx
Membre Naturel
Messages: 11
Enregistré le: 06 Fév 2020, 21:15

Re: Suite de Syracuse sur python (Graph)

par dragzfx » 07 Fév 2020, 12:33

infernaleur a écrit:Salut,
le lien de ton travail est le même que le lien du sujet de mon côté tu peux modifier ?

Ah désolé, j'ai pas mis le bon lien , bien que j'aie déjà résolu cette partie après plus de 3h de recherches sur Internet sur la programmation python. Mon programme (Pour la partie A) c'est le suivant : https://i.imgur.com/jV1oVIr.png
Par contre je suis encore une fois bloqué, dans la partie B on me demande d'écrire une fonction nb_sup_a (a, n) qui renvoie le nombre de termes supérieur à U0 = a parmi les n de la suite Syracuse. Logiquement, je sais que cette fonction doit avoir une apparence très similaire à celle à côté , mais je ne sais pas quelles sont les valeurs ou les instructions que je dois modifier :( j'aimerais pas passer encore 3 heures pour une fonction stupide qu'on a même pas vu en classe. Toute suggestion serait utile. Merci
Photo question: https://i.imgur.com/EQOUlm3.jpg
Je vous laisse le programme modèle (à mon avis) pour résoudre ce problème (faut modifier des trucs):
def affiche_nb_sup_a(a_max,n=50):
x = range(1, a_max + 1)
y = [nb_sup_a(a, n) for a in x]
plt.grid()
plt.bar(x, y, .2, color='b' )
plt.tittle("nombre de termes > u_O \n parmi \
les "+str(n)+" premiers")
plt.show()

GaBuZoMeu
Habitué(e)
Messages: 6019
Enregistré le: 05 Mai 2019, 10:07

Re: Suite de Syracuse sur python (Graph)

par GaBuZoMeu » 07 Fév 2020, 12:38

Peux-tu mettre tes programmes entre des balises "code" de la fenêtre d'édition des messages ?
Ça sera plus simple pour tout le monde !

dragzfx
Membre Naturel
Messages: 11
Enregistré le: 06 Fév 2020, 21:15

Re: Suite de Syracuse sur python (Graph)

par dragzfx » 07 Fév 2020, 13:06

GaBuZoMeu a écrit:Peux-tu mettre tes programmes entre des balises "code" de la fenêtre d'édition des messages ?
Ça sera plus simple pour tout le monde !

Bien sûr, voici le programme modèle:
Code: Tout sélectionner
def affiche_nb_sup_a(a_max,n=50):
    x = range(1, a_max + 1)
    y = [nb_sup_a(a, n) for a in x]
    plt.grid()
    plt.bar(x, y, .2, color='b' )
    plt.tittle("nombre de termes > u_O \n parmi \
les "+str(n)+" premiers")
    plt.show()

dragzfx
Membre Naturel
Messages: 11
Enregistré le: 06 Fév 2020, 21:15

Re: Suite de Syracuse sur python (Graph)

par dragzfx » 07 Fév 2020, 13:11

dragzfx a écrit:
GaBuZoMeu a écrit:Peux-tu mettre tes programmes entre des balises "code" de la fenêtre d'édition des messages ?
Ça sera plus simple pour tout le monde !

Bien sûr, voici le programme modèle:
Code: Tout sélectionner
def affiche_nb_sup_a(a_max,n=50):
    x = range(1, a_max + 1)
    y = [nb_sup_a(a, n) for a in x]
    plt.grid()
    plt.bar(x, y, .2, color='b' )
    plt.tittle("nombre de termes > u_O \n parmi \
les "+str(n)+" premiers")
    plt.show()

Et voici le programme de la partie A (Programmer la suite de Syracuse pour obtenir le graph)
Code: Tout sélectionner
from matplotlib import pyplot as plt
import numpy as np

def syracuse(a, n):
    """ liste des n premiers termes de Syracuse
    pour u_O = a
    """
    sy = [a]
    for i in range(n):
        if sy[-1] % 2 == 0:
            sy.append(sy[-1] // 2)
        else:
            sy.append(sy[-1] * 3 + 1)
    return(sy)

n = 50
while True:
    a = int(input("entier a = "))
    if a == 0:
        break
    else:
        plt.cla()
        plt.grid()
        plt.plot(range(n+1), syracuse(a, n),'o-')
        plt.show()

dragzfx
Membre Naturel
Messages: 11
Enregistré le: 06 Fév 2020, 21:15

Re: Suite de Syracuse sur python (Graph)

par dragzfx » 07 Fév 2020, 13:40

après avoir recherché plus d'informations sur la fonction nb_sup_a (a, n) (bien que je ne trouve pas trop d'informations) voici ce que j'ai fait, pouvez-vous me dire si cette fonction est logique ou au moins si elle est écrite correctement. merci.
Code: Tout sélectionner
def nb_sup_a(a, n):
    """ nombre de valeurs > a parmi les n premiers
    termes
    """
    return(len([x for x in syracuse(a, n) if x > a]))

GaBuZoMeu
Habitué(e)
Messages: 6019
Enregistré le: 05 Mai 2019, 10:07

Re: Suite de Syracuse sur python (Graph)

par GaBuZoMeu » 07 Fév 2020, 13:59

Ton programme marche bien.

Pour la fonction nb_sup_a(a, n), tu peux utiliser la liste produite par syracuse(a,n) et ensuite tu crées un compteur que tu initialises à 0 et incrémentes de 1 chaque fois que tu rencontres un entier >a en parcourant la liste.

Ta solution marche aussi

dragzfx
Membre Naturel
Messages: 11
Enregistré le: 06 Fév 2020, 21:15

Re: Suite de Syracuse sur python (Graph)

par dragzfx » 07 Fév 2020, 22:52

GaBuZoMeu a écrit:Ton programme marche bien.

Pour la fonction nb_sup_a(a, n), tu peux utiliser la liste produite par syracuse(a,n) et ensuite tu crées un compteur que tu initialises à 0 et incrémentes de 1 chaque fois que tu rencontres un entier >a en parcourant la liste.

Ta solution marche aussi

J'ai une autre petite question, les exercices 3 et 4 me demandent de localiser les valeurs de u_0 qui sont le maximum de la suite et puis ils disent que certaines de ces valeurs donnent une suite décroissante jusqu'à atteindre 1 pour la première fois et ils me demandent la particularité de ces valeurs. Pour les valeurs qui sont de u_0 qui sont le maximum de la suite j'ai trouvé: 27; 31; 47; 63; 71; 91 grâce au diagramme que j'ai programmé (voir programme diagramme), le problème c'est qu'aucune de ces valeurs donne une suite décroissante jusqu'à ce qu'elle atteigne 1 pour la première fois lorsque n = 50 (voir programme Syracuse pour n=50 car demandée dans la partie précédente).
Je pense que j'ai mal compris les consignes...

Programme diagramme:
Code: Tout sélectionner
from matplotlib import pyplot as plt
import numpy as np

def syracuse(a, n):
    """ liste des n premiers termes de Syracuse
    pour u_0 = a
    """
    sy = [a]
    for i in range(n):
        if sy[-1] % 2 == 0:
            sy.append(sy[-1] // 2)
        else:
            sy.append(sy[-1] * 3 + 1)
    return(sy)


def alti_max(a, n):
    """ altitude maximale et indice pour la suite
    de Syracuse de n termes avec u0 = a
    """
    sy = syracuse(a, n)
    m = max(sy)
    return(m, sy.index(m))


def affiche_syracuse(n):
    while True:
        a = int(input("entier a = "))
        if a == 0:
            break
        else:
            plt.cla() #efface le graphe courant
            plt.grid()
            plt.plot(range(n+1), syracuse(a, n),'o-')
            plt.show()


def nb_sup_a(a, n):
    """ nombre de valeurs > a parmi les n premiers
    termes
    """
    return(len([x for x in syracuse(a, n) if x > a]))

def affiche_nb_sup_a(a_max, n=50):
    x = range(1, a_max + 1)
    y = [nb_sup_a(a, n) for a in x]
    plt.grid()
    plt.bar(x, y, .2, color='b' )
    plt.title("nombre de termes > u_0 \n parmi \
les "+str(n)+" premiers")
    plt.show()


if __name__ == "__main__":
    affiche_nb_sup_a(100,n=50)

programme Syracuse pour n=50
Code: Tout sélectionner
from matplotlib import pyplot as plt
import numpy as np

def syracuse(a, n):
    """ liste des n premiers termes de Syracuse
    pour u_O = a
    """
    sy = [a]
    for i in range(n):
        if sy[-1] % 2 == 0:
            sy.append(sy[-1] // 2)
        else:
            sy.append(sy[-1] * 3 + 1)
    return(sy)

n = 50
while True:
    a = int(input("entier a = "))
    if a == 0:
        break
    else:
        plt.cla()
        plt.grid()
        plt.plot(range(n+1), syracuse(a, n),'o-')
        plt.show()

Rappel, Liens photo exercices https://i.imgur.com/EQOUlm3.jpg

Avatar de l’utilisateur
fatal_error
Modérateur
Messages: 6610
Enregistré le: 22 Nov 2007, 13:00

Re: Suite de Syracuse sur python (Graph)

par fatal_error » 07 Fév 2020, 23:42

slt,

jpense que tu t'es planté sur 27; 31; 47; 63; 71; 91
si tu print(syracuse(27,50))
tu obtiens
Code: Tout sélectionner
[27,---> 82 ---<, 41, 124, 62, 3...1132, 566]

et tu déduis que 27 n'est __pas__ le maximum de la suite

Les a qui sont max de ta suite, par définition sont ceux tq nb_sup_a(a,n) vaut 0 (idem il n'existe aucun élément de la suite supérieur à a)

Enfin pour te mettre sur la piste, tu as observé les cycles 4,2,1,2,1.. tu peux postuler que 16 va donner 16,8,4,2,1,2,1...
la vie est une fête :)

dragzfx
Membre Naturel
Messages: 11
Enregistré le: 06 Fév 2020, 21:15

Re: Suite de Syracuse sur python (Graph)

par dragzfx » 08 Fév 2020, 12:00

fatal_error a écrit:slt,

jpense que tu t'es planté sur 27; 31; 47; 63; 71; 91
si tu print(syracuse(27,50))
tu obtiens
Code: Tout sélectionner
[27,---> 82 ---<, 41, 124, 62, 3...1132, 566]

et tu déduis que 27 n'est __pas__ le maximum de la suite

Les a qui sont max de ta suite, par définition sont ceux tq nb_sup_a(a,n) vaut 0 (idem il n'existe aucun élément de la suite supérieur à a)

Enfin pour te mettre sur la piste, tu as observé les cycles 4,2,1,2,1.. tu peux postuler que 16 va donner 16,8,4,2,1,2,1...


Vous voulez donc dire que les valeurs qui sont le maximum de la suite sont les valeurs qui valent 0 dans mon diagramme? Par exemple, comme vous l'avez dit précédemment, 16 va donner 16,8,4,2,1,2,1 ... et sa particularité c'est qu'elle est décroissant jusqu'à ce qu'elle atteigne 1, aussi son temps de vol est 0 alors, car elle ne dépasse jamais 16. Si ce n'est pas correct, vous pourriez me donner un exemple d'une valeur maximale affichée dans mon diagramme (voir lien diagramme ), parfois un exemple vaut mille explications. Et je suis désolé si je suis très contrarié mais nous n'avons pas encore vu de programmation en python ou les suites, ce DM n'est qu'un bonus
DIAGRAMME a_max inférieur à 100: https://i.imgur.com/vQeBuSs.png

Remarque: le code du programme pour le diagramme est le même que celui que j'ai publié précédemment.

Avatar de l’utilisateur
fatal_error
Modérateur
Messages: 6610
Enregistré le: 22 Nov 2007, 13:00

Re: Suite de Syracuse sur python (Graph)

par fatal_error » 08 Fév 2020, 15:37

Vous voulez donc dire que les valeurs qui sont le maximum de la suite sont les valeurs qui valent 0 dans mon diagramme

oui.
c'est mieux si tu dis les points d'ordonnée nulle.

aussi son temps de vol est 0

peux tu rappeler ce qu'est le temps de vol?
la vie est une fête :)

dragzfx
Membre Naturel
Messages: 11
Enregistré le: 06 Fév 2020, 21:15

Re: Suite de Syracuse sur python (Graph)

par dragzfx » 08 Fév 2020, 16:25

[/quote]
peux tu rappeler ce qu'est le temps de vol?[/quote]
Je voulais dire la durée de vol en altitude ou temps de vol en altitude, dans l'exercice, la durée du vol en altitude correspond au plus petit indice n tel que U_n < U_0, par example, la suite U_0=23 donne 23 - 70 - 35 - 106 - 53 - 160 - 80 - 40 - 20 - 10 - 5 - 16 - 8 - 4 - 2 - 1, donc sa durée de vol en altitude est de 7 (la partie noire).
Dans notre cas U_0=16 donne 16 - 8 - 4 - 2 - 1, aucune valeur n'est supérieure à 16, donc son temps de vol en altitude est de 0.

Merci pour l'aide

Avatar de l’utilisateur
fatal_error
Modérateur
Messages: 6610
Enregistré le: 22 Nov 2007, 13:00

Re: Suite de Syracuse sur python (Graph)

par fatal_error » 08 Fév 2020, 17:12

ben, dans ce cas là, non alors.
Dans ta suite 23 - 70 - 35 - 106 - 53 - 160 - 80 - 40 - 20 - 10, la première valeur (strictement) inférieure à 23, c'est 20.
20 correspond à n = 8
Le temps de vol en altitude est donc 8.

Pour u_0=16,
16 - 8 - 4 ...
La première valeur strictement inférieure à 16, c'est 8, qui correspond à n = 1.
Le temps de vol en altitude est donc 1.

mais dans tous les cas je pense pas que ca soit la bonne piste.

Je pense que tu as compris la question 3 (on cherche juste a tq nb_sup(a,n) = 0)
Concernant la question 4, juste regarder u_0 = 4, u_0 = 8, u_0 = 16, ...
la vie est une fête :)

dragzfx
Membre Naturel
Messages: 11
Enregistré le: 06 Fév 2020, 21:15

Re: Suite de Syracuse sur python (Graph)

par dragzfx » 08 Fév 2020, 18:50

J'ai pensé exactement comme vous au début, mais apparemment ce n'est pas le cas, regardez la petite explication du professeur Yvan Monka (l'explication commence dans la minute 5:50 ) lien: https://youtu.be/aRe4ARtQiJY
Vous pouvez également voir cette image: https://i.imgur.com/AOrGplK.png
De toute façon je ferai comme vous l'avez indiqué, je sais que ces exercices sont simples mais le manque d'explications et connaissances les rend très difficiles.

Avatar de l’utilisateur
fatal_error
Modérateur
Messages: 6610
Enregistré le: 22 Nov 2007, 13:00

Re: Suite de Syracuse sur python (Graph)

par fatal_error » 08 Fév 2020, 19:26

conclusion: u(n+1) <= u0 c'est pas pareil que un < u0 (spécifié dans ton livre)
Ya juste un problème de définition sur le temps de vol en altitude, il suffit de se tenir à la définition qui t'est donnée.

ps: ya pas besoin de me vousvouyer, je suis pas professeur ;)
la vie est une fête :)

 

Retourner vers ✎✎ Lycée

Qui est en ligne

Utilisateurs parcourant ce forum : Aucun utilisateur enregistré et 112 invités

Tu pars déja ?



Fais toi aider gratuitement sur Maths-forum !

Créé un compte en 1 minute et pose ta question dans le forum ;-)
Inscription gratuite

Identification

Pas encore inscrit ?

Ou identifiez-vous :

Inscription gratuite