Centre de gravité

Bonsoir
Je bloque sur cet exo e python, je ne sais pas comment commencer et comment le formaliser
Écrivez une fonction qui indique, étant donnée une liste de points de l’espace, où est placé le centre de gravité de ces points, en supposant qu’ils ont tous la même masse. Chaque point de l’espace est une séquence de 3 coordonnées. En conséquence, une liste de points de l’espace est une séquence de séquences.

Merci de m’aider

Tu cherches juste les moyennes des coordonnées, non ?

(ou, si la question suivante s’affranchit de l’hypothèse uni-masse, ce que tu cherches n’est rien d’autre qu’un barycentre/centroïde.
Je ne sais pas pourquoi il est devenu à la mode d’éviter ce mot..)

L’objectif semble être d’utiliser les sequences en Python:

  • la fonction renvoie une séquence


  • elle admet en entrée une séquence de séquences

à l’intérieur elle traite des séquences:

  • une sous fonction qui renvoie le Nombre d’éléments d’une séquence


  • une sous fonction qui fait la somme de séquences (à toi de la définir)


  • la division d’une séquence par un entier (à définir aussi)

En gros essaye de travailler le plus possible sur des entités séquence.

xelectronx, post:4, topic:133186 a écrit:

L’objectif semble être d’utiliser les sequences en Python:

  • la fonction renvoie une séquence


  • elle admet en entrée une séquence de séquences

à l’intérieur elle traite des séquences:

  • une sous fonction qui renvoie le Nombre d’éléments d’une séquence


  • une sous fonction qui fait la somme de séquences (à toi de la définir)


  • la division d’une séquence par un entier (à définir aussi)

En gros essaye de travailler le plus possible sur des entités séquence.

Oui , sauf que je ne vois pas comment formaliser ça en code python

Voilà quelque chose de perfectible.
Je te laisse de soin de généraliser en dimension « n » et de gérer les valeurs impossibles…

def InitPoint(x, y, z):
     return x, y, z

def CntCoordPoint (M):
    return len(M)

def SumPoints (N):
    x=0 ;y=0 ;z=0
    for I in N:
        x += I[0]; y += I[1]; z += I[2]
    return (x, y, z)

def DivPoints (N, d):
    return (N[0]/d, N[1]/d, N[2]/d)

def AffNuage (N):
    for I in N:
        print (I)

def Barycentre (N):
    return DivPoints(SumPoints (N), CntCoordPoint (N))

# Un point est une séquence de 3 coordonnées
A = InitPoint(12.3,-5.4,0.0258)
B = InitPoint(-6.2,7.0,0.52)
C = InitPoint(9.5,10,-8.6)
D = InitPoint(9, -6, 0.852)
E = InitPoint(-5, -2, 7)
# un nuage de points est une séquence de séquence
NuagePoints = (A, B, C, D, E)


AffNuage (NuagePoints)
print ("Barycentre des Points du nuage = ", Barycentre (NuagePoints))

PS Question subsidiaire :
Soit un ensemble de points, calculer les barycentres de sous-ensembles distincts de l’ensemble initial (dont la réunion forme l’ensemble) et calculer le barycentre des barycentres. Refaire l’exo pour une partition différente de l’ensemble initial. Conclure.

Si tu construits un array numpy de dimension 3xn, la fonction numpy.mean permet de renvoyer la moyenne sur n’importe quel axe (ici l’axe 1, celui des 10 points et non celui des 3 coordonnées) :

import numpy as np
P = np.random.rand(3,10)
print(np.mean(P, 1))

Personne ne parle de « séquences » en python…
"def InitPoint(x, y, z):
return x, y, z

def CntCoordPoint (M):
return len(M)"

c’est une blague? :laughing:

profrogue, post:8, topic:133186 a écrit:

Personne ne parle de « séquences » en python…

A part peut-être la documentation officielle :

profrogue, post:8, topic:133186 a écrit:

c’est une blague? :laughing:

Peut être, reste à savoir d’où sort l’exo ?

GrosGillouDu92 : ha oui en effet. Donc un machin sur lequel on peut itérer, qui a getittem « efficace » et qui sait renvoyer sa longeur. La notion ne sert pas à grand chose tellement elle est générique. D’ailleurs c’est marrant, quand on google « python sequence », on trouve plein de site qui la comprennent mal.
Bref cette notion n’a pas d’intéret quand on apprend python.

La réponse attendue est proche, je pense, de ça :

def barycentre(liste_points):
    """Renvoie les coordonnées du barycentre"""
    n = len(liste_points)
    somme_x = 0
    somme_y = 0
    somme_z = 0
    for (x, y, z) in liste_points:
        somme_x += x
        somme_y += y
        somme_z += z
    return somme_x/n, somme_y/n, somme_z/n

En exercice, il est possible de remplacer les trois variables somme_ par une liste de trois valeurs, par exemple.