Maths Seconde, programme français • Exercices corrigés à Montréal

Exercices corrigés : Python appliqué aux maths, à la physique et à la chimie (Seconde)

Voici une série d'exercices corrigés de Python appliqué aux mathématiques et aux sciences, au niveau de la classe de Seconde du programme français, tel qu'il est suivi au Lycée Marie de France et au Collège Stanislas à Montréal. Elle fait programmer des tableaux de valeurs, des fonctions avec print et return, des boucles for et while, la recherche de seuil, le balayage et le traitement de listes de mesures, sur des formules du cours de physique-chimie : vitesse moyenne, concentration et dilution, titrage, chute libre, loi d'Ohm, masse volumique, loi de Snell-Descartes, période et fréquence d'un son. Quinze exercices en trois parties.

À la fin de la série, vous savez dresser un tableau de valeurs avec un pas décimal (exercice 1), convertir des unités dans une fonction (exercice 2), calculer une concentration et le volume à prélever pour une dilution (exercice 3), trouver un seuil avec une boucle while (exercices 4 et 10), distinguer print et return (exercice 5), calculer moyenne et étendue d'une série de mesures (exercice 6), lire le volume équivalent d'un titrage dans deux listes (exercice 7) et encadrer une durée de chute libre par balayage (exercice 9). La partie C estime une résistance par la loi d'Ohm (exercice 11), identifie un métal par sa masse volumique (exercice 12), calcule des vitesses sur une chronophotographie (exercice 13), programme la réfraction et l'angle limite (exercice 14) et mesure une distance par écho (exercice 15).

Chaque programme de cette série calcule quelque chose qui existe déjà dans le cours : une image, une vitesse, une concentration, une moyenne. L'ordinateur n'apporte aucune mathématique nouvelle, il répète la même formule des dizaines de fois sans se tromper. Tout le travail consiste donc à écrire correctement dans la boucle la formule que l'on sait déjà poser à la main.

Les corrigés traitent les erreurs qui faussent un résultat sans message d'erreur : une durée de 1 h 48 min tapée 1.48 (exercice 2), un volume en millilitres là où la formule attend des litres (exercice 3), range qui ne produit que des entiers (exercice 1), une boucle qui ajoute 0,1 au lieu de boucler sur des entiers (exercice 9), et le test d'égalité entre deux flottants qui fait tourner une boucle sans fin (exercice 10).

Série autocorrigée Tape tes réponses et vérifie-les question par question : la page te dit juste ou faux avant d'ouvrir la correction. Avec un compte, chaque bonne réponse du premier coup rapporte des points, et tes réponses justes restent remplies quand tu reviens.

Ce chapitre fait partie de Mathématiques en Seconde
Avant de commencer Fiche de révision : les pièges et la méthode de ce chapitre

Avant ce chapitre

Ces notions sont supposées acquises ici. Si le premier exercice résiste, le blocage vient presque toujours de l'une d'elles, pas du chapitre lui-même.

Remonter plus loin : la chaîne complète (4 chapitres) ↓

Le chemin de remédiation, du plus ancien au plus proche. Un élève qui reprend ce chapitre de zéro le reprend dans cet ordre.

  1. 1Algorithmique et ScratchCinquième
  2. 2Algorithmique et ScratchQuatrième
  3. 3Algorithmique et ScratchTroisième
  4. 4Algorithmique et Python

Rappel de cours

  • • Une affectation x = 3 range une valeur dans une variable et se lit de droite à gauche. = affecte, == teste une égalité.
  • • for k in range(a, b) parcourt les entiers de a à b - 1 : la borne de droite est exclue, et range ne produit que des ENTIERS.
  • • Pour balayer des décimales, on boucle sur des entiers et on divise : for k in range(0, 21) puis x = k/10.
  • • On utilise for quand le nombre de tours est connu d'avance, et while quand il dépend d'une condition, typiquement une recherche de seuil.
  • • return renvoie une valeur exploitable, print se contente d'afficher. Une fonction sans return renvoie None.
  • • Pour une liste L : len(L) est son nombre d'éléments, L[0] le premier, L[len(L) - 1] le dernier.
  • • Vitesse moyenne : v=dtv=\frac{d}{t}. Pour passer des km/h aux m/s, on DIVISE par 3,63{,}6.
  • • Quantité de matière et concentration : n=mMn=\frac{m}{M} et c=nVc=\frac{n}{V}, donc c=mM×Vc=\frac{m}{M\times V} avec VV en litres.
  • • Les nombres décimaux sont représentés de façon approchée en machine : on ne teste jamais l'égalité de deux flottants.

Partie A : les bases (/50)

Exercice 1 : Tableau de valeurs d'une fonction

On considère la fonction ff définie sur R\mathbb{R} par f(x)=x2−4x+1f(x)=x^2-4x+1, et le programme suivant.

for x in range(-1, 6):
    print(x, x*x - 4*x + 1)
  • a) Dressez le tableau des valeurs affichées par ce programme.
  • b) Quelle valeur de xx donne le plus petit résultat ? Retrouvez-la par le calcul.
  • c) On veut maintenant un tableau de valeurs allant de −1-1 à 55 avec un pas de 0,50{,}5. Écrivez le programme correspondant.
  • d) Un élève écrit for x in range(-1, 5). Que manque-t-il dans son tableau ?

Tape tes réponses, la page te dit juste ou faux 0/9

a)
b)
c)
d)
Voir la correction

Réponses

  • a) 66 ; 11 ; −2-2 ; −3-3 ; −2-2 ; 11 ; 66
  • b) x=2x=2 ; f(x)=(x−2)2−3≥−3f(x)=(x-2)^{2}-3\geq -3
  • c) for k in range(-2, 11): puis x = k/2 : 1313 lignes
  • d) Il manque x=5x=5
a)

La boucle range(-1, 6) parcourt les entiers de −1-1 à 55, la borne de droite étant EXCLUE. On calcule ff pour chacun : f(−1)=1+4+1=6f(-1)=1+4+1=6, f(0)=1f(0)=1, f(1)=1−4+1=−2f(1)=1-4+1=-2, f(2)=4−8+1=−3f(2)=4-8+1=-3, f(3)=9−12+1=−2f(3)=9-12+1=-2, f(4)=16−16+1=1f(4)=16-16+1=1, f(5)=25−20+1=6f(5)=25-20+1=6. Le tableau affiché est donc 6 ; 1 ; −2 ; −3 ; −2 ; 1 ; 66\,;\,1\,;\,-2\,;\,-3\,;\,-2\,;\,1\,;\,6.

b)

Le plus petit résultat, −3-3, est obtenu pour x=2x=2. Le calcul le confirme et va plus loin que la machine : la forme canonique s'écrit f(x)=(x−2)2−3f(x)=(x-2)^2-3, car (x−2)2=x2−4x+4(x-2)^2=x^2-4x+4 et il faut retirer 33 pour retrouver le +1+1. Comme un carré est toujours positif ou nul, f(x)≥−3f(x)\ge -3 pour tout xx, avec égalité uniquement en x=2x=2. Le programme SUGGÈRE le minimum sur sept valeurs, le calcul le DÉMONTRE sur tous les réels : la différence est exactement celle entre une observation et une preuve.

c)

range ne fabrique que des entiers, donc on ne peut pas lui demander un pas de 0,50{,}5. On boucle sur des entiers et on divise : for k in range(-2, 11): puis x = k/2 puis print(x, x*x - 4*x + 1). Le compteur kk va de −2-2 à 1010, ce qui donne bien xx de −1-1 à 55 par pas de 0,50{,}5, soit treize lignes.

d)

Il manque la dernière ligne, celle de x=5x=5 : range(-1, 5) s'arrête à 44 inclus, alors que la version de l'énoncé allait jusqu'à 55. C'est l'erreur la plus fréquente du chapitre. La règle à retenir dans les deux sens : range(a, b) contient aa, ne contient pas bb, et compte b−ab-a valeurs. Ici 5−(−1)=65-(-1)=6 valeurs au lieu de sept.

Le fil de tout l'exercice : le programme ne fait rien d'autre que remplacer xx par des valeurs successives dans une expression que l'on a écrite soi-même. S'il affiche des résultats faux, ce n'est presque jamais la machine, c'est la formule ou les bornes de la boucle.

for k in range(-2, 11):
    x = k/2
    print(x, x*x - 4*x + 1)
-2-1123456-4-22468les 7 valeursdu tableauminimum : f(2) = -3

Coche ici les exercices faits ou à revoir : un compte gratuit, sans mot de passe, retient tes coches et tes réponses justes d'une visite à l'autre, te dit quel chapitre attaquer ensuite et te permet de demander l'exercice qui te manque. Crée ton espace, un courriel suffit.

Exercice 2 : Vitesse moyenne et conversion d'unités

Un train relie deux villes distantes de 234234 km en 11 h 4848 min. On veut automatiser le calcul de sa vitesse moyenne.

def vitesse(d, t):
    return d/t

print(vitesse(234, 1.48))
  • a) Que renvoie la fonction vitesse si d est en kilomètres et t en heures ?
  • b) Le programme affiche environ 158158. Pourquoi ce résultat est-il faux, et que faut-il écrire ?
  • c) Écrivez une fonction en_ms(v) qui convertit une vitesse donnée en km/h en mètres par seconde, et appliquez-la au résultat corrigé.
  • d) Que se passe-t-il si l'on appelle vitesse(234, 0) ? Comment protéger la fonction ?

Tape tes réponses, la page te dit juste ou faux 0/5

a)
b)
c)
d)
Voir la correction

Réponses

  • a) La vitesse en km/h
  • b) 11 h 4848 min =1,8=1{,}8 h : 130130 km/h
  • c) return v/3.6 ; ≈36,1\approx 36{,}1 m/s
  • d) Division par zéro ; tester t == 0
a)

Elle renvoie la vitesse moyenne en kilomètres par heure, puisque v=dtv=\frac{d}{t} et que l'unité d'un quotient est le quotient des unités : des kilomètres divisés par des heures donnent des km/h. Une fonction ne connaît pas les unités, c'est à celui qui l'appelle de fournir des données cohérentes.

b)

L'erreur n'est pas informatique, elle est physique : 11 h 4848 min ne s'écrit pas 1,481{,}48 h. Les minutes se comptent par soixante, pas par cent. Il faut convertir : 4848 min =4860=\frac{48}{60} h =0,8=0{,}8 h, donc la durée vaut 1,81{,}8 h. On écrit print(vitesse(234, 1.8)), ce qui donne 2341,8=130\frac{234}{1{,}8}=130 km/h. L'écart avec le résultat erroné est énorme, 158158 contre 130130, et rien dans le programme ne le signale : la machine calcule exactement ce qu'on lui a demandé.

c)

On divise par 3,63{,}6 : def en_ms(v): puis return v/3.6. En effet 11 km/h =1000 m3600 s=13,6=\frac{1000\ \text{m}}{3600\ \text{s}}=\frac{1}{3{,}6} m/s. Ici en_ms(130) renvoie 1303,6≈36,1\frac{130}{3{,}6}\approx 36{,}1 m/s. Vérification de bon sens : un nombre exprimé en m/s est toujours PLUS PETIT que le même en km/h, donc si le résultat avait été 468468, le sens de l'opération aurait été inversé.

d)

Python interrompt le programme avec une erreur de division par zéro, qui n'est pas définie en machine pas plus qu'en mathématiques. On protège la fonction par un test : def vitesse(d, t): puis if t == 0: puis return None puis return d/t. Cela reflète la réalité physique : une distance parcourue en une durée nulle n'a pas de sens.

Le fil : dans un exercice de sciences, la partie fragile n'est pas la division, c'est la préparation des données. Une durée en heures et minutes, une distance en mètres, une masse en grammes doivent être converties AVANT d'entrer dans la fonction.

def vitesse(d, t):
    if t == 0:
        return None
    return d/t

def en_ms(v):
    return v/3.6

print(vitesse(234, 1.8))
print(en_ms(vitesse(234, 1.8)))

Exercice 3 : Concentration d'une solution et dilution

On dissout une masse mm (en grammes) d'un solide de masse molaire MM (en g/mol) dans un volume VV (en litres) de solution. On rappelle n=mMn=\frac{m}{M} et c=nVc=\frac{n}{V}.

def concentration(m, M, V):
    n = m/M
    return n/V
  • a) On dissout 5,855{,}85 g de chlorure de sodium (M=58,5M=58{,}5 g/mol) dans 500500 mL de solution. Que renvoie concentration(5.85, 58.5, 0.5) ?
  • b) Un élève écrit concentration(5.85, 58.5, 500). Quel résultat obtient-il, et de combien se trompe-t-il ?
  • c) On veut diluer la solution précédente pour obtenir 100100 mL à 0,0500{,}050 mol/L. Écrivez une fonction volume_a_prelever(c1, c2, V2) et donnez le résultat en millilitres.
  • d) Complétez cette fonction pour qu'elle refuse une dilution impossible, c'est-à-dire lorsque la concentration voulue dépasse celle de la solution de départ.

Tape tes réponses, la page te dit juste ou faux 0/5

a)
b)
c)
d)
Voir la correction

Réponses

  • a) 0,20{,}2 mol/L
  • b) 0,00020{,}0002 : facteur 1 0001\,000
  • c) return c2*V2/c1 ; 2525 mL
  • d) if c2 > c1: return None
a)

La quantité de matière vaut n=5,8558,5=0,100n=\frac{5{,}85}{58{,}5}=0{,}100 mol. Le volume vaut 500500 mL =0,500=0{,}500 L, donc c=0,1000,500=0,200c=\frac{0{,}100}{0{,}500}=0{,}200 mol/L. La fonction renvoie 0,20{,}2.

b)

Il obtient 0,1500=2×10−4\frac{0{,}1}{500}=2\times 10^{-4}, soit 0,00020{,}0002. Il se trompe d'un FACTEUR MILLE, parce qu'il a fourni un volume en millilitres à une formule qui attend des litres. Aucune erreur ne s'affiche : le programme tourne, produit un nombre, et ce nombre est faux. C'est exactement pour cela qu'en chimie on écrit l'unité à côté de chaque valeur avant de taper quoi que ce soit.

c)

La dilution conserve la quantité de matière : c1V1=c2V2c_1 V_1 = c_2 V_2, donc V1=c2V2c1V_1=\frac{c_2 V_2}{c_1}. On écrit def volume_a_prelever(c1, c2, V2): puis return c2*V2/c1. Ici V1=0,050×0,1000,200=0,025V_1=\frac{0{,}050\times 0{,}100}{0{,}200}=0{,}025 L, soit 2525 mL. On prélève donc 2525 mL de la solution mère et l'on complète à 100100 mL avec de l'eau distillée. Contrôle immédiat : la concentration a été divisée par quatre, le volume prélevé est bien le quart du volume final.

d)

On ajoute un test au début : if c2 > c1: puis return None. La raison est physique et non informatique : diluer, c'est ajouter du solvant, donc la concentration ne peut que BAISSER. Si l'on demandait c2>c1c_2>c_1, la formule renverrait V1>V2V_1>V_2, c'est-à-dire un volume à prélever supérieur au volume final, ce qui n'a aucun sens au laboratoire. Une fonction bien écrite refuse ce qu'elle ne sait pas faire au lieu de renvoyer un nombre absurde.

Le fil : un résultat de chimie faux d'un facteur mille vient presque toujours d'un millilitre pris pour un litre. La machine ne vérifie pas les unités, c'est le seul contrôle qui reste entièrement à la charge de l'élève.

def volume_a_prelever(c1, c2, V2):
    if c2 > c1:
        return None
    return c2*V2/c1

Exercice 4 : Boucle while et recherche de seuil

Une culture de bactéries compte 500500 individus et sa population augmente de 4%4\% par heure. On cherche au bout de combien d'heures elle dépasse 20002000 individus.

n = 500
h = 0
while n <= 2000:
    n = n*1.04
    h = h + 1
print(h)
  • a) Pourquoi une boucle while et non une boucle for ?
  • b) Que vaut la population après 3535 heures, puis après 3636 heures ? Concluez sur la valeur affichée.
  • c) Un élève remplace n = n*1.04 par n = n + 4. Qu'a-t-il modélisé à la place, et en combien d'heures son programme s'arrête-t-il ?
  • d) Que se passe-t-il si le taux d'augmentation est nul ? Comment sécuriser la boucle ?

Tape tes réponses, la page te dit juste ou faux 0/6

a)
b)
c)
d)
Voir la correction

Réponses

  • a) Nombre de tours inconnu à l'avance
  • b) ≈1 973\approx 1\,973 puis ≈2 052\approx 2\,052 : affiche 3636
  • c) Croissance linéaire : 375375 heures
  • d) Boucle infinie ; ajouter and h < 1000
a)

Parce que le nombre de tours n'est PAS connu à l'avance : c'est précisément la réponse cherchée. Une boucle for exige que l'on annonce le nombre de répétitions avant de commencer, ce qui reviendrait à connaître déjà le résultat. La boucle while répète tant qu'une condition est vraie et s'arrête d'elle-même dès qu'elle devient fausse.

b)

Augmenter de 4%4\%, c'est multiplier par 1,041{,}04, donc au bout de hh heures la population vaut 500×1,04h500\times 1{,}04^{h}. Pour h=35h=35 : 1,0435≈3,94611{,}04^{35}\approx 3{,}9461 et 500×3,9461≈1973500\times 3{,}9461\approx 1973 individus, ce qui est encore sous le seuil. Pour h=36h=36 : 1,0436≈4,10391{,}04^{36}\approx 4{,}1039 et 500×4,1039≈2052500\times 4{,}1039\approx 2052 individus, ce qui dépasse. Le programme affiche donc 3636. On retrouve le résultat par le raisonnement : il faut 1,04h≥41{,}04^{h}\ge 4, et 3636 est le premier entier qui convient.

c)

Il a modélisé une croissance LINÉAIRE, quatre bactéries de plus chaque heure, au lieu d'une croissance exponentielle de quatre pour cent par heure. Les deux modèles n'ont rien à voir : avec son programme il faudrait 2000−5004=375\frac{2000-500}{4}=375 heures, soit plus de dix fois trop. Le point de méthode est général : un pourcentage se traduit par une MULTIPLICATION, jamais par une addition, et confondre les deux est l'erreur la plus coûteuse du chapitre sur les évolutions.

d)

Si le taux est nul, on multiplie par 11, la population ne change jamais, la condition n <= 2000 reste vraie indéfiniment et la boucle ne se termine pas : c'est une boucle infinie. Une boucle while n'est correcte que si quelque chose évolue à chaque tour DANS LE SENS de la condition d'arrêt. En pratique on ajoute une sécurité, par exemple while n <= 2000 and h < 1000:, pour garantir l'arrêt et signaler que le seuil n'a pas été atteint.

Le fil : le seuil est un motif qui revient toute l'année, en suites comme en sciences. On initialise, on répète la mise à jour, on compte les tours, et l'on vérifie toujours le résultat en calculant à la main les deux valeurs qui encadrent le seuil, ici 19731973 et 20522052.

Exercice 5 : Fonctions, taux d'évolution, print et return

Le prix d'un article passe de 8080 dollars à 9696 dollars, puis subit une baisse. On veut automatiser le calcul des taux d'évolution.

def taux(v1, v2):
    print((v2 - v1)/v1*100)
  • a) Que fait taux(80, 96) ? Quel est le taux d'évolution en pourcentage ?
  • b) Un élève écrit t = taux(80, 96) puis print(t + 5). Le programme s'arrête sur une erreur. Expliquez et corrigez la fonction.
  • c) L'article augmente de 20%20\% puis baisse de 20%20\%. Calculez le prix final à partir de 8080 dollars, et donnez le taux d'évolution global.
  • d) Écrivez une fonction applique(prix, t) qui renvoie le prix après une évolution de tt pour cent, en gérant aussi bien une hausse qu'une baisse.

Tape tes réponses, la page te dit juste ou faux 0/5

a)
b)
c)
d)
Voir la correction

Réponses

  • a) Affiche 2020 : hausse de 20 %20\ \%
  • b) t vaut None ; utiliser return
  • c) 76,876{,}8 dollars : −4 %-4\ \%
  • d) return prix*(1 + t/100)
a)

Elle AFFICHE 96−8080×100=1680×100=20\frac{96-80}{80}\times 100=\frac{16}{80}\times 100=20. Le prix a augmenté de 20%20\%. Attention au verbe employé : la fonction affiche, elle ne renvoie rien.

b)

print envoie du texte à l'écran, ce que l'on voit ; return fournit une valeur au programme, ce que l'on peut réutiliser. Une fonction sans return renvoie automatiquement None, donc ici t ne contient aucun nombre et t + 5 provoque une erreur, car on ne peut pas additionner un nombre et l'absence de valeur. On corrige en écrivant def taux(v1, v2): puis return (v2 - v1)/v1*100, et l'on affiche à l'extérieur avec print(taux(80, 96)). Règle pratique : une fonction de calcul renvoie toujours, elle n'affiche jamais.

c)

Le prix final vaut 80×1,2×0,8=80×0,96=76,880\times 1{,}2\times 0{,}8=80\times 0{,}96=76{,}8 dollars. Le taux global est donc 76,8−8080×100=−4\frac{76{,}8-80}{80}\times 100=-4, soit une BAISSE de 4%4\%. Le résultat surprend et il faut savoir l'expliquer : la hausse de 20%20\% porte sur 8080 dollars et ajoute 1616 dollars, tandis que la baisse de 20%20\% porte sur 9696 dollars et en retire 19,2019{,}20. Les taux successifs ne s'additionnent pas, ce sont les COEFFICIENTS MULTIPLICATEURS qui se multiplient.

d)

def applique(prix, t): puis return prix*(1 + t/100). Aucun test n'est nécessaire : pour t=20t=20 le coefficient vaut 1,21{,}2, pour t=−20t=-20 il vaut 0,80{,}8. Une seule formule couvre les deux cas, à condition d'écrire la baisse avec un tt NÉGATIF. On vérifie que applique(applique(80, 20), -20) renvoie bien 76,876{,}8, ce qui redonne la question c) en une seule ligne : c'est tout l'intérêt d'écrire une fonction plutôt que de répéter un calcul.

Le fil : +20%+20\% suivi de −20%-20\% ne ramène pas au départ, et 1,2×0,8=0,96≠11{,}2\times 0{,}8=0{,}96\ne 1 le prouve en une ligne. C'est le résultat le plus souvent demandé en contrôle sur ce chapitre.

def taux(v1, v2):
    return (v2 - v1)/v1*100

def applique(prix, t):
    return prix*(1 + t/100)

print(applique(applique(80, 20), -20))

Partie B : problèmes et raisonnement (/50)

Exercice 6 : Traiter une série de mesures

Un capteur relève sept fois de suite la température d'une même pièce, en degrés Celsius. Les mesures sont stockées dans la liste T = [21.4, 22.1, 20.8, 21.9, 22.3, 21.0, 21.5].

  • a) Écrivez un programme qui calcule la moyenne de la liste T à l'aide d'une boucle, sans utiliser la fonction sum. Donnez la valeur au centième.
  • b) Écrivez un programme qui trouve la plus grande et la plus petite mesure, puis calculez l'étendue.
  • c) Combien de mesures s'écartent de la moyenne de plus de 0,50{,}5 degré ? Écrivez le programme qui les compte.
  • d) Le capteur mesure toujours la même pièce. Pourquoi les sept valeurs diffèrent-elles, et pourquoi retient-on la moyenne plutôt qu'une mesure isolée ?

Tape tes réponses, la page te dit juste ou faux 0/6

a)
b)
c)
d)
Voir la correction

Réponses

  • a) 1517≈21,57\frac{151}{7}\approx 21{,}57 °C
  • b) Max 22,322{,}3, min 20,820{,}8, étendue 1,51{,}5
  • c) 44 mesures
  • d) Incertitudes de mesure ; la moyenne les compense en partie
a)

On utilise un ACCUMULATEUR, une variable initialisée à zéro à laquelle on ajoute chaque élément : s = 0 puis for x in T: puis s = s + x puis print(s/len(T)). La somme vaut 21,4+22,1+20,8+21,9+22,3+21,0+21,5=151,021{,}4+22{,}1+20{,}8+21{,}9+22{,}3+21{,}0+21{,}5=151{,}0 et il y a sept mesures, donc la moyenne vaut 1517≈21,57\frac{151}{7}\approx 21{,}57 degré. Le point à ne pas rater : la division se fait APRÈS la boucle, une seule fois. Écrire s = s/len(T) à l'intérieur diviserait à chaque tour et donnerait n'importe quoi.

b)

On initialise avec le premier élément, jamais avec zéro : M = T[0] puis m = T[0] puis for x in T: puis if x > M: puis M = x puis if x < m: puis m = x. On obtient M=22,3M=22{,}3 et m=20,8m=20{,}8, donc une étendue de 22,3−20,8=1,522{,}3-20{,}8=1{,}5 degré. Initialiser le maximum à zéro serait ici sans conséquence, mais deviendrait faux dès que toutes les mesures seraient négatives, ce qui arrive en hiver à Montréal.

c)

moy = 151/7 puis c = 0 puis for x in T: puis if abs(x - moy) > 0.5: puis c = c + 1. Les écarts à la moyenne 21,5721{,}57 valent environ −0,17-0{,}17, +0,53+0{,}53, −0,77-0{,}77, +0,33+0{,}33, +0,73+0{,}73, −0,57-0{,}57 et −0,07-0{,}07. Quatre d'entre eux dépassent 0,50{,}5 en valeur absolue : les mesures 22,122{,}1, 20,820{,}8, 22,322{,}3 et 21,021{,}0. La valeur absolue est indispensable, car un écart de −0,77-0{,}77 est aussi grand qu'un écart de +0,77+0{,}77 : sans elle, on ne compterait que les mesures supérieures à la moyenne.

d)

Elles diffèrent à cause des incertitudes de mesure, qui viennent du capteur lui-même et des micro-variations réelles de la pièce. Aucune mesure physique n'est exacte. La moyenne est retenue parce que les erreurs se compensent en partie : les écarts positifs et négatifs s'annulent partiellement, et l'étendue de 1,51{,}5 degré donne une idée de la dispersion, donc de la confiance à accorder au résultat. On annonce ainsi une température d'environ 21,621{,}6 degré, pas 21,57142821{,}571428 : conserver toutes les décimales de la division reviendrait à prétendre une précision que les mesures n'ont pas.

Le fil : une liste de mesures se traite toujours de la même façon, un accumulateur pour la somme, un comparateur pour les extremums, un compteur pour les cas particuliers. Le raisonnement de sciences vient après, quand il faut décider combien de chiffres du résultat ont un sens.

s = 0
for x in T:
    s = s + x
moy = s/len(T)

c = 0
for x in T:
    if abs(x - moy) > 0.5:
        c = c + 1
print(moy, c)
1234567820,52121,52222,5moyenne 21,57moyenne + 0,5moyenne - 0,5

Exercice 7 : Compléter un programme : volume équivalent d'un titrage

On titre VA=20,0V_A=20{,}0 mL d'une solution d'acide par une solution de soude de concentration cB=0,100c_B=0{,}100 mol/L. On relève le pH pour cinq volumes de soude versés, stockés dans deux listes : V = [8.0, 9.0, 10.0, 11.0, 12.0] et pH = [3.1, 3.6, 7.4, 10.2, 10.7].

Le programme suivant cherche l'endroit où le pH fait le plus grand saut. Trois lignes sont incomplètes.

saut_max = 0
indice = 0
for i in range(1, len(pH)):
    saut = ...
    if ... :
        saut_max = saut
        indice = i
Veq = ...
print(Veq)
  • a) Complétez les trois lignes du programme.
  • b) Calculez les quatre sauts de pH et donnez la valeur du volume équivalent obtenue.
  • c) Déduisez-en la concentration de la solution d'acide.
  • d) Pourquoi la boucle démarre-t-elle à 11 et non à 00 ? Que se passerait-il avec range(0, len(pH)) ?

Tape tes réponses, la page te dit juste ou faux 0/7

a)
b)
c)
d)
Voir la correction

Réponses

  • a) pH[i] - pH[i-1], saut > saut_max, (V[indice] + V[indice-1])/2
  • b) Sauts 0,50{,}5 ; 3,83{,}8 ; 2,82{,}8 ; 0,50{,}5 : Veˊq=9,5V_{\text{éq}}=9{,}5 mL
  • c) cA=0,0475c_{A}=0{,}0475 mol/L
  • d) pH[-1] est le dernier élément : saut faux sans message
a)

La ligne du saut compare une valeur à la précédente : saut = pH[i] - pH[i-1]. Le test conserve le plus grand : if saut > saut_max:. Enfin le volume équivalent est situé au MILIEU de l'intervalle où le saut se produit : Veq = (V[indice] + V[indice-1])/2. Chacune de ces trois lignes traduit une phrase du cours, et c'est dans cet ordre qu'il faut les écrire, jamais l'inverse.

b)

Les sauts successifs valent 3,6−3,1=0,53{,}6-3{,}1=0{,}5, puis 7,4−3,6=3,87{,}4-3{,}6=3{,}8, puis 10,2−7,4=2,810{,}2-7{,}4=2{,}8, puis 10,7−10,2=0,510{,}7-10{,}2=0{,}5. Le plus grand est 3,83{,}8, obtenu pour i = 2, c'est-à-dire entre V=9,0V=9{,}0 mL et V=10,0V=10{,}0 mL. Le programme affiche donc Veˊq=9,0+10,02=9,5V_{\text{éq}}=\frac{9{,}0+10{,}0}{2}=9{,}5 mL. Cette lecture correspond exactement à ce que l'on fait à la main sur la courbe de titrage : on repère le saut brutal de pH et l'on place l'équivalence en son milieu.

c)

À l'équivalence, les réactifs ont été introduits dans les proportions de l'équation, donc cAVA=cBVeˊqc_A V_A = c_B V_{\text{éq}}, d'où cA=cBVeˊqVA=0,100×9,520,0=0,0475c_A=\frac{c_B V_{\text{éq}}}{V_A}=\frac{0{,}100\times 9{,}5}{20{,}0}=0{,}0475 mol/L. Les volumes peuvent rester en millilitres des deux côtés puisqu'ils apparaissent en quotient : c'est le seul endroit du chapitre où l'on n'est pas obligé de convertir, et il faut savoir dire pourquoi.

d)

Parce que la ligne pH[i-1] a besoin d'un élément PRÉCÉDENT. Avec i = 0, on écrirait pH[-1], qui en Python désigne le DERNIER élément de la liste : le programme ne signalerait aucune erreur mais comparerait le premier pH au dernier, donc calculerait un saut de 3,1−10,7=−7,63{,}1-10{,}7=-7{,}6, sans aucun sens chimique. C'est le piège le plus dangereux du chapitre sur les listes, parce qu'il ne produit pas de message d'erreur, seulement un résultat faux. La règle : dès qu'une boucle compare un élément au précédent, elle commence à l'indice 11.

Le fil : le programme ne fait que formaliser la lecture graphique. Savoir où est l'équivalence, c'est savoir que le saut de pH est brutal, et le milieu de l'intervalle est la meilleure estimation que l'on puisse tirer d'un relevé espacé de 11 mL.

saut_max = 0
indice = 0
for i in range(1, len(pH)):
    saut = pH[i] - pH[i-1]
    if saut > saut_max:
        saut_max = saut
        indice = i
Veq = (V[indice] + V[indice-1])/2
print(Veq)
789101112132468101214saut de pH : 3,8volume equivalent 9,5 mLpH

Exercice 8 : Cinq affirmations à corriger

Chacune des cinq affirmations suivantes est FAUSSE. Dites pourquoi, puis énoncez la version correcte.

  • a) « L'instruction x == 3 range la valeur 33 dans la variable x. »
  • b) « La boucle for k in range(1, 10) effectue dix tours. »
  • c) « Une fonction qui se termine par un calcul renvoie ce calcul, même sans return. »
  • d) « Pour convertir une vitesse de km/h en m/s, on multiplie par 3,63{,}6. »
  • e) « En Python, 0.1 + 0.2 == 0.3 renvoie True. »

Tape tes réponses, la page te dit juste ou faux 0/5

a)
b)
c)
d)
e)
Voir la correction

Réponses

  • a) Faux : == teste, = affecte
  • b) Faux : 99 tours
  • c) Faux : sans return, la fonction renvoie None
  • d) Faux : on divise par 3,63{,}6
  • e) Faux : False
a)

FAUX. == est un TEST d'égalité : il ne modifie rien et renvoie True ou False. C'est = qui affecte. Version correcte : « l'instruction x = 3 range la valeur 33 dans x, tandis que x == 3 demande si x vaut déjà 33 ». La confusion est d'autant plus facile qu'en mathématiques le signe == sert aux deux usages.

b)

FAUX. range(1, 10) parcourt 1,2,…,91, 2, \dots, 9, la borne de droite étant exclue : cela fait 10−1=910-1=9 tours. Version correcte : « la boucle effectue neuf tours ». Pour obtenir dix tours à partir de 11, on écrit range(1, 11).

c)

FAUX. Sans return, une fonction exécute ses instructions puis renvoie None, c'est-à-dire aucune valeur exploitable. Version correcte : « une fonction ne renvoie une valeur que si elle contient explicitement une instruction return ». Le symptôme classique est une erreur quelques lignes plus loin, quand on essaie de calculer avec le résultat.

d)

FAUX, c'est l'inverse. Puisque 11 km/h =10003600=\frac{1000}{3600} m/s =13,6=\frac{1}{3{,}6} m/s, on DIVISE par 3,63{,}6 pour aller des km/h vers les m/s. Version correcte : « on divise par 3,63{,}6 pour passer des km/h aux m/s, et l'on multiplie par 3,63{,}6 dans l'autre sens ». Le contrôle mental est immédiat : 9090 km/h vaut 2525 m/s, un nombre plus petit.

e)

FAUX, cela renvoie False. Les nombres décimaux sont stockés en base deux, et ni 0,10{,}1 ni 0,20{,}2 n'y ont d'écriture finie : la somme obtenue vaut 0,300000000000000040{,}30000000000000004. Version correcte : « on ne teste jamais l'égalité de deux flottants, on teste si leur écart est petit », par exemple abs(0.1 + 0.2 - 0.3) < 1e-9. C'est la même limitation qu'avec 13=0,333…\frac{1}{3}=0{,}333\dots en base dix, à ceci près que ce sont d'autres fractions qui posent problème.

Ces cinq erreurs représentent la grande majorité des points perdus en algorithmique au niveau Seconde. Aucune ne relève des mathématiques : ce sont des règles de lecture d'un programme, et elles se vérifient à la main, sans machine.

Exercice 9 : Chute libre : encadrer une durée par balayage

Un objet est lâché sans vitesse initiale du haut d'un immeuble. En négligeant les frottements, la distance parcourue au bout de tt secondes vaut d(t)=12gt2d(t)=\frac{1}{2}g t^2 avec g=9,8g=9{,}8 m/s2^2, et sa vitesse vaut v(t)=gtv(t)=g t.

On cherche au bout de combien de temps l'objet a chuté de 2020 mètres.

La figure n'est pas à l'échelle.

g20 m
  • a) Écrivez une fonction distance(t) puis affichez un tableau de valeurs de 00 à 2,52{,}5 s par pas de 0,50{,}5 s.
  • b) Écrivez un programme qui balaie le temps par pas de 0,10{,}1 s et affiche le premier instant où la distance atteint 2020 m. Donnez l'encadrement obtenu.
  • c) Résolvez l'équation 12gt2=20\frac{1}{2}g t^2=20 et comparez à l'encadrement. Quelle est alors la vitesse, en m/s puis en km/h ?
  • d) Un élève écrit t = 0 puis répète t = t + 0.1 dans une boucle while. Pourquoi vaut-il mieux boucler sur des entiers et poser t = k/10 ?

Tape tes réponses, la page te dit juste ou faux 0/8

a)
b)
c)
d)
Voir la correction

Réponses

  • a) 00 ; 1,2251{,}225 ; 4,94{,}9 ; 11,02511{,}025 ; 19,619{,}6 ; 30,62530{,}625 m
  • b) 2,0<t<2,12{,}0<t<2{,}1 s
  • c) t≈2,02t\approx 2{,}02 s ; v≈19,8v\approx 19{,}8 m/s ≈71,3\approx 71{,}3 km/h
  • d) Boucler sur un entier évite l'accumulation d'erreurs
a)

def distance(t): puis return 0.5*9.8*t*t, puis for k in range(0, 6): puis t = k/2 puis print(t, distance(t)). Les valeurs sont d(0)=0d(0)=0, d(0,5)=1,225d(0{,}5)=1{,}225, d(1)=4,9d(1)=4{,}9, d(1,5)=11,025d(1{,}5)=11{,}025, d(2)=19,6d(2)=19{,}6 et d(2,5)=30,625d(2{,}5)=30{,}625 mètres. On voit immédiatement que la réponse cherchée est entre 22 et 2,52{,}5 s, et le tableau montre aussi que les écarts s'agrandissent, ce qui est la signature d'un mouvement accéléré : chaque demi-seconde fait tomber plus loin que la précédente.

b)

k = 0 puis while 0.5*9.8*(k/10)**2 < 20: puis k = k + 1 puis print(k/10). Le programme s'arrête à k=21k=21. En effet d(2,0)=0,5×9,8×4=19,6d(2{,}0)=0{,}5\times 9{,}8\times 4=19{,}6 m, encore insuffisant, alors que d(2,1)=0,5×9,8×4,41=21,609d(2{,}1)=0{,}5\times 9{,}8\times 4{,}41=21{,}609 m dépasse. L'encadrement est donc 2,0<t<2,12{,}0<t<2{,}1 s. Un pas de 0,010{,}01 s donnerait une décimale de plus, au prix de dix fois plus de tours.

c)

On isole : t2=2×209,8=409,8≈4,0816t^2=\frac{2\times 20}{9{,}8}=\frac{40}{9{,}8}\approx 4{,}0816, donc t=4,0816≈2,02t=\sqrt{4{,}0816}\approx 2{,}02 s, en ne gardant que la solution positive puisqu'il s'agit d'une durée. La valeur exacte tombe bien dans l'encadrement du balayage ✓. La vitesse vaut alors v=9,8×2,02≈19,8v=9{,}8\times 2{,}02\approx 19{,}8 m/s, soit 19,8×3,6≈71,319{,}8\times 3{,}6\approx 71{,}3 km/h : un objet lâché de six étages arrive au sol à la vitesse d'une voiture en ville.

d)

Parce que 0,10{,}1 n'a pas d'écriture exacte en machine. En ajoutant 0,10{,}1 vingt et une fois, on n'obtient pas 2,12{,}1 mais 2,09999999999999962{,}0999999999999996, et l'erreur s'accumule à chaque tour. Le test d'arrêt peut alors basculer un cran trop tôt ou trop tard, et un affichage brut fait apparaître des durées comme 1,70000000000000041{,}7000000000000004. En bouclant sur l'entier kk et en posant t=k10t=\frac{k}{10}, on ne fait qu'UNE division au lieu de vingt et une additions : l'erreur ne s'accumule plus. C'est la bonne habitude à prendre pour tous les balayages.

Le fil : le balayage n'est pas une méthode de secours, c'est la méthode générale. Elle s'applique même quand l'équation ne se résout pas, et elle fournit toujours un ENCADREMENT, dont la largeur est le pas choisi.

def distance(t):
    return 0.5*9.8*t*t

k = 0
while distance(k/10) < 20:
    k = k + 1
print((k-1)/10, k/10)
0,511,522,551015202530de 19,6 m a 21,6 mentre t = 2,0 s et t = 2,1 sd = 20 m

Exercice 10 : Problème de synthèse : dilutions successives

On dispose d'une solution colorée de concentration c0=0,20c_0=0{,}20 mol/L. À chaque étape, on prélève 1010 mL de la solution courante et l'on complète à 100100 mL avec de l'eau distillée : la concentration est donc divisée par 1010.

On cherche le nombre d'étapes nécessaires pour descendre sous 10−610^{-6} mol/L, seuil au-dessous duquel la coloration n'est plus détectable.

c₀ = 0,20 mol/Lc₀ ÷ 10c₀ ÷ 10010 mLeau → 100 mL10 mLeau → 100 mL
  • a) Écrivez un programme utilisant une boucle while qui affiche le nombre d'étapes nécessaires, et donnez ce nombre.
  • b) Vérifiez le résultat par le calcul, en donnant les concentrations obtenues à l'avant-dernière et à la dernière étape.
  • c) On change de protocole : on dilue désormais de moitié à chaque étape. Combien d'étapes faut-il pour descendre sous 10−310^{-3} mol/L ?
  • d) Un élève écrit while c != 1e-6: au lieu de while c >= 1e-6:. Que se passe-t-il, et pourquoi cette erreur est-elle grave ?

Tape tes réponses, la page te dit juste ou faux 0/5

a)
b)
c)
d)
Voir la correction

Réponses

  • a) 66 étapes
  • b) c5=2×10−6c_{5}=2\times 10^{-6}, c6=2×10−7c_{6}=2\times 10^{-7} mol/L
  • c) 88 étapes
  • d) Boucle infinie : on écrit toujours une inégalité
a)

c = 0.20 puis n = 0 puis while c >= 1e-6: puis c = c/10 puis n = n + 1 puis print(n). Le programme affiche 66. La structure est celle de l'exercice 4, à un détail près qui change tout : la condition est un seuil à franchir VERS LE BAS, donc on continue tant que la concentration reste trop grande.

b)

La concentration après nn étapes vaut cn=0,2010nc_n=\frac{0{,}20}{10^{n}}. Pour n=5n=5 : c5=0,20100 000=2×10−6c_5=\frac{0{,}20}{100\,000}=2\times 10^{-6} mol/L, ce qui est encore au-dessus du seuil de 10−610^{-6}. Pour n=6n=6 : c6=0,201 000 000=2×10−7c_6=\frac{0{,}20}{1\,000\,000}=2\times 10^{-7} mol/L, ce qui passe bien en dessous. Il faut donc six étapes, ce qui confirme l'affichage. Remarquez que le facteur 22 du numérateur suffit à décider : sans lui, cinq étapes auraient suffi.

c)

On remplace la division par 1010 par une division par 22, et le seuil par 10−310^{-3}. Il faut 0,202n<10−3\frac{0{,}20}{2^{n}}<10^{-3}, c'est-à-dire 2n>2002^{n}>200. Or 27=1282^{7}=128 donne c7≈1,56×10−3c_7\approx 1{,}56\times 10^{-3}, encore trop, tandis que 28=2562^{8}=256 donne c8≈7,81×10−4c_8\approx 7{,}81\times 10^{-4}, qui convient. Il faut donc HUIT étapes pour perdre un facteur 200200, alors que six suffisaient pour en perdre 200 000200\,000 dans le protocole précédent. C'est toute la différence entre diviser par deux et diviser par dix : à chaque étape, le facteur choisi se retrouve en exposant.

d)

La boucle ne s'arrête jamais. Les valeurs prises par c sont 0,020{,}02, 0,0020{,}002, 0,00020{,}0002 et ainsi de suite : elles PASSENT À CÔTÉ de 10−610^{-6} sans jamais l'égaler, donc la condition c != 1e-6 reste vraie indéfiniment. Même si une valeur devait tomber exactement sur le seuil, la représentation approchée des décimaux en machine rendrait l'égalité douteuse. La règle est absolue et vaut bien au-delà de cet exercice : la condition d'arrêt d'une boucle numérique s'écrit toujours avec une INÉGALITÉ, jamais avec == ni !=. C'est le même principe qu'à l'exercice 8 e).

Le fil de la série entière se lit dans cet exercice : la boucle répète une opération que l'on sait poser à la main, la vérification passe par le calcul exact, et la seule difficulté réelle est la condition d'arrêt. Un programme faux ne se signale presque jamais par un message d'erreur, il se signale par un résultat que le calcul de contrôle contredit.

c = 0.20
n = 0
while c >= 1e-6:
    c = c/10
    n = n + 1
print(n)

Partie C : les classiques (/50)

Exercice 11 : Loi d'Ohm : exploiter une série de mesures

On mesure la tension UU (en volts) aux bornes d'un conducteur ohmique et l'intensité II (en ampères) du courant qui le traverse. La loi d'Ohm s'écrit U=R×IU=R\times I, où RR est la résistance en ohms.

Le programme suivant estime RR à partir des mesures.

Le schéma représente le montage : le voltmètre mesure UU aux bornes du conducteur ohmique, l'ampèremètre mesure II.

RIG+V+COMA+COM
U = [0, 1.5, 3.0, 4.5, 6.0]
I = [0, 0.032, 0.063, 0.097, 0.128]
s = 0
for i in range(1, len(U)):
    s = s + U[i]/I[i]
R = s/(len(U) - 1)
print(R)
  • a) Pourquoi la boucle commence-t-elle à l'indice 11 et non à l'indice 00 ?
  • b) Quelle valeur, arrondie au dixième, le programme affiche-t-il ?
  • c) Pourquoi divise-t-on la somme par len(U) - 1 et non par len(U) ?
  • d) On retient R=47 ΩR=47\ \Omega. Quelle tension faut-il appliquer pour obtenir une intensité de 0,200{,}20 A ?
  • e) Un élève saisit les intensités en milliampères : I = [0, 32, 63, 97, 128]. Quelle valeur de RR obtient-il, et d'un facteur combien se trompe-t-il ?

Tape tes réponses, la page te dit juste ou faux 0/6

a)
b)
c)
d)
e)
Voir la correction

Réponses

  • a) Éviter la division 00\frac{0}{0}
  • b) ≈46,9 Ω\approx 46{,}9\ \Omega
  • c) 44 rapports additionnés
  • d) 9,49{,}4 V
  • e) ≈0,0469 Ω\approx 0{,}0469\ \Omega : facteur 1 0001\,000
a)

Pour i=0i=0, le programme calculerait U[0]/I[0], soit 00\frac{0}{0} : une division par zéro, qui arrête le programme sur une erreur. Le premier point de mesure, courant nul et tension nulle, ne donne aucune information sur RR : on l'écarte en commençant à 11.

b)

Les quatre rapports valent 1,50,032≈46,9\frac{1{,}5}{0{,}032}\approx 46{,}9 ; 3,00,063≈47,6\frac{3{,}0}{0{,}063}\approx 47{,}6 ; 4,50,097≈46,4\frac{4{,}5}{0{,}097}\approx 46{,}4 ; 6,00,128≈46,9\frac{6{,}0}{0{,}128}\approx 46{,}9. Leur moyenne vaut environ 46,9 Ω46{,}9\ \Omega. Les rapports ne sont pas rigoureusement égaux : ce sont des mesures, entachées d'incertitude, et la moyenne en atténue l'effet.

c)

La somme contient 44 rapports, un par tour de boucle, puisque l'indice 00 a été écarté. Diviser par len(U), qui vaut 55, donnerait 187,85≈37,6 Ω\frac{187{,}8}{5}\approx 37{,}6\ \Omega, une valeur fausse d'un cinquième. On divise toujours par le nombre de valeurs réellement additionnées.

d)

U=R×I=47×0,20=9,4U=R\times I=47\times 0{,}20=9{,}4 V.

e)

Les intensités sont mille fois trop grandes, donc les rapports mille fois trop petits : R≈0,0469 ΩR\approx 0{,}0469\ \Omega. L'erreur est d'un facteur 1 0001\,000, et le programme ne la signale pas. Le seul contrôle possible est l'ordre de grandeur : un conducteur ohmique courant fait des dizaines ou des centaines d'ohms, pas un centième.

Le fil : un programme de traitement de mesures ne vaut que par ses données. Le choix des indices, du diviseur et des unités est la partie scientifique du travail, la boucle n'est que l'outil.

Exercice 12 : Masse volumique et identification d'un métal

La masse volumique d'un matériau vaut ρ=mV\rho=\frac{m}{V}. Valeurs de référence, en g/cm³ : aluminium 2,702{,}70 ; fer 7,877{,}87 ; cuivre 8,968{,}96 ; plomb 11,311{,}3.

Un échantillon métallique a une masse de 43,243{,}2 g. On le plonge dans une éprouvette graduée contenant 50,050{,}0 mL d'eau : le niveau monte à 66,066{,}0 mL.

50,0 mL66,0 mL43,2 gavantaprès
noms = ['aluminium', 'fer', 'cuivre', 'plomb']
valeurs = [2.70, 7.87, 8.96, 11.3]

def identifie(rho):
    meilleur = 0
    for i in range(1, len(valeurs)):
        if abs(rho - valeurs[i]) < abs(rho - valeurs[meilleur]):
            meilleur = i
    return noms[meilleur]
  • a) Quel est le volume de l'échantillon, en cm³ ?
  • b) Calculez sa masse volumique en g/cm³.
  • c) Convertissez cette masse volumique en kg/m³.
  • d) La fonction identifie(rho) renvoie le nom du métal de référence dont la masse volumique est la plus proche. Quel métal renvoie-t-elle pour l'échantillon ? Et pour ρ=8,9\rho=8{,}9 g/cm³ ?
  • e) Quelle est la masse d'un cube de fer de 55 cm d'arête, au gramme près ?

Tape tes réponses, la page te dit juste ou faux 0/6

a)
b)
c)
d)
e)
Voir la correction

Réponses

  • a) 16,016{,}0 cm³
  • b) 2,702{,}70 g/cm³
  • c) 2 7002\,700 kg/m³
  • d) Aluminium ; cuivre pour 8,98{,}9
  • e) ≈984\approx 984 g
a)

Le volume d'eau déplacé est le volume de l'objet : 66,0−50,0=16,066{,}0-50{,}0=16{,}0 mL, soit 16,016{,}0 cm³, puisque 11 mL =1=1 cm³.

b)

ρ=43,216,0=2,70\rho=\frac{43{,}2}{16{,}0}=2{,}70 g/cm³.

c)

11 g/cm³ =10−3 kg10−6 m3=1 000=\frac{10^{-3}\ \text{kg}}{10^{-6}\ \text{m}^{3}}=1\,000 kg/m³. Donc ρ=2 700\rho=2\,700 kg/m³. Un mètre cube d'aluminium pèse près de trois tonnes.

d)

La fonction calcule l'écart abs(rho - valeurs[i]) pour chaque métal et garde le plus petit. Pour 2,702{,}70, l'écart avec l'aluminium est nul : elle renvoie « aluminium ». Pour 8,98{,}9 : écarts 6,26{,}2 ; 1,031{,}03 ; 0,060{,}06 ; 2,42{,}4. Le plus petit est celui du cuivre. Comme pour un maximum, on initialise la recherche avec le premier élément de la liste, jamais avec une valeur arbitraire.

e)

Volume du cube : 53=1255^{3}=125 cm³. Masse : m=ρ×V=7,87×125=983,75m=\rho\times V=7{,}87\times 125=983{,}75 g, soit environ 984984 g. Un cube de fer qui tient dans la main pèse presque un kilogramme.

Le point de méthode : la masse volumique identifie un matériau parce qu'elle ne dépend pas de la taille de l'échantillon, et la mesure du volume par déplacement d'eau évite tout calcul géométrique.

Exercice 13 : Mouvement d'un palet : vitesses à partir de relevés

Une chronophotographie donne les positions de deux palets toutes les 0,20{,}2 s. Les instants sont dans t, les positions du palet A dans x et celles du palet B dans y, en mètres.

t = [0, 0.2, 0.4, 0.6, 0.8] ; x = [0, 0.30, 0.60, 0.90, 1.20] ; y = [0, 0.10, 0.40, 0.90, 1.60].

Les points AkA_{k} et BkB_{k} sont les positions à l'instant tk=0,2×kt_{k}=0{,}2\times k s.

00,20,40,60,811,21,41,6mpalet AA₀A₁A₂A₃A₄palet BB₀B₁B₂B₃B₄
for i in range(len(t) - 1):
    v = (x[i+1] - x[i]) / (t[i+1] - t[i])
    print(v)
  • a) Combien de valeurs le programme affiche-t-il ?
  • b) Quelles vitesses affiche-t-il pour le palet A ? Quelle est la nature de son mouvement ?
  • c) On remplace x par y. Quelles vitesses obtient-on ? De combien la vitesse augmente-t-elle d'un intervalle à l'autre ?
  • d) Quelle est la vitesse moyenne du palet B entre 00 et 0,80{,}8 s ?
  • e) Pourquoi la boucle s'arrête-t-elle à len(t) - 1 ?

Tape tes réponses, la page te dit juste ou faux 0/8

a)
b)
c)
d)
e)
Voir la correction

Réponses

  • a) 44 valeurs
  • b) 1,51{,}5 m/s constante : rectiligne uniforme
  • c) 0,50{,}5 ; 1,51{,}5 ; 2,52{,}5 ; 3,53{,}5 m/s : +1+1 m/s par intervalle
  • d) 2,02{,}0 m/s
  • e) x[i+1] sortirait de la liste
a)

range(len(t) - 1) vaut range(4) : 44 tours, donc 44 vitesses. Cinq positions délimitent quatre intervalles de temps.

b)

Chaque intervalle : 0,300,2=1,5\frac{0{,}30}{0{,}2}=1{,}5 m/s. Les quatre vitesses sont égales et le palet se déplace en ligne droite : le mouvement est rectiligne UNIFORME.

c)

0,100,2=0,5\frac{0{,}10}{0{,}2}=0{,}5 ; 0,300,2=1,5\frac{0{,}30}{0{,}2}=1{,}5 ; 0,500,2=2,5\frac{0{,}50}{0{,}2}=2{,}5 ; 0,700,2=3,5\frac{0{,}70}{0{,}2}=3{,}5 m/s. La vitesse augmente de 1,01{,}0 m/s à chaque intervalle : le mouvement est rectiligne ACCÉLÉRÉ.

d)

Distance totale sur durée totale : 1,600,8=2,0\frac{1{,}60}{0{,}8}=2{,}0 m/s. C'est aussi la moyenne des quatre vitesses, parce que les intervalles ont la même durée : 0,5+1,5+2,5+3,54=2,0\frac{0{,}5+1{,}5+2{,}5+3{,}5}{4}=2{,}0 ✓.

e)

La formule utilise x[i+1]. Pour i = len(t) - 1, l'indice i+1 vaudrait 55, qui n'existe pas dans une liste de cinq éléments : le programme s'arrêterait sur une erreur d'indice. Quand on compare un élément au SUIVANT, la boucle s'arrête un cran avant la fin.

Le fil : une vitesse moyenne est une variation de position sur une variation de temps, et une liste de positions en donne une par intervalle. Leur régularité, ou leur croissance, révèle la nature du mouvement.

Exercice 14 : Problème : réfraction et loi de Snell-Descartes

Quand la lumière passe d'un milieu d'indice n1n_{1} à un milieu d'indice n2n_{2}, les angles d'incidence i1i_{1} et de réfraction i2i_{2} vérifient n1sin⁡i1=n2sin⁡i2n_{1}\sin i_{1}=n_{2}\sin i_{2}. On prend n=1,00n=1{,}00 pour l'air et n=1,33n=1{,}33 pour l'eau.

La fonction suivante renvoie l'angle de réfraction en degrés, ou None s'il n'existe pas. Les angles sont arrondis au centième de degré.

La figure représente un rayon qui arrive de l'air sur l'eau, sous l'angle d'incidence i1i_{1} mesuré à partir de la normale.

i₁air : n = 1,00eau : n = 1,33normale
from math import sin, asin, radians, degrees

def refraction(n1, n2, i1):
    s = n1 * sin(radians(i1)) / n2
    if s > 1:
        return None
    return degrees(asin(s))
  • a) Que renvoie refraction(1.00, 1.33, 30) ?
  • b) Que renvoie refraction(1.00, 1.33, 60) ? Le rayon se rapproche-t-il ou s'éloigne-t-il de la normale ?
  • c) Que renvoie refraction(1.33, 1.00, 40), de l'eau vers l'air ?
  • d) Que renvoie refraction(1.33, 1.00, 60) ? Interprétez.
  • e) Calculez l'angle limite au-delà duquel la lumière ne sort plus de l'eau. Pourquoi la fonction utilise-t-elle radians et degrees ?

Tape tes réponses, la page te dit juste ou faux 0/7

a)
b)
c)
d)
e)
Voir la correction

Réponses

  • a) ≈22,08∘\approx 22{,}08^{\circ}
  • b) ≈40,63∘\approx 40{,}63^{\circ} : se rapproche de la normale
  • c) ≈58,75∘\approx 58{,}75^{\circ}
  • d) None : réflexion totale
  • e) ≈48,75∘\approx 48{,}75^{\circ} ; sin travaille en radians
a)

sin⁡i2=1,00×sin⁡30∘1,33=0,51,33≈0,376\sin i_{2}=\frac{1{,}00\times\sin 30^{\circ}}{1{,}33}=\frac{0{,}5}{1{,}33}\approx 0{,}376, donc i2≈22,08∘i_{2}\approx 22{,}08^{\circ}.

b)

sin⁡i2=sin⁡60∘1,33≈0,8661,33≈0,651\sin i_{2}=\frac{\sin 60^{\circ}}{1{,}33}\approx\frac{0{,}866}{1{,}33}\approx 0{,}651, donc i2≈40,63∘i_{2}\approx 40{,}63^{\circ}. L'angle de réfraction est plus petit que l'angle d'incidence : en entrant dans un milieu plus réfringent, le rayon se RAPPROCHE de la normale.

c)

sin⁡i2=1,33×sin⁡40∘≈0,855\sin i_{2}=1{,}33\times\sin 40^{\circ}\approx 0{,}855, donc i2≈58,75∘i_{2}\approx 58{,}75^{\circ}. En sortant de l'eau, le rayon s'éloigne de la normale.

d)

1,33×sin⁡60∘≈1,1521{,}33\times\sin 60^{\circ}\approx 1{,}152. Un sinus ne peut pas dépasser 11 : aucun angle ne convient et la fonction renvoie None. Physiquement, il n'y a pas de rayon réfracté : la lumière est entièrement réfléchie dans l'eau, c'est la RÉFLEXION TOTALE. Sans le test if s > 1, la fonction asin provoquerait une erreur.

e)

L'angle limite vérifie 1,33×sin⁡iℓ=11{,}33\times\sin i_{\ell}=1, soit sin⁡iℓ=11,33\sin i_{\ell}=\frac{1}{1{,}33} et iℓ≈48,75∘i_{\ell}\approx 48{,}75^{\circ}. Les fonctions sin et asin de Python travaillent en RADIANS : il faut convertir l'angle donné en degrés avant d'en prendre le sinus, puis reconvertir le résultat. Oublier radians ferait calculer le sinus de 3030 radians, un angle sans rapport.

Ce problème montre ce qu'un programme ajoute à une formule : il oblige à prévoir le cas où la formule n'a pas de solution, et ce cas est justement un phénomène physique réel.

Exercice 15 : Problème : période d'un son et mesure par écho

Un microphone enregistre un son. Le programme relève les instants, en millisecondes, de cinq maximums successifs du signal : tmax = [1.2, 3.7, 6.2, 8.7, 11.2].

On rappelle que la fréquence ff (en hertz) et la période TT (en secondes) vérifient f=1Tf=\frac{1}{T}, et que le son se propage à environ 340340 m/s dans l'air.

12345678910111213-1,5-1-0,50,511,51,23,76,28,711,2t (ms)signal
tmax = [1.2, 3.7, 6.2, 8.7, 11.2]
T = (tmax[-1] - tmax[0]) / (len(tmax) - 1)
f = 1000 / T
print(T, f)
  • a) Que vaut T, en millisecondes ?
  • b) Que vaut la fréquence f affichée, en hertz ?
  • c) Pourquoi calculer TT à partir du premier et du dernier maximum plutôt qu'à partir de deux maximums voisins ?
  • d) On émet un bref cri face à une falaise, et l'écho revient 0,350{,}35 s plus tard. À quelle distance est la falaise ?
  • e) Un sonar de bateau reçoit l'écho du fond 0,0800{,}080 s après l'émission. Le son se propage à 1 5001\,500 m/s dans l'eau. Quelle est la profondeur ?

Tape tes réponses, la page te dit juste ou faux 0/5

a)
b)
c)
d)
e)
Voir la correction

Réponses

  • a) T=2,5T=2{,}5 ms
  • b) f=400f=400 Hz
  • c) L'incertitude se répartit sur quatre périodes
  • d) 59,559{,}5 m
  • e) 6060 m
a)

Entre le premier et le dernier maximum, il y a 44 périodes : T=11,2−1,25−1=10,04=2,5T=\frac{11{,}2-1{,}2}{5-1}=\frac{10{,}0}{4}=2{,}5 ms. Le programme écrit tmax[-1] pour le dernier élément et len(tmax) - 1 pour le nombre d'intervalles.

b)

T=2,5T=2{,}5 ms =0,0025=0{,}0025 s, donc f=10,0025=400f=\frac{1}{0{,}0025}=400 Hz. Le programme écrit 1000 / T parce que TT est en millisecondes : c'est la conversion d'unité, cachée dans le 1 0001\,000.

c)

Chaque instant relevé est entaché d'une incertitude, par exemple 0,10{,}1 ms. Sur un seul intervalle de 2,52{,}5 ms, cette erreur pèse 4 %4\ \% ; répartie sur quatre périodes, elle ne pèse plus que 1 %1\ \%. Mesurer plusieurs périodes d'un coup améliore la précision : c'est la méthode employée au laboratoire avec un oscilloscope.

d)

Le son fait l'ALLER-RETOUR : il parcourt 340×0,35=119340\times 0{,}35=119 m, et la falaise est à la moitié, soit 59,559{,}5 m. Oublier de diviser par deux est l'erreur classique de tous les exercices d'écho.

e)

Aller-retour : 1 500×0,080=1201\,500\times 0{,}080=120 m, donc une profondeur de 6060 m. Le son va plus de quatre fois plus vite dans l'eau que dans l'air, ce qui explique qu'un écho sous-marin revienne si vite.

Le fil : la période se mesure sur plusieurs oscillations pour gagner en précision, et une distance par écho se divise toujours par deux.

Il manque quelque chose dans cette série ? Un type d'exercice que ton prof donne, un énoncé qui te bloque, une erreur repérée : dis-le-moi, je lis chaque demande.

L'envoi passe par ton espace gratuit : c'est ce qui me permet de te répondre et de te prévenir quand l'exercice est ajouté. Un courriel suffit, pas de mot de passe. Crée ton espace. Pas envie de créer un compte ? Écris-moi directement.

De quoi s'agit-il ?
Je lis chaque demande moi-même, personne d'autre ne la voit. Inutile d'écrire ton nom ou celui de ton école.
Quand ta demande est traitée, tu es prévenu par courriel et dans ton espace.

En envoyant, tu acceptes que je lise ta demande pour y répondre. Elle est gardée avec ton compte, effacée avec lui, et jamais publiée : politique de confidentialité.

Chapitre précédent Algorithmique et Python

© Ahmed Squalli Houssaini. Série publiée sur www.letuteurscientifique.ca/exercices/2nde-python-sciences. Libre pour l'usage personnel et en classe ; sa republication ailleurs demande une autorisation écrite (mentions légales).

Voir aussi

Vous cherchez un tuteur de maths en Seconde à Montréal ?

Contactez-moi pour une première séance. On travaille sur des exercices calibrés sur le niveau réel des contrôles au Lycée Marie de France et au Collège Stanislas.

Site par Studio Squalli