Objectif du projet : modéliser une source électrique réelle à partir de sa caractéristique expérimentale, déterminer numériquement le point de fonctionnement du circuit pour différentes charges, puis mettre en évidence la valeur de résistance qui maximise la puissance transmise — la condition d'adaptation d'impédance.
Ce projet est autonome : tu n'as besoin d'aucun autre document, les données de la caractéristique tension-courant sont recopiées directement dans le script. Chaque étape contient un script incomplet à compléter, puis à copier-coller dans Thonny (ou dans la console Basthon tout en bas de la page si tu n'as pas Thonny sous la main).
Contexte : pourquoi adapter une charge à sa source ?
- Les problématiques d'adaptation d'une charge à une source électrique sont omniprésentes dans le monde technologique. Le réseau électrique français lui-même doit en permanence être adapté au parc de centrales qui l'alimentent, pour éviter certains gaspillages énergétiques.
- Une source électrique réelle (une pile, une batterie…) n'est jamais parfaite : sa tension de sortie chute légèrement lorsqu'elle débite du courant, à cause d'une résistance interne. On peut la représenter par l'association en série d'une source idéale de f.é.m.
E0et d'une résistance de sortieRs. - Brancher une résistance de charge
ren sortie de cette source, c'est créer un circuit dont le fonctionnement dépend à la fois de la source (E0,Rs) et de la charge (r). Ce projet cherche la valeur derqui reçoit le plus de puissance possible — la condition dite d'adaptation d'impédance.
La caractéristique de la source réelle
- La source réelle étudiée a été caractérisée expérimentalement dans plusieurs états de charge (
S = 10 %,25 %,50 %,75 %,90 %), donnant une famille de courbes tension-courant très proches les unes des autres. - On ne retient ici que l'état
S = 90 %: un pointage des valeurs de tensionu(en V) et de couranti(en A) a été réalisé et saisi dans deux tableaux. - Le script ci-dessous est déjà complet : copie-le tel quel dans Thonny (ou dans Basthon) pour commencer.
import numpy as np
import matplotlib.pyplot as plt
from scipy.optimize import bisect
# Courant débité par la source réelle (A), état de charge S = 90 %
i = np.array([0, 0.2, 0.4, 0.6, 0.8, 1, 1.2, 1.4, 1.6, 1.8])
# Tension à ses bornes (V), pour chacune de ces valeurs de courant
u = np.array([1, 0.9, 0.8, 0.7, 0.6, 0.5, 0.4, 0.3, 0.2, 0.1])
Tracer la caractéristique, puis la modéliser
- Trace
uen fonction dei, en points bleus ('bo') puis relie-les d'un trait rouge ('r'). - Modélise ensuite ce nuage de points par une droite avec
np.polyfit(i, u, 1), et affiche le résultat : nomme-lerl(pour « régression linéaire »). - Comme
polyfitrenvoie une liste de nombres et non une fonction utilisable directement, définis une fonctionurmod(i)qui renvoierl[1] + rl[0]*i— la tension prédite par le modèle pour un courantidonné. - Superpose enfin ce modèle aux points mesurés, en ronds rouges (
'ro').
# TODO : trace les points mesurés
plt.plot(_, _, '__')
plt.plot(_, _, '_')
# TODO : régression linéaire de u en fonction de i
rl = np.polyfit(_, _, _)
print(rl)
# TODO : fonction modèle construite à partir des résultats de polyfit
def urmod(i) :
return rl[_] + rl[_]*i
plt.plot(i, urmod(i), '__')
plt.show()
Indice
np.polyfit(i, u, 1) cherche le polynôme de degré 1 (une droite a·i + b) qui approche au mieux les points : il renvoie [a, b], donc ici rl[0] est la pente et rl[1] l'ordonnée à l'origine.
rl affiche [-0.5 1.] : une pente de -0,5 et une ordonnée à l'origine de 1. Physiquement, cela signifie une f.é.m. à vide E0 = 1 V et une résistance de sortie Rs = 0,5 Ω — des ordres de grandeur cohérents pour une batterie portable.
Superposer les droites de charge
- Une résistance de charge
robéit à la loi d'Ohm :ur = r × i. Sur le même graphe que la caractéristique de la source, chaque valeur derdessine donc une droite passant par l'origine. - Crée une liste de valeurs de résistances à tester avec
rliste = np.arange(10)/5(des valeurs qui encadrentRs), puis, dans une bouclefor r in rliste :, calculeur = r*iet trace-la.
rliste = np.arange(10) / _
plt.plot(i, u, '__')
plt.plot(i, u, '_')
# TODO : trace une droite de charge ur = r*i pour chaque valeur de r
for r in ______ :
ur = _ * _
plt.plot(i, ur)
plt.show()
Un éventail de droites colorées, chacune croisant la caractéristique rouge de la source en un point différent : chaque valeur de r engendre son propre point de fonctionnement. On pourrait lire ces intersections graphiquement, mais ce serait fastidieux et peu précis — d'où l'intérêt de la méthode numérique qui suit.
Trouver le point de fonctionnement avec bisect
- Le point de fonctionnement, pour une charge
rdonnée, correspond au courantifqui vérifie à la fois la caractéristique de la source et celle de la charge :ur(if) = u(if), c'est-à-direr·if = rl[1] + rl[0]·if. - La fonction
bisect(f, a, b)du modulescipy.optimizetrouve numériquement la valeur qui annule une fonctionf, entre les bornesaetb. Il faut donc définir une fonctionnul(i)qui vaut zéro exactement au point de fonctionnement :nul(i) = rl[1] + rl[0]*i − r*i. - Dans une boucle
for r in rliste :, appellebisect(nul, 0, 2)pour chaque valeur der, et stocke les résultats dans une listelpfiavec.append(...).
# TODO : fonction qui s'annule exactement au point de fonctionnement
def nul(i) :
return rl[_] + rl[_]*i - _*i
lpfi = []
for r in rliste :
pfi = bisect(___, 0, 2)
lpfi.append(___)
print(lpfi)
Indice
Remarque subtile : la fonction nul utilise la variable r, qui n'est pas un de ses arguments — elle vient de la boucle for qui l'entoure. Cela fonctionne ici parce que bisect(nul, 0, 2) est appelée immédiatement, à chaque tour de boucle, avec la valeur de r du moment.
Une liste de 10 valeurs de courant, décroissantes de 2,0 A (pour r = 0) à environ 0,43 A (pour la plus grande résistance testée) : le courant de fonctionnement diminue quand la résistance de charge augmente, comme attendu.
Calculer la puissance reçue et trouver l'adaptation
- La puissance reçue par la charge s'écrit
P = r × if². Reprends la même boucle qu'à l'étape précédente, mais calcule et stocke cette fois la puissance dans une listelp. - Trace
lpen fonction derliste, en ronds rouges reliés par un trait bleu, avec une légende'puissance'.
lp = []
for r in rliste :
pfi = bisect(nul, 0, 2)
pui = r * pfi**_
lp.append(___)
print(lp)
plt.plot(rliste, lp, '__', label='________')
plt.plot(rliste, lp, '_')
plt.legend()
plt.show()
Une courbe en cloche : la puissance reçue par la charge augmente avec r, atteint un maximum pour la quatrième valeur testée (r ≈ 0,5 Ω, environ 0,5 W), puis redescend pour les résistances plus grandes.
Analyse et optimisation
- La puissance fournie est maximale pour une résistance de charge
r0 ≈ 0,5 Ω— une valeur qui coïncide, à la précision de la méthode près, avec la résistance de sortieRsde la source trouvée à l'étape 1. Ce n'est pas une coïncidence. - La théorie confirme ce résultat numérique : l'expression littérale de la puissance reçue par la charge est
Pr = r · (E0 / (Rs + r))². On peut montrer que cette fonction deradmet un maximum exactement pourr = Rs: c'est la condition d'adaptation d'impédance, un résultat général qui dépasse largement le seul exemple de cette source électrique.
Pense-bête — régression, fonctions et résolution numérique
| np.polyfit(x,y,1) | renvoie [pente, ordonnée à l'origine] |
| def f(x): return ... | transforme un résultat de polyfit en fonction utilisable |
| bisect(f, a, b) | trouve la racine de f entre a et b |
| P = r·i² | puissance reçue par une résistance |
| r = Rs | condition d'adaptation d'impédance |
| E0, Rs | f.é.m. et résistance de sortie d'une source réelle |
Pas de Thonny sous la main ? Utilise Basthon
Ouvrir dans un nouvel onglet ↗Ctrl+V ou Cmd+V) le code copié avec les boutons « Copier le code » ci-dessus, puis appuie sur Entrée pour l'exécuter.