En géométrie on appelle « corde » un segment reliant deux points distincts d'une courbe.
On considère dans cet exercice la courbe \(C_f\) représentant une fonction \(f\) définie1 sur \(\mathbb{R}\). Soit \(a\) un nombre réel et \(A\) le point de \(C_f\) d'abscisse \(a\).
On souhaite calculer les coefficients directeurs de plusieurs cordes, toutes issues du point \(A\). Pour une corde passant par les points de coordonnées \(\left(~a~;~f(a)~\right)\) et \(\left(~a+h~;~f(a+h)~\right)\), ce coefficient directeur vaut :
\[\tau_a(h)=\frac{f(a+h)-f(a)}{h}\]
Afin de pouvoir observer l'évolution de ces coefficients directeurs, on les calculera pour les valeurs de \(h\) successivement égales à \(\dfrac{1}{2^0}\), \(\dfrac{1}{2^1}\), ..., \(\dfrac{1}{2^{e_{max}}}\) (inclus).
Puissances de \(2\) ?
Python représente les nombres en binaire. Sans rentrer dans les détails, le fait d'utiliser des valeurs de \(h\) pouvant s'écrire sous la forme \(2^k\) permet, bien souvent, d'éviter des erreurs d'arrondis.
Sur la figure ci-contre, on a pris :
\(f:x\mapsto x^3\) ;
\(a=0\) ; le point \(A\) a donc pour coordonnées \((0~;~f(0))\) ;
\(e_{max}={2}\) et on a donc calculé les \(3\) coefficients directeurs pour \(h \in \left\{\dfrac{1}{2^0}~;~\dfrac{1}{2^{1}}~;~\dfrac{1}{2^2}\right\}\).
Les coefficients directeurs calculés sont :
\(a\)
\(h\)
\(a+h\)
\(\tau_0(h)\)
\(0\)
\(1\)
\(1\)
\(1\)
\(0\)
\(0,5\)
\(0,5\)
\(0,25\)
\(0\)
\(0,25\)
\(0,25\)
\(0,0625\)
On demande d'écrire la fonction coeffs_cordes qui prend en paramètres un nombre a et un entier e_max.
Cette fonction renvoie la liste des coefficients directeurs des cordes issues du point \(A~\left(~a~;~f(a)~\right)\) et passant par les points de coordonnées \(\left(~a+h~;~f(a+h)~\right)\) pour les valeurs de \(h\) comprises entre \(\dfrac{1}{2^0}\) et \(\dfrac{1}{2^{e_{max}}}\) (inclus l'un et l'autre).
Exemples
>>> # cordes issues de (0, f(0)) pour h = 1 ; h = 0,5 et h = 0,25 = 1/2^2>>> coeffs_cordes(0,2)[1.0, 0.25, 0.0625]
>>> # cordes issues de (0, f(0)) pour h = 1 ; h = 0,5 ; h = 0,25 et h = 0,125 = 1/2^3>>> coeffs_cordes(0,3)[1.0, 0.25, 0.0625, 0.015625]
>>> # cordes issues de (2, f(2)) pour h = 1 ; ... et h = 0,015625 = 1/2^6>>> coeffs_cordes(2,6)[19.0, 15.25, 13.5625, 12.765625, 12.37890625, 12.1884765625, 12.093994140625]
On propose deux méthodes produisant l'une et l'autre le résultat attendu :
En construisant une liste au fur et à mesure
Dans cette version :
on crée dans un premier temps une liste vide qui contiendra les différents coefficients ;
on parcourt l'ensemble des exposants e compris entre 0 et e_max (inclus) ;
pour chacun, on calcule le coefficient directeur de la corde ;
on ajoute cette valeur à la liste des coefficients.
On rappelle les instructions suivantes :
🐍 Console Python
>>> coeffs=[]# création d'une liste vide>>> coeffs.append(1)# ajout de la valeur 1 (à la fin)>>> coeffs.append(2)# ajout de la valeur 2 (à la fin)>>> coeffs[1, 2]
###(Dés-)Active le code après la ligne # Tests (insensible à la casse) (Ctrl+I)
Entrer ou sortir du mode "deux colonnes" (Alt+: ; Ctrl pour inverser les colonnes)
Entrer ou sortir du mode "plein écran" (Esc)
Tronquer ou non le feedback dans les terminaux (sortie standard & stacktrace / relancer le code pour appliquer)
Si activé, le texte copié dans le terminal est joint sur une seule ligne avant d'être copié dans le presse-papier
Dans cette version, on utilise une liste en compréhension qui permet de générer le résultat attendu.
La syntaxe Python des listes en compréhension est [actionforvariableinensemble_a_parcourir]
On fournit ci-dessous quelques exemples :
🐍 Console Python
>>> [xforxinrange(5)]# les nombres entre 0 (inclus) et 5 (exclu)[0, 1, 2, 3, 4]>>> [2*xforxinrange(1,6)]# les doubles des nombres entre 1 (inclus) et 6 (exclu)[2, 4, 6, 8, 10]>>> [x**2forxin(2,3,5,7)]# les carrés des nombres 2, 3, 5 et 7 (dans cet ordre)[4, 9, 25, 49]
###(Dés-)Active le code après la ligne # Tests (insensible à la casse) (Ctrl+I)
Entrer ou sortir du mode "deux colonnes" (Alt+: ; Ctrl pour inverser les colonnes)
Entrer ou sortir du mode "plein écran" (Esc)
Tronquer ou non le feedback dans les terminaux (sortie standard & stacktrace / relancer le code pour appliquer)
Si activé, le texte copié dans le terminal est joint sur une seule ligne avant d'être copié dans le presse-papier
# Tests(insensible à la casse)(Ctrl+I)
(Alt+: ; Ctrl pour inverser les colonnes)
(Esc)