Partage
  • Partager sur Facebook
  • Partager sur Twitter

Devoir Python

Sujet résolu
14 novembre 2017 à 9:05:34

Bonjour, j'ai un programme a faire mais je ne sais pas comment m'y prendre

Le profil de la rampe d’une piste de skate-board peut être modélisé par le tracé de la courbe représentant la fonction définie sur l'intervalle [0 ;2] par :

f(x)=1/x+1

On souhaite déterminer approximativement la longueur de ce profil : pour cela on peut calculer et additionner les longueurs des deux segments [M0M1] et [M1M2] dessinés ci-dessous.
schéma d'une rampe
1) Ecrire une fonction longSeg qui prend pour paramètres les abscisses a et b de deux points de la rampe et qui retourne la longueur du segment correspondant. Tester cette fonction.
Note : de manière générale, on teste toutes les fonctions écrites et dans tous les cas possibles.
Utiliser cette fonction pour calculer une première approximation de la longueur de la rampe en ajoutant les longueurs des deux segments dessinés ci-dessus.
Ajouter un docstring à cette fonction, par exemple """cette fonction prend pour paramètres les abscisses a et b de deux points de la rampe et retourne la longueur du segment correspondant""".
2) Pour affiner ce calcul de longueur, on augmente le nombre de segments. Au lieu d'utiliser deux segments, on va maintenant utiliser n segments : on place donc un point M0 comme précédemment, puis n points nommés M1, M2,...., Mn, comme sur la figure ci dessous :
schéma d'une rampe
On appelle x1, x2,...., xn=2 les abscisses des points M1, M2,....,Mn.
On va apprendre à programmer de manière progressive : on veut calculer une longueur approximative de la rampe en utilisant ces n segments, mais on va commencer par des résultats utiles, mais plus simples.
On va appeler cette fonction longRampe. Elle prend comme paramètre n, le nombre de segments.
a) Dans un premier temps on va programmer cette fonction pour qu'elle affiche simplement les abscisses des points M0, M1,....,Mn-1, c'est à dire les abscisses des points origine de chacun des segments avec un petit message du type "l'abscisse de l'origine du segment i est :". (i devra évidemment valoir successivement 1, 2...).
Tester la correction des résulats à l'aide d'un petit programme.
b) Note : on peut utiliser la fonction longSeg dans la fonction longRampe.
Modifier la fonction pour qu'elle affiche la longueur de chacun des n segments et vérifier !
c) Modifier alors la fonction pour qu'elle calcule une approximation de la longueur de la rampe.
Tester : vous devez retrouver, pour n=2, le résultat de la question a).
Ajouter un docstring à cette fonction.
d) Ecrire un programme utilisant cette fonction et qui affiche la longueur obtenue pour n=10, 20, 30,....,100.
e) Conjecturer la longueur de la rampe à 0.0001 près.
voilà ce que j'ai fait
def f(x):
    x=(1/(x+1))
    return x

def long_seg(a,b):
    c=f(a)
    d=f(b)
    distance=((b-a)**2+(d-c)**2)**0.5
    return distance


def long_rampe(i, n, a, b):
        j=((b-a)*i/n)+a

        return j

def abscisse(a,b,n,m):
    for i in range (0, n):
      j= long_rampe(i, n, a, b)
      longueur=long_seg(m, j)
      print("l'abscisse de l'origine du segment ", i," est :",j,)
    return j

a=0
m=0
b=int(input("b"))
n=int(input("n"))
ab=abscisse(a,b,n,m)
m==ab
  • Partager sur Facebook
  • Partager sur Twitter
14 novembre 2017 à 18:24:51

Salut,

Tu travailles sur un intervalle [0;2] donc plus n est grand, plus les abscisses de tes points M1... Mn seront rapprochés

Dans ta fonction long_rampe il faut que ta boucle calcule la longueur des n segments sur l'intervalle [0;2]

Pour ça tu as besoin des l'abscisses des deux points qui constituent chaque segment

Je te conseille de faire une fonction qui calcule abscisse d'un point donné en fonction du nombre de points ( =n ), ce qui donne quelque chose comme ça

def abscisse(identifiant_point, n, min_interval, max_interval):
    """Ta docstring ici"""
    longeur_interval = max_interval - min_interval
    
    return min_interval + (longeur_interval / n) * identifiant_point

Ensuite dans ta fonction long_rampe tu dois itérer n fois en additionnant la longueur des segment [Mn-1, Mn]

Ce qui te donne quelque chose comme ça:

def long_rampe(n, min_interval, max_interval):
    """Ta docstring ici"""
    if n == 0:
        return 0

    abscisse_n_moin_un = None
    longueur_rampe = 0

    for i in range(1,n):
        abscisse_n_moin_un = abscisse(i-1, n, min_interval, max_interval)
        abscisse_n = abscisse(i, n, min_interval, max_interval)
        longueur_segment = long_seg(abscisse_n_moin_un, abscisse_n)
        longueur_rampe = longueur_rampe + longueur_segment

    return longueur_rampe 

Je te laisse continuer mais tu devrais avoir toutes les cartes en main maintenant. Je n'ai pas testé ce code, il est possible qu'il y ai des erreurs.

@+



-
Edité par Tuxdis 15 novembre 2017 à 14:03:13

  • Partager sur Facebook
  • Partager sur Twitter
14 novembre 2017 à 21:56:18

Je tiens juste à souligner que c'est abscisse et non absysse ...
  • Partager sur Facebook
  • Partager sur Twitter
14 novembre 2017 à 22:19:07

Merci beaucoup j'essaierai ce programme demain
  • Partager sur Facebook
  • Partager sur Twitter
15 novembre 2017 à 14:16:18

Bonjour, merci pour le programme mais il y a un problème, avec un logiciel de géométrie dynamique, pour n=4, je trouve 2.14 cm alors que avec le programme il est marqué 1.63, il oublie un segment.

-
Edité par SamuelBader 15 novembre 2017 à 14:19:07

  • Partager sur Facebook
  • Partager sur Twitter
15 novembre 2017 à 14:42:57

Oui, le code donné par Tuxdis s'arrête à l'indice n-1, et ne calcule donc pas la longueur du dernier segment. Il serait préférable je pense d'utiliser une boucle for i in range(n) qui garantirait de calculer tous les segments formés par le point actuel et le point suivant.

  • Partager sur Facebook
  • Partager sur Twitter
15 novembre 2017 à 14:48:57

merci, mais maintenant il me donne 2.75 je sais pas pourquoi
  • Partager sur Facebook
  • Partager sur Twitter
15 novembre 2017 à 14:50:01

SamuelBader a écrit:

merci, mais maintenant il me donne 2.75 je sais pas pourquoi

On va pas faire le débuggage à ta place. A toi de mettre des print là où il faut et afficher les résultats intermédiaires jusqu'à ce que tu trouves le résultat qui ne va pas.

  • Partager sur Facebook
  • Partager sur Twitter
15 novembre 2017 à 15:06:37

Rebonjour, solution trouvée, il fallait mettre for i in range(1, n+1) pour ne pas avoir d'abscisse négative au début merci pour votre aide :)
  • Partager sur Facebook
  • Partager sur Twitter
15 novembre 2017 à 15:25:25

Oui, ça revient à mettre des +1 aux valeurs du range pour mettre des -1 plus loin.

  • Partager sur Facebook
  • Partager sur Twitter