Coefficients directeurs de cordes

Trois cordes

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
Évaluations restantes : 10/10

.128013:pbv(40i2+edxm3s7= 1o5w_lSnatf-)9h]6,crg.*[yPku8/050m0l0D0C0i0z0q0t0M0z0C0q0q0s010D0i0c010406050q0V0o0o0C0N0S040A0v0z0V0=0v0B050X0|0~10120`0c041b1i051l0X1l1n1i0`0m0i0e0*0,0.0:0I0i0O0I0z1B0I0D0^050#0d0z0l1w0-0/011A1C1E1C0D1K1M1I0D0d0v0m121J0N1j0D0I0*150q0c0C0B0:0j011O1y010E0%0l0B0C0o0l1I1:1=1`1Q1}1M20220^0a0t0T0N0v0c0v0q0i180B0t0Z1.0N0N0l0M2n1b250B1j0X1,2A0D1*1)1+0m270:1E0B1 2k1I1t1v0+1P2K0i2M0B1$1u1I0c2t1j2y2A2(0{1;2o2S1{2X0N0 0z0^0t0u2x2,0_2+262.1Q2:2=2@0j2`1=2|2y2J01310C2?040t0p352z0`382 0:3b3d0t0g3h372,393n2@0w3r3j3t3l3a0v2;3c2@0K3y2}2-1x303D323e0r3I3k3L3m3N3F3e0W3R3A3T3C3E3o0H3Z2~3#3v040u0h3*3K2T3$3O0u2_1c2{3z3+3?3-0u343{361k2$1b2Q2D0m2H390M1$231j481m462*432z054d0Z2%3!3?0U0^0Z0E3r3J390x2@4x3S3 0E0^4w4l4q3~1{0@040f4C4r2/0^0n4P4K1Q4M0G0b3y0t4#0t4y3B4t042t0D0V0N1a4I4%4D4R044T4I4(3#0v0^0Q0Q4U3=1{0o0i0^3g4I06594{4s4u0l4H2*4?1Q4A3e513u4F044d5e0E0q0y4d0N0Z0q5l3B4M4O4`5h3m0^0C5y3#4M0L3r4=4Q300^0l0y0 4_5g5N0:4X4Z584$5M4V5E5o0v5q5x4;5b1{4}040s5L5-4W0^0R0J4!4$5?5%0E0y0Z0y5G5,5D015/5;645V3a4G5H3?5A6d4@635U5$014X5{4#5}014*0E3D5=650B5P6u6a0v5j2V6y6k0B0d0^0N1=0O0l6g5@4N6M5%5Q5S6D521Q5/0k6T39540^3`6j6U5W0^4Y6n5!5#6(6b040I6Y3B676?3#6!3.6_3?5/0X6}535504426%395/4 6P6:6L5Z6-6o6v0^5p0E5 1t0N716V0^682(6.396f5C6a6w045f2{6p7u763B7x6i2{7s6@0^6X696E0^6=7v6k6m7M6/5/0F7n5~605Q7G44657S7r6p6 7X6:7P2(067e7f7w7h5)7j5+7D4|0^0P7a7F0c0c1 0m7a7C7A7g5(5q600i7m7Q6/7(3|5!6p4*4,4.4:7)887i5r3I0X4o0l2A2#8v471u492D2F2B1#1%2D0C1L8y0X480`8L0!0$0(04.

###(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
Évaluations restantes : 10/10

.128013:pbv(40i2+edxm3s7= 1o5w_lSnatf-)9h]6,crg.*[yPku8/050m0l0D0C0i0z0q0t0M0z0C0q0q0s010D0i0c010406050q0V0o0o0C0N0S040A0v0z0V0=0v0B050X0|0~10120`0c041b1i051l0X1l1n1i0`0m0i0e0*0,0.0:0I0i0O0I0z1B0I0D0^050#0d0z0l1w0-0/011A1C1E1C0D1K1M1I0D0d0v0m121J0N1j0D0I0*150q0c0C0B0:0j011O1y010E0%0l0B0C0o0l1I1:1=1`1Q1}1M20220^0a0t0T0N0v0c0v0q0i180B0t0Z1.0N0N0l0M2n1b250B1j0X1,2A0D1*1)1+0m270:1E0B1 2k1I1t1v0+1P2K0i2M0B1$1u1I0c2t1j2y2A2(0{1;2o2S1{2X0N0 0z0^0t0u2x2,0_2+262.1Q2:2=2@0j2`1=2|2y2J01310C2?040t0p352z0`382 0:3b3d0t0g3h372,393n2@0w3r3j3t3l3a0v2;3c2@0K3y2}2-1x303D323e0r3I3k3L3m3N3F3e0W3R3A3T3C3E3o0H3Z2~3#3v040u0h3*3K2T3$3O0u2_1c2{3z3+3?3-0u343{361k2$1b2Q2D0m2H390M1$231j481m462*432z054d0Z2%3!3?0U0^0Z0E3r3J390x2@4x3S3 0E0^4w4l4q3~1{0@040f4C4r2/0^0n4P4K1Q4M0G0b3y0t4#0t4y3B4t042t0D0V0N1a4I4%4D4R044T4I4(3#0v0^0Q0Q4U3=1{0o0i0^3g4I06594{4s4u0l4H2*4?1Q4A3e513u4F044d5e0E0q0y4d0N0Z0q5l3B4M4O4`5h3m0^0C5y3#4M0L3r4=4Q300^0l0y0 4_5g5N0:4X4Z584$5M4V5E5o0v5q5x4;5b1{4}040s5L5-4W0^0R0J4!4$5?5%0E0y0Z0y5G5,5D015/5;645V3a4G5H3?5A6d4@635U5$014X5{4#5}014*0E3D5=650B5P6u6a0v5j2V6y6k0B0d0^0N1=0O0l6g5@4N6M5%5Q5S6D521Q5/0k6T39540^3`6j6U5W0^4Y6n5!5#6(6b040I6Y3B676?3#6!3.6_3?5/0X6}535504426%395/4 6P6:6L5Z6-6o6v0^5p0E5 1t0N716V0^682(6.396f5C6a6w045f2{6p7u763B7x6i2{7s6@0^6X696E0^6=7v6k6m7M6/5/0F7n5~605Q7G44657S7r6p6 7X6:7P2(067e7f7w7h5)7j5+7D4|0^0P7a7F0c0c1 0m7a7C7A7g5(5q600i7m7Q6/7(3|5!6p4*4,4.4:7)887i5r3I0X4o0l2A2#8v471u492D2F2B1#1%2D0C1L8y0X480`8L0!0$0(04.
En utilisant une liste en compréhension

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 [action for variable in ensemble_a_parcourir]

On fournit ci-dessous quelques exemples :

🐍 Console Python
>>> [x for x in range(5)]  # les nombres entre 0 (inclus) et 5 (exclu)
[0, 1, 2, 3, 4]
>>> [2*x for x in range(1, 6)]  # les doubles des nombres entre 1 (inclus) et 6 (exclu)
[2, 4, 6, 8, 10]
>>> [x**2 for x in (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
Évaluations restantes : 10/10

.128013:pbv(4i2+edxm3s= 1o5w_lSnatf-)h]6,crg*[yPku/050l0k0B0A0h0x0p0r0J0x0A0p0p0q010B0h0c010406050p0R0n0n0A0K0O040y0t0x0R0-0t0z050S0@0_0{0}0=0c04161d051g0S1g1i1d0=0l0h0e0#0%0)0+0F0h0L0F0x1w0F0B0:050W0d0x0k1r0(0*011v1x1z1x0B1F1H1D0B0d0t0l0}1E0K1e0B0F0#100p0c0A0z0+0i011J1t010C0Y0k0z0A0n0k1D1+1-1=1L1^1H1{1}0:0a0r0P0K0t0c0t0p0h130z0r0U1)0K0K0k0J2i16200z1e0S1%2v0B1#1!1$0l220+1z0z1`2f1D1o1q0$1K2F0h2H0z1X1p1D0c2o1e2t2v2Z0?1,2j2N1?2S0K0`0x0:0s2s2%0;2$212)1L2+2-0:0i2;1-2?2t2E012{0A2.040o2 2u0=322_0+35370g3a312%333g0:0u3j3c3l3e340t2,360:0H3j1f2X162L2y0l2C330J1X1~1e3E1h3C2#172=053J0U2Y3s1s1L0Q0:0U0C3A3d3Y0+0v0:0r3(3X2O340C0:3%3R302@2(3*010/040f3/2^3}0z0:0m423|3;3 0E0b3q0r4f3.3)3;3!042o0B0R0K153_2u4h3:2*4648330t0:0M0M4x3t0n0h0:394r0;063r434j3#0k3^2#4i1?3,043.4J3{3m3?043J4Q0C0p0w3J0K0U0p4D3}3 414Y4T2`0:0A4:4a0:0I3j4t4N4v040k0w0`474@4u1L4b4d4J064g51491?4k4m4o4q2Z5h333 0N4?4S5a3f3@4|1?4=5y4_044{4J5p3t4z040j504Z4E4G042:5F5M3}5I0S5L4^0+4F2}5B0+5I4B5#340:0k5)4b5W5v015I0D5/525C4R3S5X3~0:5t5{5:455D5-0:0E0E5@5i1L5U68335Z042~595^5$4A4C6h690+5A6m4y0:5?6q3t625,6u4;656c3t4k0C3v6B445+6G3;0t4V2Q6J2*0d0:0K1-0L6x5u6i5}405)6w560A585o5S6K0:5K5R5|6e5Q6W6n6Y0E0G3q163U0k2v2W6}3D1p3F2y2A2w1W1Y2y0A1G700S3E0=7d0V0X0Z04.

###(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
Évaluations restantes : 10/10

.128013:pbv(4i2+edxm3s= 1o5w_lSnatf-)h]6,crg*[yPku/050l0k0B0A0h0x0p0r0J0x0A0p0p0q010B0h0c010406050p0R0n0n0A0K0O040y0t0x0R0-0t0z050S0@0_0{0}0=0c04161d051g0S1g1i1d0=0l0h0e0#0%0)0+0F0h0L0F0x1w0F0B0:050W0d0x0k1r0(0*011v1x1z1x0B1F1H1D0B0d0t0l0}1E0K1e0B0F0#100p0c0A0z0+0i011J1t010C0Y0k0z0A0n0k1D1+1-1=1L1^1H1{1}0:0a0r0P0K0t0c0t0p0h130z0r0U1)0K0K0k0J2i16200z1e0S1%2v0B1#1!1$0l220+1z0z1`2f1D1o1q0$1K2F0h2H0z1X1p1D0c2o1e2t2v2Z0?1,2j2N1?2S0K0`0x0:0s2s2%0;2$212)1L2+2-0:0i2;1-2?2t2E012{0A2.040o2 2u0=322_0+35370g3a312%333g0:0u3j3c3l3e340t2,360:0H3j1f2X162L2y0l2C330J1X1~1e3E1h3C2#172=053J0U2Y3s1s1L0Q0:0U0C3A3d3Y0+0v0:0r3(3X2O340C0:3%3R302@2(3*010/040f3/2^3}0z0:0m423|3;3 0E0b3q0r4f3.3)3;3!042o0B0R0K153_2u4h3:2*4648330t0:0M0M4x3t0n0h0:394r0;063r434j3#0k3^2#4i1?3,043.4J3{3m3?043J4Q0C0p0w3J0K0U0p4D3}3 414Y4T2`0:0A4:4a0:0I3j4t4N4v040k0w0`474@4u1L4b4d4J064g51491?4k4m4o4q2Z5h333 0N4?4S5a3f3@4|1?4=5y4_044{4J5p3t4z040j504Z4E4G042:5F5M3}5I0S5L4^0+4F2}5B0+5I4B5#340:0k5)4b5W5v015I0D5/525C4R3S5X3~0:5t5{5:455D5-0:0E0E5@5i1L5U68335Z042~595^5$4A4C6h690+5A6m4y0:5?6q3t625,6u4;656c3t4k0C3v6B445+6G3;0t4V2Q6J2*0d0:0K1-0L6x5u6i5}405)6w560A585o5S6K0:5K5R5|6e5Q6W6n6Y0E0G3q163U0k2v2W6}3D1p3F2y2A2w1W1Y2y0A1G700S3E0=7d0V0X0Z04.

  1. définir la fonction sur \(\mathbb{R}\) assure que \(f\) est définie pour toutes les valeurs de \(a\) et \(a+h\). ↩