La respiration permet d’illustrer le premier principe de la thermodynamique sur un exemple qui nous est tous assez familier (j’espère).
On va supposer l’air comme étant un gaz parfait diatomique. Dans ces conditions, l’énergie interne de $n$ moles d’air vaut $U=\frac{5}{2}nRT$.
On ne considère dans la suite que les variations relatives du volume des poumons $\Rightarrow$ le volume $V$ avant inspiration (= après expiration) est pris comme égal à zéro.
De même, seules les pressions relatives nous intéressent $\Rightarrow$ la pression $P$ avant inspiration (= après expiration) est prise comme égale à zéro.
Une modélisation de $V(P)$ à partir de mesures expérimentales (réalisées grâce à un cathéter œsophagien pour $P$ et un pléthysmographe pour $V$) donne :
Avec $A_I=3,57\text{ L}$, $k_I=0,964.10^{-3}\text{ Pa}^{-1}$, $A_E=3,35\text{ L}$, $k_E=1,644.10^{-3}\text{ Pa}^{-1}$.
$A$ est la capacité pulmonaire maximale et $k$ est un coefficient de compressibilité.
$A_E<A_I$ car en fin d’expiration, des alvéoles se referment, s’affaissent, leurs parois se collant sous l’action de la tension superficielle (et ce malgré la production de surfactants par les poumons équivalents à ceux qu’on trouve dans le savon pour abaisser cette énergie de surface… Sans eux, c’est tout le poumon qui s’affaisserait). Et c’est aussi pourquoi $k_I>k_E$ ; à l’inspiration, il faut vaincre la tension de surface pour recruter à nouveau les alvéoles refermées.
$P_I(V)= \frac{1}{k_I}\ln\left(\frac{A_I}{A_I-V}\right)$
$P_F(V)= \frac{1}{k_E}\ln\left(\frac{A_E}{A_E-V}\right)$
matplotlib
, tracer l’évolution de $P_I(V)$ et $P_E(V)$ pour $V$ allant de $3.3$ à $V_{max}$ (que vaut $V_{max}$ ?).import matplotlib.pyplot as plt
A_I, A_E = 3.57, 3.35 k_I, k_E = 0.964, 1.644
def P_I(V): return 1/k_I*(np.log(A_I/(A_I-V))) def P_E(V): return 1/k_E*(np.log(A_E/(A_E-V)))
Vmax = min(A_I,A_E) V = np.linspace(3.3,Vmax-1E-5,100)
plt.figure(figsize=(10,8),dpi=150) plt.plot(V,P_I(V),c = "red", label="inspiration") plt.plot(V,P_E(V),c = "blue",label="expiration") plt.xlabel("Volume V (L)") plt.ylabel("Pression P (kPa)") plt.legend() plt.show()![]()
brentq
de la librairie scipy.optimize
dont la signature est donnée ci-dessous.a
et b
adéquates.def brentq(func, a, b):
"""
brentq(func, a, b) -> float
---------------------------
Trouve une racine de l’équation func(x) = 0 dans l’intervalle fermé
[a, b] grâce à l’algorithme de Brent (combinaison bisection, sécante et
interpolation quadratique).
Conditions préalables
---------------------
- func(a) et func(b) doivent avoir des signes opposés strictement :
func(a) * func(b) < 0.
- L’intervalle est supposé borné et fini.
Paramètres
----------
func : callable
Fonction continue sur [a, b] à annuler.
Signature attendue : y = func(x) (scalaire en entrée et en sortie).
a, b : float
Bornes gauche (`a`) et droite (`b`) de l’intervalle de recherche
contenant exactement une racine (changement de signe garanti).
Retour
------
xr : float
Approximation de la racine telle que
abs(func(xr)) < 2 × 10⁻¹² (tolérance par défaut interne).
from scipy.optimize import brentq
def diff(V): return P_I(V)-P_E(V)
V_f = brentq(diff,3.30,3.33) P_f = P_I(V_f) print(f"V_f = {V_f:.2f} L") print(f"P_f = {P_f:.2f} kPa")V_f = 3.31 L
P_f = 2.73 kPa
quad
de la librairie scipy.integrate
dont la signature est donnée ci-dessous.def quad(func, a, b):
"""
quad(func, a, b) -> (float, float)
----------------------------------
Calcule l’intégrale définie de func(x) sur l’intervalle [a, b] au moyen
de la méthode adaptative de quadrature de Gauss–Kronrod (algorithme
QAG de QUADPACK).
Usage minimal (sans options) :
>>> I, err = quad(f, 0, 1)
Paramètres
----------
func : callable
Fonction réelle de variable réelle.
Signature attendue : y = func(x), où x est un flottant et y également.
a, b : float
Bornes d’intégration avec a < b.
Retour
------
I : float
Approximation de l’intégrale ∫ₐᵇ func(x) dx.
err : float
Estimation absolue de l’erreur sur `I`
(≈ précision effective de la valeur retournée).
from scipy.integrate import quad W = quad(P_I, 0, V_f)[0] print(f"W = {W:.2f} J")
W = 2.73 J
$$ \begin{aligned} W&=-W_I &\text{le travail musculaire s'oppose au travail des forces de pression} \\ &=-\int_0^{V_f}-PdV \\ & =\int_0^{P_f}PA_I k_I e^{-k_I P}dP &\text{en utilisant }dV=A_Ik_Ie^{-k_IP}dP \\ & =A_Ik_I\left[\frac{-P}{k_I}e^{-k_I P}\right]_0^{P_f}-A_Ik_I\int_0^{P_f}\frac{-1}{k_I} e^{-k_I P}dP &\text{intégration par partie} \\ & =A_Ik_I\left[\frac{-P}{k_I}e^{-k_I P}\right]_0^{P_f}-A_Ik_I\left[\frac{1}{k_I^2}e^{-k_I P}\right]_0^{P_f} & \\ & =-A_I P_f e^{-k_I P_f}-\frac{A_I}{k_I}e^{-k_I P_f}+\frac{A_I}{k_I} \\ & =-A_IP_f+P_fV_f+\frac{V_f}{k_I}&\text{car }A_Ie^{-k_IP_f}=A_I-V_f \end{aligned} $$W = -A_I*P_f + P_f*V_f + V_f/k_I print(f"W = {W:.2f} J") prop = 15*24*60*W/10e6*100 # pour 15 inspirations par minute print(f"proportion du métabolisme : {prop:.2f} %")
W = 2.73 J
proportion du métabolisme : 0.59 %
$\Delta U_I = W_I + Q_I \Rightarrow Q_I = \Delta U_I - W_I$
$\begin{aligned} Q_I &= \frac{5}{2}(P_fV_f - 0)-\int_0^{V_f} -P dV\\ &= \frac{5}{2}(P_fV_f - 0)-A_IP_f+P_fV_f+\frac{V_f}{k_I}\\ &=\frac{7}{2}P_fV_f-A_I P_f +\frac{V_f}{k_I} \end{aligned}$
Q_I = 7/2*P_f*V_f - A_I*P_f+V_f/k_I # calcul explicite print(f"Q_I = {Q_I:.1f} J") Q_I = 5/2*P_f*V_f + W # calcul implicite print(f"Q_I = {Q_I:.1f} J")
Q_I = 25.3 J
Q_I = 25.3 J
V = np.linspace(0,Vf,100) plt.figure(figsize=(9,6),dpi=150) plt.plot(V,P_I(V),c = "red", label="inspiration") plt.plot(V,P_E(V),c = "blue",label="expiration") plt.xlabel("Volume V (L)") plt.ylabel("Pression P (kPa)") plt.legend() plt.fill_between(V, P_I(V), P_E(V), color = "yellow", alpha = 0.2) plt.show()
![]()
Q = quad(diff, 0, V_f)[0] print(f"Q = {Q:.3f} J") Plib = Q/4 # en prenant 4 s pour un cycle respiratoire (15 respirations par minute) print(f"Plib = {Plib:.3f} W")
Q = 0.821 J
Plib = 0.205 W
Sur le cycle, on a $W<0$ et $Q>0$, l’air reçoit de la chaleur.
Seule une toute petite partie des 100 W perdue par le corps humain sert à chauffer l’air.