Inscription / Connexion Nouveau Sujet
Niveau première
Partager :

programme de gammes pythagoriciennes

Posté par
alice18
29-04-21 à 23:59

bonjour, j'ai un dm d'es-maths mais ne comprend pas comment faire avec le prpgramme python... voici l'énoncé:
On veut créer un programme python qui, pour un nombre de quinte n donné (n>ou= a 2)  retourne la liste des fréquences de la gamme pythagoricienne associée.
Comment modifier l'algorithme obtenu pour que la gamme de n notes boucle presque parfaitement à 10-p près avec p entier naturel. Quelle valeur de n trouve-t-on pour p = 2 ? pour p = 3 ?
merci de votre aide

programme de gammes pythagoriciennes

Posté par
mathafou Moderateur
re : programme de gammes pythagoriciennes 30-04-21 à 09:24

Bonjour

à moins d'être des spécialistes en musicologie, il est nécessaire de donner la partie de l'énoncé (tout ce qui est avant cette question-ci) qui définit ce qu'est une "gamme Pythagoricienne " !!

(et aussi ce que tu as fait, essayé, qu'est ce qui te bloque précisément, les résultats de questions précédentes, quelles formules ont été obtenues etc)

Posté par
alice18
re : programme de gammes pythagoriciennes 30-04-21 à 14:34

effectivement, désolée je viens tout juste de m'inscrire et je ne connaissais pas toutes modalités !
voici l'énoncé :
Une octave est un intervalle musical dans lequel le rapport des fréquences entre l'extrémité et l'origine est égal à 2. On décide ici de simplifier les calculs en fixant à 1 la fréquence f0 de l'origine de l'octave, qui correspond à une note de référence (440 Hz pour le La du diapason). L'octave est donc représentée par l'intervalle musical [1 ; 2]. Après le rapport 2 qui définit l'octave, le rapport le plus simple est la quinte pure, rapport égal à 3/2. L'échelle pythagoricienne est fondée sur ces deux seuls intervalles, l'octave et la quinte pure, à partir desquels sont construites toutes les notes de la gamme, selon le cycle des quintes.

voici les questions :
1. Proposer un algorithme qui affiche en sortie, pour un nombre de quintes n donné, la liste des fréquences de la gamme pythagoricienne associée.
2. Comment modifier l'algorithme obtenu pour que la gamme de n notes boucle presque parfaitement à 10-p près avec p entier naturel. Quelle valeur de n trouve-t-on pour p = 2 ? pour p = 3

voici ce que j'ai fait:
j'ai pensé à créer une suite géométrique qui pour un nombre de quintes donné, associait la fréquence: Un= (3/2)**n  car une quinte est un rapport de 3/2 entre deux fréquences. Je ne sais pas si mon intuition est bonne, puisque la consigne est de créer une fonction python qui affiche en sortie, pou nombre de quintes donné n, la liste des fréquence de la gamme pythagoricienne associée...
merci par avance

Posté par
alice18
re : programme de gammes pythagoriciennes 30-04-21 à 14:39

j'ai trouvé un schéma pour expliquer comment fonctionne les quintes. je ne comprends pas et je ne sais pas comment faire pour créer un programme python qui pourrait répondre à la question...
merci

programme de gammes pythagoriciennes

Posté par
mathafou Moderateur
re : programme de gammes pythagoriciennes 30-04-21 à 15:06

OK, là on sait où on va et de quoi on parle.
dans ton 1er message tu donnais un programe "à trous" pour donner les valeurs de la gamme
l'as tu complété ?

"On décide ici de simplifier les calculs en fixant à 1 la fréquence f0 de l'origine de l'octave"
donc L=[1] le premier élément de la liste est 1

ensuite
un calcul sur a puis L.append(a) va ajouter la valeur de a à la fin de la liste
comment est calculée cette valeur d'après les explications sur la succession des notes ?

ensuite (une fois ce programme là au point !)

Comment modifier l'algorithme obtenu pour que la gamme de n notes boucle presque parfaitement à 10-p près

sans rien modifier, on peut l'utiliser avec des valeurs diverses de n et "lire" la dernière valeur de la liste jusqu'à avoir entre 1 et 1,01 (à 10-2 ou 1.001 à 10-3)
ou entre 0.99 et 1 (resp. 0.999 et 1) etc

ce procédé "manuel" va te donner des idées pour créer une boucle sur n

Posté par
mathafou Moderateur
re : programme de gammes pythagoriciennes 30-04-21 à 15:09

Citation :
ou entre 0.99 et 1 (resp. 0.999 et 1) etc
oups

entre 1.99 et 2
ou 1.999 et 2 etc

Posté par
alice18
re : programme de gammes pythagoriciennes 30-04-21 à 15:28

merci pour votre réponse.
si j'ai bien compris ce que vous m'avez dit, je dois effectuer un calcul sur a ? si c'est le cas, vu qu'on parle de quintes, le calcul à effectuer sur a serait a*3/2 ?

Posté par
mathafou Moderateur
re : programme de gammes pythagoriciennes 30-04-21 à 15:36

presque

a = quelque chose qui ne dépend pas de a encore inconnu à ce moment !
mais du dernier élément de la liste qui s'appelle L[??]

donc cette ligne là sera : a = L[??]*3/2

Posté par
alice18
re : programme de gammes pythagoriciennes 30-04-21 à 15:40

d'accord, si c'est a=L[??]*3/2, alors ca serait la liste de toutes les fréquences qu'il faut mettre à la place de "??" ?

Posté par
alice18
re : programme de gammes pythagoriciennes 30-04-21 à 15:42

ou alors, vu que on sait que L=1, ca serait la dernière fréquence de la liste ? donc par rapport au schéma sur les quintes, ca serait 243/128 ?

Posté par
mathafou Moderateur
re : programme de gammes pythagoriciennes 30-04-21 à 15:48

mais non, la dernière trouvée seulement !

du dernier élément de la liste

le premier coup c'est L[0], qui vaut 1 et on va donc calculer a = 1* 3/2 = 3/2

le deuxième coup ce sera L[1] qu'on aura calculé le coup d'avant et mis dans la liste : [1, 1.5]
on va donc calculer a = 1.5 * 3/2 =...
etc

donc par quoi de variable faut il remplacer ces "??" ?

Posté par
alice18
re : programme de gammes pythagoriciennes 30-04-21 à 15:54

ah d'accord ! il faudrait donc remplacer ?? par:
(a-1)* 3/2 ? puisque ce serait la valeur du nombre précédant a multiplié par 3/2 non ?

Posté par
mathafou Moderateur
re : programme de gammes pythagoriciennes 30-04-21 à 16:10

le nombre qui est dans la liste L
L[0], L[1], L[2] etc

alors que i varie justement de 0 à etc
c'est L[i] écrit comme ça

a =L[i]*3/2

j'ai l'impression que tu "découvres" ce que sont des listes en Python et comment ça s'utilise ...
et même pire que tu as des problèmes pour comprendre comment marchent des variables en général
écrire :

a = (a-1)* 3/2 alors que la valeur de a est encore inconnue ??? ça va donner quoi comme résultat ?
un crash...

Citation :
a = quelque chose qui ne dépend pas de a encore inconnu à ce moment !
mais du dernier élément de la liste


et puis, "a-1" n'est pas la valeur précédente (supposée connue donc) mais la valeur précédente à laquelle on retranche 1 !
premier coup : crash, la valeur de a est inconnue,
en supposant même que on obtienne 1.5

deuxième coup : a-1 = 1.5 -1 = 0.5 et ce serait ce 0.5 qu'on doit multiplier par 3/2 ??

Posté par
alice18
re : programme de gammes pythagoriciennes 30-04-21 à 16:18

non effectivement, nous venons de commencer les listes sur python, donc j'ai encore du mal...
je ne comprends juste pas pourquoi ca serait "i" et qu'est ce qu'il signifie.

Posté par
mathafou Moderateur
re : programme de gammes pythagoriciennes 30-04-21 à 16:37

def cyclepytha(n):
    L=[1]
    for i in range(n):
        a=L[i]*3/2
        if a>=2:
            a=...
        L.append(a)
    return L


i c'est le compteur qui prend successivement les valeurs 0, 1, 2 ... n-1 (n valeurs en tout)
la première fois dans la boucle i = 0
on prend L[0] qui vaut ce qu'on y a mis au départ
au départ la liste L contient un seul élément L[0] qui vaut 1 ("f0")

les éléments d'une liste sont extraits en écrivant L[indice] avec indice qui varie de 0 à la taille de la liste moins 1

on multiplie ça par 3/2 pour obtenir la fréquence suivante a = 1.5 que l'on met dans la liste à la fin de cette liste (L.append)
cette liste contient donc maintenant deux éléments : [1, 1.5]
que l'on peut extraire comme L[0] qui vaut toujours 1 et L[1] qui vaut 1.5

à la deuxième boucle i vaut 1
ça tombe bien, on veut justement extraire le L[1] qui vaut 1.5
celui qu'on vient de calculer
le suivant sera donc L[i] * 3/2 = L[1] * 3/2
etc

Posté par
alice18
re : programme de gammes pythagoriciennes 30-04-21 à 16:45

merci beaucoup, c'est bien plus clair, je commence à comprendre comment fonctionne le langage python pour cet exercice.
mais comment faut-il compléter le deuxième trou?
si je comprends bien, on nous dit que si a est supérieur ou égal à deux, alors on doit dire quelle valeur va prendre a. Or dans la question il me semble que le nombre n de quinte n'est pas précisé, il est dit " pour un n de quintes donné, je devrai donc remplacer 2 par n ?
et si c'est le ac, comment dois-je compléter la suite ?
merci de votre réponse

Posté par
mathafou Moderateur
re : programme de gammes pythagoriciennes 30-04-21 à 16:49

dans le dessin parfaitement clair que tu as donné à 14:39 que fait on du 9/4 ? (qui est > 2)

Posté par
alice18
re : programme de gammes pythagoriciennes 30-04-21 à 17:06

9/4 est supérieur à 2 et se trouve dans la deuxième octave. d'après l'énoncé, une octave est une intervalle entre deux sons de rapport 2. or si j'ai bien compris, comme il ne se situe pas dans la première octave, mais dans la deuxième vu que 9/4> 2 il va falloir créer une deuxième boucle pour lorsque n>2 c'est ça ?
cela veut dire qu'il faudrait écrire:
a=L[i]*1/2  ?

Posté par
mathafou Moderateur
re : programme de gammes pythagoriciennes 30-04-21 à 17:14

tu ne comprends pas ce qui est fait dans ce graphique

le 9/4 on ne le garde pas, on le "ramène" dans la 1ère octave en le multipliant par 1/2
et c'est le 9/8 la vraie note.
la succession des notes c'est les flèches bleues
1, 3/2, 9/8, etc (et rien que celles là)

Posté par
alice18
re : programme de gammes pythagoriciennes 30-04-21 à 17:20

d'accord. mais alors, si on ramène les notes qui sont dans la deuxième octave en les multipliant par 1/2, c'est ce que l'on doit écrire dans la deuxième trou ? puisqu'il faut les ramener dans la première octave...
je ne comprend pas, si l'on ne doit pas écrire a=L[i]*1/2 dans le deuxième trou, doit ont ne pas les garder ? que doit-on écrire alors ?
merci

Posté par
mathafou Moderateur
re : programme de gammes pythagoriciennes 30-04-21 à 17:20

ah si, tu comprenais ,
mais tu le traduis mal (tu te mélanges les pinceaux dans les variables)

L[i] c'est la valeur précédente (3/2 !!)
à ce moment (dans le "si a > 2") le 9/4 il est dans a et rien que dans a
donc c'est tout simplement a = a/2

Posté par
alice18
re : programme de gammes pythagoriciennes 30-04-21 à 17:35

effectivement je viens de comprendre... j'ai l'impression qu'il va falloir m'améliorer en python ! merci beaucoup en tout cas.
encore une question, par rapport à votre réponse à la question 2, on serait pas obliger de modifier l'algorithme, mais si nous devons le modifier, qu'est-ce que l'on devrait faire ?
merci

Posté par
mathafou Moderateur
re : programme de gammes pythagoriciennes 30-04-21 à 17:48

question 2 : bein si, il va falloir le modifier,
parce que des tas d'essais à la main , et de comparaisons de valeurs à la main , ça ne va pas le faire

ça donne juste en idée du but à atteindre

il va falloir faire une boucle sur n
une boucle tant que (while)
tant que la dernière valeur obtenue est "loin" de 1 et de 2

ça donnerait le squelette :

def bouclepytha(p):
    L=[ ?? ]
    n = 1
    # tant que la dernière valeur est encore loin de 1 ou de 2 :
    while  ???? :
        a=L[n]*3/2
        if a>=2:    # ça c'est pareil : ramener à l'octave
            a=a/2
        L.append(a)
        n = n+1
    return n

Posté par
alice18
re : programme de gammes pythagoriciennes 30-04-21 à 18:05

d'accord. cela veut-il dire que la boucle while, donc que l'opération doit se répéter tant que la dernière valeur obtenue est loin de 1 et 2 ?
il faudrait donc mettre
while a> ou a< 1 (ou) 2
afin que la boucle continue de calculer jusqu'a atteindre 1 ou 2 ?
et ici, quelle serait l'idée pour L[???] ?
merci

Posté par
mathafou Moderateur
re : programme de gammes pythagoriciennes 30-04-21 à 18:47

la première valeur est 1
elle n'est pas "loin de 1 et de 2"
donc l'initialisation de la liste ne peut pas être juste L = [1] (la seule valeur 1)
ça ne marcherait pas car la dernière (et la seule) valeur dans la liste serait 1
elle est déja "près" (et même égale ...) de 1
on s'arrêterait instantanément.

attention à ne pas confondre :
[ a, b , c] qui est une liste
la variable L qui est ici ici une liste, contenant tout un tas de valeurs,
ou une seule : [1]
ou même aucune : [ ]
l'initialisation de cette variable à une liste (de 0, 1 ou plusieurs éléments
L = [ ] liste vide
L = [3] liste de un élément qui vaut 3
L =[ a, b, c] liste de 3 éléments qui valent a, b et c (les valeurs qu'ont à cet instant les variables a, b, c)
etc
et L[ n] qui est l'accès à l'élément de rang n de la liste
par exemple si on a initialisé la liste L par L= [1, 4, 9, 16]
L[0} vaut 1, L[2] vaut 9 etc

il y a aussi des fonctions de modifications de la liste
par exemple L.append(..) qui ajoute un élément supplémentaire à la fin de la liste
si L = [1, 4, 9, 16]
L.append(35) va ajouter un élément et la liste deviendra [1, 4, 9, 16, 35]

et d'autres fonctions ou opérations de modifications de liste, voir la doc Python

quant à "près de", l'énoncé lui même dit "à 10-p près"
c'est à dire que si p = 2 par exemple,
"près de 1" ca veut dire entre 1 et 1.01 car 10-2 = 0.01
et "près de 2" entre 1.99 et 2

donc des inégalités dans le test du while
inégalités qui feront intervenir le paramètre d'entrée p !
et sans se tromper dans le sens des inégalités pour une boucle while :

tant que on n'est pas près de ..

Posté par
alice18
re : programme de gammes pythagoriciennes 30-04-21 à 19:33

d'accord! donc comme on doit rapprocher au maximum a de 10**-p, il faut que la boucle calcule tant que a n'est pas proche ou égal à a.
il faut donc écrire:
while a!=10**-p
c'est cela ?

Posté par
alice18
re : programme de gammes pythagoriciennes 30-04-21 à 19:34

*  tant que a n'est pas proche ou égal à 10**-p  je voulais dire

Posté par
mathafou Moderateur
re : programme de gammes pythagoriciennes 30-04-21 à 20:07

mais qu'est ce que a ?
toujours le même problème : la première fois a n'a pas de valeur,
il n'est donc pas possible de le comparer à quoi que ce soit.

"la dernière valeur" elle n'est pas dans a
a est une variable de travail qui sert à calculer des éléments de la liste
elle est dans un élément de L
lequel ?

et puis il faut traduire correctement ce que veut dire "pas près de "
au besoin faire un dessin d'intervalles sur la droite des réels :
programme de gammes pythagoriciennes
quelle inégalité mathématique traduit le fait qu'une valeur x est dans le vert ?
(c'est à dire pour que le test du while reponde "true", "vrai, on continue"

Posté par
alice18
re : programme de gammes pythagoriciennes 30-04-21 à 20:24

une valeur absolue ?

Posté par
alice18
re : programme de gammes pythagoriciennes 30-04-21 à 20:27

ou alors plutôt une intervalle

Posté par
mathafou Moderateur
re : programme de gammes pythagoriciennes 30-04-21 à 20:30

un intervalle oui
lequel (écrit mathématiquement) et comment le traduire par des inégalités ?

Posté par
alice18
re : programme de gammes pythagoriciennes 30-04-21 à 20:34

ce serait ]1+10**-p ; 2-10**-p[
non?

Posté par
alice18
re : programme de gammes pythagoriciennes 30-04-21 à 20:36

et en traduisant par des inégalités, ce serait
1+10**-p<a< 2-10**-p
?

Posté par
mathafou Moderateur
re : programme de gammes pythagoriciennes 30-04-21 à 21:06

oui pour les inégalités

mais ce n'est toujours pas a   que l'on doit teste
deja dit et je répète : au moment du premier passage sur l'instruction "while", a   n'a aucune valeur et on ne peut pas faire un test dessus
a   ne prendra des valeurs que plus tard.

les fréquences, elles sont dans la liste L et nulle part ailleurs
en particulier celles qu'on y a mises lors de l'initialisation
L = [ ...] au tout début

relire ce que j'en ai dit

Citation :
la première valeur est 1
elle n'est pas "loin de 1 et de 2"
donc l'initialisation de la liste ne peut pas être juste L = [1] (la seule valeur 1)
ça ne marcherait pas car la dernière (et la seule) valeur dans la liste serait 1
elle est déja "près" (et même égale ...) de 1
on s'arrêterait instantanément.

la 1ere valeur que l'on peut tester est la valeur suivante 1.5

donc que doit on mettre dans la liste au départ ? combien d'éléments au départ ?
que vient faire n là dedans , pourquoi n = 1 et pas n = 0 au départ ?
quel est "le dernier élément de la liste", écrit "L[quoi]" ?

Posté par
alice18
re : programme de gammes pythagoriciennes 30-04-21 à 21:23

c'est donc L=[i] ?

Posté par
alice18
re : programme de gammes pythagoriciennes 30-04-21 à 21:27

soit
while   1+10**-p< L=[i]< 2-10**-p

Posté par
mathafou Moderateur
re : programme de gammes pythagoriciennes 30-04-21 à 21:41

??
il manque deux "trous"
l'initialisation de la liste L = [ ...... ]
L = [ i ] ne va pas marcher : i n'a aucune valeur
(et il n'y a même plus de variable i du tout)
l'initialisation c'est avec des valeurs numériques

dans le 1er programme on mettait au départ une seule valeur, la valeur 1 :
L = [1]
maintenant :

Citation :
la 1ere valeur que l'on peut tester est la valeur suivante 1.5
donc que doit on mettre dans la liste au départ ? combien d'éléments au départ ?


ensuite le deuxième trou c'est la condition exacte dans le while :
      while 1+10**(-p) < ???? < 2-10**(-p)


et j'ai encore l'impression que tu mélanges deux choses

mettre quelque chose dans la liste au départ
L = [ des choses ]

et utiliser la valeur d'un des éléments de la liste (pour le tester, faire des calculs dessus etc) :
L[ indice ] dans une expression de calcul ou de test

Posté par
alice18
re : programme de gammes pythagoriciennes 30-04-21 à 21:55

faut-il donc mettre 10**-p ?
sinon je ne vois pas ...

Posté par
mathafou Moderateur
re : programme de gammes pythagoriciennes 30-04-21 à 22:17


solution avec des commentaires
médite et cherche à comprendre les bases de la programmation (que ce soit en Python ou autre)
la notion de variable et d'opérations sur les variables,
les affectations : variable = valeur , variable = calcul
les tests ...
les listes, groupes de données tableaux etc

# fonction renvoyant le nombre de notes avant
# de revenir à 10**(-p) près de la 1ère
#
def bouclepytha(p):
    # on ne commence que à partir de L[1] = 1.5
    # car L[0] = 1 est déja = 1, on s'arrêterait immédiatement !
    L = [1, 3/2] # les deux  premières valeurs
    n = 1 # la dernière valeur de la liste c'est L[n] = L[1] = 1.5
    # tant que la dernière valeur est encore loin de 1 ou de 2
    while 1+10**(-p) < L[n] < 2-10**(-p):
        # L[n] est le dernier élément de la liste
        a = L[n]*3/2
        if a >= 2:
            a = a/2
        L.append(a)
        n = n+1
        # ici on a encore L[n] qui est le dernier élément (nouveau) de la liste
        # "invariant de boucle" : c'est vrai au début de chaque boucle
        #  c'est vrai avant de reboucler
    return n, L[n] # renvoie aussi la dernière valeur
# on pourrait retourner n et la liste L complète ; return  n, L
# mais ça fait beaucoup trop de valeurs
ou seulement n : return  n mais avoir la dernière valeur est intéressant


bonne nuit.

Posté par
alice18
re : programme de gammes pythagoriciennes 30-04-21 à 23:44

merci beaucoup pour votre aide. les commentaires m'ont bien permis de comprendre comment j'aurais dû faire et à comprendre mes erreurs. je vais m'entraîner davantage sur python. encore merci, bonne nuit



Vous devez être membre accéder à ce service...

Pas encore inscrit ?

1 compte par personne, multi-compte interdit !

Ou identifiez-vous :


Rester sur la page

Inscription gratuite

Fiches en rapport

parmi 1675 fiches de maths

Désolé, votre version d'Internet Explorer est plus que périmée ! Merci de le mettre à jour ou de télécharger Firefox ou Google Chrome pour utiliser le site. Votre ordinateur vous remerciera !