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

.128013s3o_8bcdufvg/0ly n7apS.r1-me,(P2=4:+twki9][5h*x)6050i0C0L0u0O0p0b0r0h0p0u0b0b0H010L0O0v010406050b0j0B0B0u0y0q040w0d0p0j0=0d0s050n0|0~10120`0v041b1i051l0n1l1n1i0`0i0O0l0*0,0.0:0T0O0m0T0p1B0T0L0^050#0g0p0C1w0-0/011A1C1E1C0L1K1M1I0L0g0d0i121J0y1j0L0T0*150b0v0u0s0:0G011O1y010k0%0C0s0u0B0C1I1:1=1`1Q1}1M20220^0a0r0F0y0d0v0d0b0O180s0r0Z1.0y0y0C0h2n1b250s1j0n1,2A0L1*1)1+0i270:1E0s1 2k1I1t1v0+1P2K0O2M0s1$1u1I0v2t1j2y2A2(0{1;2o2S1{2X0y0 0p0^0r0z2x2,0_2+262.1Q2:2=2@0G2`1=2|2y2J01310u2?040r0c352z0`382 0:3b3d0r0I3h372,393n2@0S3r3j3t3l3a0d2;3c2@0X3y2}2-1x303D323e0t3I3k3L3m3N3F3e0f3R3A3T3C3E3o0P3Z2~3#3v040z0o3*3K2T3$3O0z2_1c2{3z3+3?3-0z343{361k2$1b2Q2D0i2H390h1$231j481m462*432z054d0Z2%3!3?0N0^0Z0k3r3J390M2@4x3S3 0k0^4w4l4q3~1{0@040E4C4r2/0^0V4P4K1Q4M0W0J3y0r4#0r4y3B4t042t0L0j0y1a4I4%4D4R044T4I4(3#0d0^0U0U4U3=1{0B0O0^3g4I06594{4s4u0C4H2*4?1Q4A3e513u4F044d5e0k0b0e4d0y0Z0b5l3B4M4O4`5h3m0^0u5y3#4M0D3r4=4Q300^0C0e0 4_5g5N0:4X4Z584$5M4V5E5o0d5q5x4;5b1{4}040H5L5-4W0^0R0Q4!4$5?5%0k0e0Z0e5G5,5D015/5;645V3a4G5H3?5A6d4@635U5$014X5{4#5}014*0k3D5=650s5P6u6a0d5j2V6y6k0s0g0^0y1=0m0C6g5@4N6M5%5Q5S6D521Q5/0K6T39540^3`6j6U5W0^4Y6n5!5#6(6b040T6Y3B676?3#6!3.6_3?5/0n6}535504426%395/4 6P6:6L5Z6-6o6v0^5p0k5 1t0y716V0^682(6.396f5C6a6w045f2{6p7u763B7x6i2{7s6@0^6X696E0^6=7v6k6m7M6/5/0A7n5~605Q7G44657S7r6p6 7X6:7P2(067e7f7w7h5)7j5+7D4|0^0x7a7F0v0v1 0i7a7C7A7g5(5q600O7m7Q6/7(3|5!6p4*4,4.4:7)887i5r3I0n4o0C2A2#8v471u492D2F2B1#1%2D0u1L8y0n480`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

.128013s3o_8bcdufvg/0ly n7apS.r1-me,(P2=4:+twki9][5h*x)6050i0C0L0u0O0p0b0r0h0p0u0b0b0H010L0O0v010406050b0j0B0B0u0y0q040w0d0p0j0=0d0s050n0|0~10120`0v041b1i051l0n1l1n1i0`0i0O0l0*0,0.0:0T0O0m0T0p1B0T0L0^050#0g0p0C1w0-0/011A1C1E1C0L1K1M1I0L0g0d0i121J0y1j0L0T0*150b0v0u0s0:0G011O1y010k0%0C0s0u0B0C1I1:1=1`1Q1}1M20220^0a0r0F0y0d0v0d0b0O180s0r0Z1.0y0y0C0h2n1b250s1j0n1,2A0L1*1)1+0i270:1E0s1 2k1I1t1v0+1P2K0O2M0s1$1u1I0v2t1j2y2A2(0{1;2o2S1{2X0y0 0p0^0r0z2x2,0_2+262.1Q2:2=2@0G2`1=2|2y2J01310u2?040r0c352z0`382 0:3b3d0r0I3h372,393n2@0S3r3j3t3l3a0d2;3c2@0X3y2}2-1x303D323e0t3I3k3L3m3N3F3e0f3R3A3T3C3E3o0P3Z2~3#3v040z0o3*3K2T3$3O0z2_1c2{3z3+3?3-0z343{361k2$1b2Q2D0i2H390h1$231j481m462*432z054d0Z2%3!3?0N0^0Z0k3r3J390M2@4x3S3 0k0^4w4l4q3~1{0@040E4C4r2/0^0V4P4K1Q4M0W0J3y0r4#0r4y3B4t042t0L0j0y1a4I4%4D4R044T4I4(3#0d0^0U0U4U3=1{0B0O0^3g4I06594{4s4u0C4H2*4?1Q4A3e513u4F044d5e0k0b0e4d0y0Z0b5l3B4M4O4`5h3m0^0u5y3#4M0D3r4=4Q300^0C0e0 4_5g5N0:4X4Z584$5M4V5E5o0d5q5x4;5b1{4}040H5L5-4W0^0R0Q4!4$5?5%0k0e0Z0e5G5,5D015/5;645V3a4G5H3?5A6d4@635U5$014X5{4#5}014*0k3D5=650s5P6u6a0d5j2V6y6k0s0g0^0y1=0m0C6g5@4N6M5%5Q5S6D521Q5/0K6T39540^3`6j6U5W0^4Y6n5!5#6(6b040T6Y3B676?3#6!3.6_3?5/0n6}535504426%395/4 6P6:6L5Z6-6o6v0^5p0k5 1t0y716V0^682(6.396f5C6a6w045f2{6p7u763B7x6i2{7s6@0^6X696E0^6=7v6k6m7M6/5/0A7n5~605Q7G44657S7r6p6 7X6:7P2(067e7f7w7h5)7j5+7D4|0^0x7a7F0v0v1 0i7a7C7A7g5(5q600O7m7Q6/7(3|5!6p4*4,4.4:7)887i5r3I0n4o0C2A2#8v471u492D2F2B1#1%2D0u1L8y0n480`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

.128013s3o_bcdufvg/ly napSr1-me,(P2=4:+twki][5h*x)6050h0y0H0r0K0n0b0p0g0n0r0b0b0D010H0K0s010406050b0i0x0x0r0u0o040t0d0n0i0-0d0q050m0@0_0{0}0=0s04161d051g0m1g1i1d0=0h0K0k0#0%0)0+0O0K0l0O0n1w0O0H0:050W0f0n0y1r0(0*011v1x1z1x0H1F1H1D0H0f0d0h0}1E0u1e0H0O0#100b0s0r0q0+0C011J1t010j0Y0y0q0r0x0y1D1+1-1=1L1^1H1{1}0:0a0p0B0u0d0s0d0b0K130q0p0U1)0u0u0y0g2i16200q1e0m1%2v0H1#1!1$0h220+1z0q1`2f1D1o1q0$1K2F0K2H0q1X1p1D0s2o1e2t2v2Z0?1,2j2N1?2S0u0`0n0:0v2s2%0;2$212)1L2+2-0:0C2;1-2?2t2E012{0r2.040c2 2u0=322_0+35370E3a312%333g0:0N3j3c3l3e340d2,360:0S3j1f2X162L2y0h2C330g1X1~1e3E1h3C2#172=053J0U2Y3s1s1L0J0:0U0j3A3d3Y0+0I0:0p3(3X2O340j0:3%3R302@2(3*010/040A3/2^3}0q0:0Q423|3;3 0R0F3q0p4f3.3)3;3!042o0H0i0u153_2u4h3:2*4648330d0:0P0P4x3t0x0K0:394r0;063r434j3#0y3^2#4i1?3,043.4J3{3m3?043J4Q0j0b0e3J0u0U0b4D3}3 414Y4T2`0:0r4:4a0:0z3j4t4N4v040y0e0`474@4u1L4b4d4J064g51491?4k4m4o4q2Z5h333 0M4?4S5a3f3@4|1?4=5y4_044{4J5p3t4z040G504Z4E4G042:5F5M3}5I0m5L4^0+4F2}5B0+5I4B5#340:0y5)4b5W5v015I0w5/525C4R3S5X3~0:5t5{5:455D5-0:0R0R5@5i1L5U68335Z042~595^5$4A4C6h690+5A6m4y0:5?6q3t625,6u4;656c3t4k0j3v6B445+6G3;0d4V2Q6J2*0f0:0u1-0l6x5u6i5}405)6w560r585o5S6K0:5K5R5|6e5Q6W6n6Y0R0L3q163U0y2v2W6}3D1p3F2y2A2w1W1Y2y0r1G700m3E0=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

.128013s3o_bcdufvg/ly napSr1-me,(P2=4:+twki][5h*x)6050h0y0H0r0K0n0b0p0g0n0r0b0b0D010H0K0s010406050b0i0x0x0r0u0o040t0d0n0i0-0d0q050m0@0_0{0}0=0s04161d051g0m1g1i1d0=0h0K0k0#0%0)0+0O0K0l0O0n1w0O0H0:050W0f0n0y1r0(0*011v1x1z1x0H1F1H1D0H0f0d0h0}1E0u1e0H0O0#100b0s0r0q0+0C011J1t010j0Y0y0q0r0x0y1D1+1-1=1L1^1H1{1}0:0a0p0B0u0d0s0d0b0K130q0p0U1)0u0u0y0g2i16200q1e0m1%2v0H1#1!1$0h220+1z0q1`2f1D1o1q0$1K2F0K2H0q1X1p1D0s2o1e2t2v2Z0?1,2j2N1?2S0u0`0n0:0v2s2%0;2$212)1L2+2-0:0C2;1-2?2t2E012{0r2.040c2 2u0=322_0+35370E3a312%333g0:0N3j3c3l3e340d2,360:0S3j1f2X162L2y0h2C330g1X1~1e3E1h3C2#172=053J0U2Y3s1s1L0J0:0U0j3A3d3Y0+0I0:0p3(3X2O340j0:3%3R302@2(3*010/040A3/2^3}0q0:0Q423|3;3 0R0F3q0p4f3.3)3;3!042o0H0i0u153_2u4h3:2*4648330d0:0P0P4x3t0x0K0:394r0;063r434j3#0y3^2#4i1?3,043.4J3{3m3?043J4Q0j0b0e3J0u0U0b4D3}3 414Y4T2`0:0r4:4a0:0z3j4t4N4v040y0e0`474@4u1L4b4d4J064g51491?4k4m4o4q2Z5h333 0M4?4S5a3f3@4|1?4=5y4_044{4J5p3t4z040G504Z4E4G042:5F5M3}5I0m5L4^0+4F2}5B0+5I4B5#340:0y5)4b5W5v015I0w5/525C4R3S5X3~0:5t5{5:455D5-0:0R0R5@5i1L5U68335Z042~595^5$4A4C6h690+5A6m4y0:5?6q3t625,6u4;656c3t4k0j3v6B445+6G3;0d4V2Q6J2*0f0:0u1-0l6x5u6i5}405)6w560r585o5S6K0:5K5R5|6e5Q6W6n6Y0R0L3q163U0y2v2W6}3D1p3F2y2A2w1W1Y2y0r1G700m3E0=7d0V0X0Z04.

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