Limites et continuité#

La nature ne fait jamais de sauts.

Gottfried Wilhelm Leibniz

La notion de limite formalise l’idée de l’approche : ce que vaut \(f(x)\) lorsque \(x\) s’approche d’une valeur, sans nécessairement l’atteindre. La continuité en est le cas le plus régulier. Ce chapitre établit les théorèmes fondamentaux qui seront constamment utilisés en analyse.

Hide code cell source

import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
from scipy.optimize import brentq

sns.set_theme(style="whitegrid", palette="muted", font_scale=1.1)

Limite d’une fonction#

Définition en \(\varepsilon\)-\(\delta\)#

Définition 85 (Limite en un point)

Soit \(f : I \to \mathbb{R}\) définie sur un intervalle \(I\) (sauf peut-être en \(a\)), et \(a \in \mathbb{R}\) adhérent à \(I\). On dit que \(f\) admet pour limite \(\ell \in \mathbb{R}\) en \(a\), noté \(\lim_{x \to a} f(x) = \ell\), si

\[\forall \varepsilon > 0, \; \exists \delta > 0, \; \forall x \in I, \; 0 < |x - a| < \delta \implies |f(x) - \ell| < \varepsilon.\]

Remarque 44

La condition \(0 < |x - a|\) signifie qu’on ne considère pas la valeur \(f(a)\) elle-même (qui peut d’ailleurs ne pas exister). On s’intéresse au comportement de \(f\) au voisinage de \(a\).

La définition se lit : pour tout écart \(\varepsilon\) prescrit sur les valeurs, on peut trouver un écart \(\delta\) sur l’argument tel que si \(x\) est à distance \(< \delta\) de \(a\) (sans être \(a\)), alors \(f(x)\) est à distance \(< \varepsilon\) de \(\ell\).

Proposition 120 (Unicité de la limite)

Si \(f\) admet une limite en \(a\), elle est unique.

Proof. Supposons \(\ell \neq \ell'\) deux limites de \(f\) en \(a\). Posons \(\varepsilon = |\ell - \ell'|/2 > 0\). Il existe \(\delta_1, \delta_2 > 0\) tels que sur les voisinages correspondants, \(|f(x) - \ell| < \varepsilon\) et \(|f(x) - \ell'| < \varepsilon\). Pour \(x\) dans l’intersection :

\[|\ell - \ell'| \leq |f(x) - \ell| + |f(x) - \ell'| < 2\varepsilon = |\ell - \ell'|.\]

Contradiction.

Caractérisation séquentielle#

Proposition 121 (Caractérisation séquentielle)

\(\lim_{x \to a} f(x) = \ell\) si et seulement si pour toute suite \((x_n)\) d’éléments de \(I \setminus \{a\}\) avec \(x_n \to a\), on a \(f(x_n) \to \ell\).

Proof. \((\Rightarrow)\) Direct : pour tout \(\varepsilon > 0\), le \(\delta\) de la définition fournit un rang \(N\) à partir duquel \(|f(x_n) - \ell| < \varepsilon\).

\((\Leftarrow)\) Par contraposée : si \(f\) n’a pas limite \(\ell\) en \(a\), il existe \(\varepsilon > 0\) tel que pour tout \(n \in \mathbb{N}^*\), il existe \(x_n \in I \setminus \{a\}\) avec \(|x_n - a| < 1/n\) et \(|f(x_n) - \ell| \geq \varepsilon\). La suite \((x_n)\) converge vers \(a\) sans que \((f(x_n))\) converge vers \(\ell\).

Remarque 45

Ce critère est particulièrement utile pour montrer la non-existence d’une limite : il suffit d’exhiber deux suites \((x_n)\) et \((y_n)\) convergeant vers \(a\) telles que \(f(x_n)\) et \(f(y_n)\) convergent vers des limites différentes.

Exemple : \(f(x) = \sin(1/x)\) n’a pas de limite en 0 car \(f(1/(n\pi)) = 0\) et \(f(1/(\pi/2 + 2n\pi)) = 1\) pour tout \(n\).

Limites à gauche et à droite#

Définition 86 (Limites latérales)

\[f'_g(a) = \lim_{x \to a^-} f(x) \quad \text{(limite à gauche)}, \qquad f'_d(a) = \lim_{x \to a^+} f(x) \quad \text{(limite à droite)}.\]

Proposition 122

\(\lim_{x \to a} f(x) = \ell \iff \lim_{x \to a^-} f(x) = \ell \text{ et } \lim_{x \to a^+} f(x) = \ell.\)

Exemple 45

La fonction partie entière \(\lfloor x \rfloor\) vérifie en tout \(n \in \mathbb{Z}\) :

\[\lim_{x \to n^-} \lfloor x \rfloor = n - 1 \quad \text{et} \quad \lim_{x \to n^+} \lfloor x \rfloor = n.\]

Les limites latérales diffèrent, donc la limite en \(n\) n’existe pas.

Limites infinies et en l’infini#

Définition 87 (Limite infinie, limite en l’infini)

\[\lim_{x \to a} f(x) = +\infty \quad \iff \quad \forall A \in \mathbb{R}, \; \exists \delta > 0, \; 0 < |x-a| < \delta \implies f(x) > A.\]
\[\lim_{x \to +\infty} f(x) = \ell \quad \iff \quad \forall \varepsilon > 0, \; \exists B \in \mathbb{R}, \; x > B \implies |f(x) - \ell| < \varepsilon.\]
\[\lim_{x \to +\infty} f(x) = +\infty \quad \iff \quad \forall A \in \mathbb{R}, \; \exists B \in \mathbb{R}, \; x > B \implies f(x) > A.\]

Opérations sur les limites#

Proposition 123 (Opérations algébriques)

Si \(\lim_{x \to a} f(x) = \ell\) et \(\lim_{x \to a} g(x) = \ell'\) (avec \(\ell, \ell' \in \mathbb{R}\)) :

  • \(\lim_{x \to a} (f + g)(x) = \ell + \ell'\)

  • \(\lim_{x \to a} (\lambda f)(x) = \lambda \ell\)

  • \(\lim_{x \to a} (fg)(x) = \ell \ell'\)

  • Si \(\ell' \neq 0\) : \(\lim_{x \to a} (f/g)(x) = \ell/\ell'\)

  • Si \(g\) est continue en \(\ell\) : \(\lim_{x \to a} (g \circ f)(x) = g(\ell)\)

Remarque 46

Ces opérations ne s’appliquent pas aux formes indéterminées : \(+\infty - \infty\), \(\; 0 \cdot \infty\), \(\; 0/0\), \(\; \infty/\infty\), \(\; 1^\infty\), \(\; 0^0\), \(\; \infty^0\). Dans ces cas, il faut une étude plus fine (développements limités, factorisation, changement de variable…).

Proposition 124 (Théorème des gendarmes)

Si \(f(x) \leq h(x) \leq g(x)\) au voisinage de \(a\) et \(\lim_{x \to a} f(x) = \lim_{x \to a} g(x) = \ell\), alors \(\lim_{x \to a} h(x) = \ell\).

Exemple 46

\(\lim_{x \to 0} x\sin\!\dfrac{1}{x} = 0\) : car \(-|x| \leq x\sin(1/x) \leq |x|\) et \(|x| \to 0\).

\(\lim_{x \to +\infty} \dfrac{\sin x}{x} = 0\) : car \(-1/x \leq (\sin x)/x \leq 1/x\).

Hide code cell source

fig, axes = plt.subplots(3, 2, figsize=(12, 14))

# 1. Définition epsilon-delta illustrée
ax = axes[0, 0]
f_ed = lambda x: x**2 + 1
a_val = 1.0
ell = f_ed(a_val)

x = np.linspace(-0.5, 2.5, 400)
ax.plot(x, f_ed(x), 'b-', lw=2.5, label='$f(x) = x^2+1$')

# Bande epsilon autour de ell
eps = 0.5
delta = np.sqrt(ell + eps) - a_val  # f(a+delta) = ell + eps

ax.axhline(ell, color='k', lw=0.8, ls='-')
ax.fill_between(x, ell - eps, ell + eps, alpha=0.15, color='red', label=f'$\\varepsilon = {eps}$')
ax.axvline(a_val - delta, color='green', lw=1.5, ls='--', alpha=0.8)
ax.axvline(a_val + delta, color='green', lw=1.5, ls='--', alpha=0.8)
ax.axvspan(a_val - delta, a_val + delta, alpha=0.1, color='green', label=f'$\\delta \\approx {delta:.2f}$')
ax.scatter([a_val], [ell], color='red', s=100, zorder=5)
ax.annotate('$a$', (a_val, -0.1), ha='center', fontsize=11)
ax.annotate('$\\ell$', (-0.4, ell), va='center', fontsize=11)
ax.set_xlim(-0.5, 2.5)
ax.set_ylim(-0.2, 5)
ax.set_title('Définition $\\varepsilon$-$\\delta$ de la limite\n$|x-a|<\\delta \\Rightarrow |f(x)-\\ell|<\\varepsilon$')
ax.legend(fontsize=9)
ax.set_xlabel('$x$')

# 2. Caractérisation séquentielle
ax = axes[0, 1]
f_seq = lambda x: np.sin(x) / x if x != 0 else 1.0
x_cont = np.linspace(-0.01, 0.5, 400)
y_cont = np.where(np.abs(x_cont) > 1e-8, np.sin(x_cont)/x_cont, 1.0)

ax.plot(x_cont, y_cont, 'b-', lw=2.5, label='$\\sin(x)/x$')

# Suites convergeant vers 0
for i, (n_terms, col) in enumerate([(5, 'red'), (10, 'green'), (20, 'orange')]):
    xn = np.linspace(0.01, 0.45, n_terms)
    yn = np.sin(xn) / xn
    ax.scatter(xn, yn, color=col, s=40, alpha=0.8, zorder=5)
    ax.scatter([0], [1.0], color='red', s=100, zorder=6)

ax.axhline(1, color='gray', ls='--', lw=1.5, label='$\\ell = 1$')
ax.set_title('Caractérisation séquentielle\n$f(x_n) \\to \\ell$ pour toute suite $x_n \\to a$')
ax.legend(fontsize=9)
ax.set_xlabel('$x$')
ax.set_ylim(0.9, 1.05)

# 3. sin(1/x) — pas de limite en 0
ax = axes[1, 0]
x_osc = np.linspace(0.002, 0.15, 5000)
y_osc = np.sin(1/x_osc)

ax.plot(x_osc, y_osc, 'b-', lw=0.8, label='$\\sin(1/x)$')
ax.axhline(0, color='k', lw=0.8)

# Deux suites avec limites différentes
n_arr = np.arange(1, 8)
xn_0 = 1/(n_arr * np.pi)
yn_0 = np.sin(n_arr * np.pi)  # = 0
xn_1 = 1/(np.pi/2 + 2*n_arr*np.pi)
yn_1 = np.sin(np.pi/2 + 2*n_arr*np.pi)  # = 1

ax.scatter(xn_0, yn_0, color='red', s=80, zorder=5, label='$x_n = 1/(n\\pi) \\to 0$, $f(x_n)=0$')
ax.scatter(xn_1, yn_1, color='green', s=80, zorder=5, label='$y_n \\to 0$, $f(y_n)=1$')

ax.set_xlim(0, 0.15)
ax.set_ylim(-1.3, 1.5)
ax.set_title('$\\sin(1/x)$ : pas de limite en 0\n(critère séquentiel : deux suites)')
ax.legend(fontsize=8)
ax.set_xlabel('$x$')

# 4. Gendarmes illustré
ax = axes[1, 1]
x = np.linspace(-0.3, 0.3, 500)
y_osc2 = np.where(np.abs(x) > 1e-8, x**2 * np.sin(1/x), 0)

ax.plot(x, y_osc2, 'b-', lw=2, label='$x^2 \\sin(1/x)$')
ax.plot(x, x**2, 'r--', lw=1.5, label='$x^2$')
ax.plot(x, -x**2, 'g--', lw=1.5, label='$-x^2$')
ax.fill_between(x, -x**2, x**2, alpha=0.1, color='purple')
ax.axhline(0, color='k', lw=0.8)
ax.scatter([0], [0], color='red', s=100, zorder=5)
ax.set_title('Théorème des gendarmes\n$-x^2 \\leq x^2\\sin(1/x) \\leq x^2 \\to 0$')
ax.legend(fontsize=9)
ax.set_xlabel('$x$')

# 5. Limites latérales et discontinuité
ax = axes[2, 0]
x_neg = np.linspace(-2, -0.01, 200)
x_pos = np.linspace(0.01, 2, 200)

# Discontinuité de saut
f_saut_neg = lambda x: -x - 1
f_saut_pos = lambda x: x + 1

ax.plot(x_neg, f_saut_neg(x_neg), 'b-', lw=2.5, label='$\\lim_{x\\to 0^-} = -1$')
ax.plot(x_pos, f_saut_pos(x_pos), 'r-', lw=2.5, label='$\\lim_{x\\to 0^+} = +1$')
ax.scatter([0], [-1], color='blue', s=100, zorder=5, facecolors='none')
ax.scatter([0], [1], color='red', s=100, zorder=5, facecolors='none')
ax.axhline(0, color='k', lw=0.8)
ax.axvline(0, color='k', lw=0.8)
ax.set_title('Discontinuité de saut\nLimites latérales existent mais $\neq$')
ax.legend(fontsize=9)
ax.set_xlabel('$x$')

# 6. Partie entière
ax = axes[2, 1]
x_step = np.linspace(-3.5, 3.5, 1000)
y_step = np.floor(x_step)

ax.plot(x_step, y_step, 'b-', lw=2, label='$\\lfloor x \\rfloor$')
ax.axhline(0, color='k', lw=0.8)
ax.axvline(0, color='k', lw=0.5)

# Cercles ouverts aux discontinuités
for n in range(-3, 4):
    ax.scatter([n], [n-1], color='blue', s=80, facecolors='none', zorder=5)
    ax.scatter([n], [n], color='blue', s=80, zorder=5)

ax.set_xlim(-3.5, 3.5)
ax.set_ylim(-3.5, 3.5)
ax.set_title('Partie entière $\\lfloor x \\rfloor$\nLimite à gauche $= n-1$, à droite $= n$')
ax.legend(fontsize=9)
ax.set_xlabel('$x$')

plt.tight_layout()
plt.show()
_images/fd79790c20bf2f891c53d063994be8e248bd3bf994057ed9aa1c3bea4f08aa1f.png

Continuité#

Définitions#

Définition 88 (Continuité en un point)

Soit \(f : I \to \mathbb{R}\) et \(a \in I\). \(f\) est continue en \(a\) si \(\lim_{x \to a} f(x) = f(a)\), soit :

\[\forall \varepsilon > 0, \; \exists \delta > 0, \; \forall x \in I, \; |x - a| < \delta \implies |f(x) - f(a)| < \varepsilon.\]

Remarque 47

La continuité en \(a\) signifie trois choses simultanément : \(f(a)\) existe, \(\lim_{x \to a} f(x)\) existe, et ces deux valeurs coïncident.

Types de discontinuités :

  • Saut : les limites latérales existent mais sont différentes (\(\lfloor x \rfloor\) en tout entier)

  • Discontinuité effaçable : la limite existe mais \(\neq f(a)\), ou \(f\) n’est pas définie en \(a\) (ex. \(\sin(x)/x\) en 0)

  • Discontinuité essentielle : la limite n’existe pas (\(\sin(1/x)\) en 0)

Définition 89 (Prolongement par continuité)

Soit \(f\) définie sur \(I \setminus \{a\}\). Si \(\lim_{x \to a} f(x) = \ell\) existe et est finie, le prolongement par continuité de \(f\) en \(a\) est

\[\begin{split}\tilde{f}(x) = \begin{cases} f(x) & x \neq a \\ \ell & x = a. \end{cases}\end{split}\]

Exemple 47

  • \(f(x) = \dfrac{\sin x}{x}\) : \(\lim_{x \to 0} = 1\), prolongement \(\tilde{f}(0) = 1\).

  • \(f(x) = \dfrac{e^x - 1}{x}\) : \(\lim_{x \to 0} = 1\), prolongement \(\tilde{f}(0) = 1\).

  • \(f(x) = x\ln x\) : \(\lim_{x \to 0^+} = 0\), prolongement \(\tilde{f}(0) = 0\).

Proposition 125 (Opérations et continuité)

Soient \(f, g\) continues en \(a\).

  • \(\lambda f + \mu g\), \(fg\), \(|f|\), \(\max(f,g)\), \(\min(f,g)\) sont continues en \(a\)

  • \(f/g\) est continue en \(a\) si \(g(a) \neq 0\)

  • Si \(f\) est continue en \(a\) et \(g\) continue en \(f(a)\), alors \(g \circ f\) est continue en \(a\)

Exemple 48

  • Tout polynôme est continu sur \(\mathbb{R}\) (somme de monômes continus).

  • Toute fraction rationnelle est continue sur son domaine de définition.

  • \(x \mapsto |x|\) : continue car \(||x| - |a|| \leq |x - a|\).

  • \(\sin, \cos, \exp, \ln\) : continues sur leurs domaines (admis ou à démontrer via leurs définitions analytiques).

Types de discontinuités#

Hide code cell source

fig, axes = plt.subplots(3, 1, figsize=(9, 14))

# Type 1 : Discontinuité de saut (partie entière)
ax = axes[0]
x = np.linspace(-2.5, 2.5, 2000)
y = np.floor(x)
ax.step(x, y, where='post', lw=2, color='blue', label='$\\lfloor x \\rfloor$')
for n in range(-2, 3):
    ax.scatter([n], [n-1], color='blue', s=80, facecolors='none', zorder=5)
    ax.scatter([n], [n], color='blue', s=80, zorder=5)
ax.axhline(0, color='k', lw=0.8)
ax.axvline(0, color='k', lw=0.5)
ax.set_ylim(-2.5, 2.5)
ax.set_title('Discontinuité de saut\n$\\lfloor x \\rfloor$ : limites latérales $\\neq$')
ax.legend()

# Type 2 : Discontinuité effaçable
ax = axes[1]
x = np.linspace(-2, 2, 500)
f2 = np.where(np.abs(x) > 1e-6, np.sin(x)/x, np.nan)  # non définie en 0

ax.plot(x, f2, 'b-', lw=2.5, label='$\\sin(x)/x$ (non définie en 0)')
ax.scatter([0], [1], color='red', s=120, zorder=6, facecolors='none',
           label='Prolongement : $\\tilde{f}(0)=1$')
ax.scatter([0], [1], color='red', s=60, marker='x', zorder=7, lw=2)
ax.axhline(0, color='k', lw=0.8)
ax.axvline(0, color='k', lw=0.5)
ax.set_ylim(-0.3, 1.1)
ax.set_title('Discontinuité effaçable\nlimite existe, $f$ non définie en $a$')
ax.legend(fontsize=9)

# Type 3 : Discontinuité essentielle
ax = axes[2]
x_ess = np.linspace(0.005, 0.3, 5000)
y_ess = np.sin(1/x_ess)
ax.plot(x_ess, y_ess, 'b-', lw=0.8, label='$\\sin(1/x)$')
ax.fill_between(x_ess, -1, 1, alpha=0.05, color='red')
ax.axhline(1, color='red', ls='--', lw=1, alpha=0.7)
ax.axhline(-1, color='red', ls='--', lw=1, alpha=0.7)
ax.axhline(0, color='k', lw=0.8)
ax.set_xlim(0, 0.3)
ax.set_ylim(-1.3, 1.3)
ax.set_title('Discontinuité essentielle\n$\\sin(1/x)$ : la limite n\'existe pas en 0')
ax.legend(fontsize=9)

plt.tight_layout()
plt.show()
_images/399cee1dccceda77bad91dd3e29b1548c690d58500766081e01c7eb763f56365.png

Théorèmes fondamentaux#

Théorème des valeurs intermédiaires#

Proposition 126 (Théorème des valeurs intermédiaires (TVI))

Soit \(f : [a, b] \to \mathbb{R}\) continue. Pour tout \(\gamma\) compris entre \(f(a)\) et \(f(b)\), il existe \(c \in [a, b]\) tel que \(f(c) = \gamma\).

Proof. Supposons \(f(a) \leq \gamma \leq f(b)\). On construit par dichotomie des suites adjacentes.

Posons \(a_0 = a\), \(b_0 = b\). À chaque étape, \(m_k = (a_k + b_k)/2\) :

  • Si \(f(m_k) \leq \gamma\) : \(a_{k+1} = m_k\), \(b_{k+1} = b_k\)

  • Si \(f(m_k) > \gamma\) : \(a_{k+1} = a_k\), \(b_{k+1} = m_k\)

On maintient \(f(a_k) \leq \gamma \leq f(b_k)\) et \(b_k - a_k = (b-a)/2^k \to 0\). \((a_k)\) et \((b_k)\) sont adjacentes, convergent vers le même \(c \in [a,b]\). Par continuité : \(f(c) = \lim f(a_k) \leq \gamma\) et \(f(c) = \lim f(b_k) \geq \gamma\), donc \(f(c) = \gamma\).

Proposition 127 (Corollaire (Bolzano))

Si \(f : [a, b] \to \mathbb{R}\) est continue et \(f(a) f(b) < 0\), il existe \(c \in \:]a, b[\) avec \(f(c) = 0\).

Exemple 49

Racine d’un polynôme impair. Si \(P(x) = x^{2k+1} + \cdots\) est de degré impair, alors \(P(x) \to +\infty\) en \(+\infty\) et \(P(x) \to -\infty\) en \(-\infty\). Il existe \(A\) tel que \(P(-A) < 0 < P(A)\). Par le TVI, \(P\) s’annule sur \([-A, A]\).

Méthode de dichotomie numérique. La preuve du TVI est constructive : elle fournit un algorithme de localisation des zéros par dichotomie, avec erreur \(\leq (b-a)/2^k\) après \(k\) itérations.

Remarque 48

Le TVI se généralise : l’image continue d’un connexe est connexe. En dimension 1, les connexes sont les intervalles, d’où l’énoncé ci-dessus. En dimensions supérieures, cela permet de montrer par exemple que toute application continue de \([0,1]\) dans lui-même a un point fixe (théorème de Brouwer en dimension 1).

Image d’un segment#

Proposition 128 (Image continue d’un segment)

Soit \(f : [a, b] \to \mathbb{R}\) continue. Alors \(f\) est bornée, atteint ses bornes, et

\[f([a, b]) = [m, M] \quad \text{où } m = \min_{[a,b]} f, \; M = \max_{[a,b]} f.\]

Proof. \(f\) majorée. Par l’absurde : s’il existe \(x_n \in [a,b]\) avec \(f(x_n) > n\), alors par Bolzano-Weierstrass, une sous-suite \(x_{\varphi(n)} \to c \in [a,b]\). Continuité : \(f(x_{\varphi(n)}) \to f(c)\), mais \(f(x_{\varphi(n)}) > \varphi(n) \to +\infty\). Contradiction.

\(f\) atteint son max. Soit \(M = \sup_{[a,b]} f < +\infty\). Il existe \(x_n\) avec \(f(x_n) \to M\). Bolzano-Weierstrass : \(x_{\varphi(n)} \to c \in [a,b]\). Continuité : \(f(c) = M\).

\(f([a,b]) = [m, M]\). Inclusion \(\subseteq\) évidente. Pour \(\gamma \in [m,M]\), les points \(c_1, c_2\)\(f\) vaut \(m\) et \(M\) vérifient \(f(c_1) \leq \gamma \leq f(c_2)\), le TVI donne un antécédent de \(\gamma\).

Théorème de la bijection continue#

Proposition 129 (Bijection continue)

Soit \(f : I \to \mathbb{R}\) continue et strictement monotone sur un intervalle \(I\). Alors \(f\) réalise une bijection de \(I\) sur \(J = f(I)\) (intervalle), et \(f^{-1} : J \to I\) est continue et strictement monotone de même sens.

Proof. \(f(I)\) est un intervalle : Si \(y_1 < y_2 \in f(I)\), pour tout \(\gamma \in [y_1, y_2]\), le TVI appliqué entre les antécédents fournit un \(c\) avec \(f(c) = \gamma\).

Injectivité : \(f\) strictement monotone \(\Rightarrow\) injective.

Continuité de \(f^{-1}\) : Soit \(b_n = f(a_n) \to b_0 = f(a_0)\) dans \(J\). Si \(a_n \not\to a_0\), il existe \(\varepsilon > 0\) et une sous-suite avec \(|a_{\varphi(n)} - a_0| \geq \varepsilon\). Par le théorème des valeurs extrêmes sur \([a_0 - \varepsilon, a_0 + \varepsilon] \cap I\), \(f\) est bornée sur ce compact, ce qui contredit la convergence \(b_{\varphi(n)} \to b_0\).

Exemple 50

  • \(x \mapsto x^n\) sur \([0, +\infty[\) justifie l’existence de \(x^{1/n} = \sqrt[n]{x}\), continue sur \([0, +\infty[\).

  • \(\exp : \mathbb{R} \to ]0,+\infty[\) est une bijection continue, de réciproque \(\ln\) continue.

  • \(\sin : [-\pi/2, \pi/2] \to [-1,1]\) est une bijection continue, de réciproque \(\arcsin\) continue.

Hide code cell source

fig, axes = plt.subplots(3, 1, figsize=(9, 14))

# TVI : dichotomie illustrée
ax = axes[0]
f_tvi = lambda x: x**3 - x - 1
x = np.linspace(-2, 2, 400)
ax.plot(x, f_tvi(x), 'b-', lw=2.5, label='$f(x) = x^3-x-1$')
ax.axhline(0, color='k', lw=0.8)

racine = brentq(f_tvi, 1, 2)

# Visualiser les étapes de dichotomie
a_d, b_d = 1.0, 2.0
couleurs = plt.cm.Reds(np.linspace(0.3, 0.9, 5))
for i, col in enumerate(couleurs):
    m_d = (a_d + b_d) / 2
    ax.axvspan(a_d, b_d, alpha=0.08, color=col)
    if f_tvi(m_d) <= 0:
        a_d = m_d
    else:
        b_d = m_d

ax.scatter([racine], [0], color='red', s=120, zorder=6, label=f'Racine $\\approx {racine:.4f}$')
ax.set_ylim(-3, 3)
ax.set_title('TVI + dichotomie\nintervalles emboîtés $\\to$ racine')
ax.legend(fontsize=9)
ax.set_xlabel('$x$')

# Image d'un segment
ax = axes[1]
f_img = lambda x: np.sin(3*x) * np.exp(-0.3*x) + 0.5*x

x = np.linspace(0, 3, 500)
y = f_img(x)
m_val, M_val = np.min(y), np.max(y)
x_min, x_max = x[np.argmin(y)], x[np.argmax(y)]

ax.plot(x, y, 'b-', lw=2.5, label='$f$')
ax.fill_between(x, m_val, M_val, alpha=0.1, color='blue', label=f'Image = [{m_val:.2f}, {M_val:.2f}]')
ax.axhline(m_val, color='green', ls='--', lw=2, alpha=0.8, label=f'min = {m_val:.2f}')
ax.axhline(M_val, color='red', ls='--', lw=2, alpha=0.8, label=f'max = {M_val:.2f}')
ax.scatter([x_min], [m_val], color='green', s=120, zorder=5)
ax.scatter([x_max], [M_val], color='red', s=120, zorder=5)
ax.set_title('Image d\'un segment $[a,b]$\n$= [m, M]$ (compact)')
ax.legend(fontsize=9)
ax.set_xlabel('$x$')

# Bijection continue et réciproque
ax = axes[2]
x_bij = np.linspace(-np.pi/2, np.pi/2, 400)
y_bij = np.sin(x_bij)

ax.plot(x_bij, y_bij, 'b-', lw=2.5, label='$\\sin : [-\\pi/2, \\pi/2] \\to [-1,1]$')
ax.plot(y_bij, x_bij, 'r-', lw=2.5, label='$\\arcsin : [-1,1] \\to [-\\pi/2, \\pi/2]$')
ax.plot(np.linspace(-1.5, 1.5, 100), np.linspace(-1.5, 1.5, 100), 'k--', lw=1, alpha=0.5,
        label='$y=x$')
ax.axhline(0, color='k', lw=0.8)
ax.axvline(0, color='k', lw=0.8)
ax.set_aspect('equal')
ax.set_xlim(-1.8, 1.8)
ax.set_ylim(-1.8, 1.8)
ax.set_title('Bijection continue et sa réciproque\n(symétrie par rapport à $y=x$)')
ax.legend(fontsize=9)

plt.tight_layout()
plt.show()
_images/f2091d59e681ffbd476a78fb9ae67a23c72414e21606a188a29e40bbc7ea205d.png

Continuité uniforme#

Définition 90 (Continuité uniforme)

\(f : I \to \mathbb{R}\) est uniformément continue sur \(I\) si

\[\forall \varepsilon > 0, \; \exists \delta > 0, \; \forall x, y \in I, \; |x - y| < \delta \implies |f(x) - f(y)| < \varepsilon.\]

Remarque 49

La différence cruciale avec la continuité simple : \(\delta\) ne dépend que de \(\varepsilon\), pas du point \(x\). C’est une propriété globale. Intuitivement, \(f\) est uniformément continue si elle n’a pas de zones où la pente devient arbitrairement grande.

Exemple 51

Pas uniformément continue : \(f(x) = x^2\) sur \(\mathbb{R}\).

Pour \(x\) grand, \(f(x + h) - f(x) = 2xh + h^2 \approx 2xh\), qui peut être grand même pour \(h\) petit. Formellement : \(|x - y| = \delta/2 < \delta\) mais \(|x^2 - y^2| = (x+y) \cdot |x-y|\) est non borné.

Uniformément continue : \(f(x) = \sqrt{x}\) sur \([0, +\infty[\).

\[|\sqrt{x} - \sqrt{y}| = \frac{|x-y|}{\sqrt{x}+\sqrt{y}} \leq \sqrt{|x-y|}.\]

Pour \(\varepsilon > 0\), poser \(\delta = \varepsilon^2\) : si \(|x-y| < \delta\), alors \(|\sqrt{x}-\sqrt{y}| \leq \sqrt{\delta} = \varepsilon\).

Uniformément continue : \(f(x) = \sin x\) sur \(\mathbb{R}\) (car \(|\sin x - \sin y| \leq |x-y|\)).

Proposition 130 (Théorème de Heine)

Toute fonction continue sur un segment \([a, b]\) est uniformément continue sur \([a, b]\).

Proof. Par l’absurde. Si \(f\) n’est pas uniformément continue, il existe \(\varepsilon > 0\) tel que pour tout \(n \in \mathbb{N}^*\), il existe \(x_n, y_n \in [a,b]\) avec \(|x_n - y_n| < 1/n\) et \(|f(x_n) - f(y_n)| \geq \varepsilon\).

Par Bolzano-Weierstrass, \((x_n)\) admet \(x_{\varphi(n)} \to c \in [a,b]\). Comme \(|x_{\varphi(n)} - y_{\varphi(n)}| < 1/\varphi(n) \to 0\), on a aussi \(y_{\varphi(n)} \to c\).

Par continuité en \(c\) : \(|f(x_{\varphi(n)}) - f(y_{\varphi(n)})| \leq |f(x_{\varphi(n)}) - f(c)| + |f(c) - f(y_{\varphi(n)})| \to 0\).

Contradiction avec \(|f(x_{\varphi(n)}) - f(y_{\varphi(n)})| \geq \varepsilon\).

Fonctions lipschitziennes#

Définition 91 (Fonction lipschitzienne)

\(f : I \to \mathbb{R}\) est \(k\)-lipschitzienne si

\[\exists k \geq 0, \; \forall x, y \in I, \; |f(x) - f(y)| \leq k|x - y|.\]

Proposition 131

\[\text{lipschitzienne} \implies \text{uniformément continue} \implies \text{continue sur } I\]

Les réciproques sont fausses en général.

Proof. Lipschitz \(\Rightarrow\) unif. continue : Poser \(\delta = \varepsilon/k\). \(\sqrt{x}\) est unif. continue mais non lipschitzienne sur \([0,1]\) : sa dérivée est \(1/(2\sqrt{x}) \to +\infty\) en 0. Continue non unif. continue : \(x^2\) sur \(\mathbb{R}\).

Exemple 52

  • \(\sin x\) et \(\cos x\) : 1-lipschitziennes sur \(\mathbb{R}\) (car \(|\sin x - \sin y| \leq |x-y|\)).

  • \(e^x\) : \(k\)-lipschitzienne sur \(]-\infty, R]\) pour tout \(R\) (constante \(k = e^R\)), mais non lipschitzienne sur \(\mathbb{R}\).

  • Toute fonction \(\mathcal{C}^1\) à dérivée bornée est lipschitzienne (par l’inégalité des accroissements finis).

Remarque 50

Les fonctions lipschitziennes sont centrales en analyse numérique (convergence des schémas) et en équations différentielles (le théorème de Cauchy-Lipschitz utilise précisément cette hypothèse pour assurer l’existence et l’unicité des solutions).

Hide code cell source

fig, axes = plt.subplots(3, 1, figsize=(9, 14))

# Continuité uniforme : même delta partout
ax = axes[0]
x = np.linspace(0, 10, 500)

ax.plot(x, np.sin(x), 'b-', lw=2.5, label='$\\sin(x)$ : 1-lipschitz')
ax.plot(x, np.sqrt(x), 'r-', lw=2.5, label='$\\sqrt{x}$ : unif. continue, non Lipschitz')

# Montrer delta uniforme pour sin
delta_u = 0.3
for x0 in [1, 4, 7]:
    ax.axvspan(x0 - delta_u, x0 + delta_u, alpha=0.1, color='blue')

ax.axhline(0, color='k', lw=0.8)
ax.set_title('Continue uniforme\n(même $\\delta$ en tout point)')
ax.legend(fontsize=9)
ax.set_xlabel('$x$')

# Non uniformément continue : delta dépend du point
ax = axes[1]
x_all = np.linspace(0, 5, 400)
ax.plot(x_all, x_all**2, 'b-', lw=2.5, label="$x^2$ : non unif. continue")

# Montrer que pour même epsilon, delta doit être plus petit loin de 0
eps_val = 0.5
for x0, col in [(1, 'green'), (3, 'orange')]:
    # f(x0 + delta) - f(x0) = eps => delta ≈ eps/(2x0)
    delta_loc = eps_val / (2 * x0)
    ax.axvspan(x0 - delta_loc, x0 + delta_loc, alpha=0.2, color=col)
    y0 = x0**2
    ax.fill_between([x0 - delta_loc, x0 + delta_loc],
                    [y0 - eps_val]*2, [y0 + eps_val]*2, alpha=0.1, color=col)
    ax.annotate(f'$x_0={x0}$\n$\\delta\\approx{delta_loc:.2f}$',
                (x0, y0), textcoords='offset points',
                xytext=(10, -20), fontsize=9, color=col)

ax.axhline(0, color='k', lw=0.8)
ax.set_ylim(0, 15)
ax.set_title('$x^2$ : non unif. continue\n$\\delta$ doit $\\to 0$ quand $x_0 \\to +\\infty$')
ax.legend(fontsize=9)
ax.set_xlabel('$x$')

# Hiérarchie des régularités
ax = axes[2]
x = np.linspace(0, 3, 500)

# Lipschitzienne mais non C1 : |x-1|
f_lip = np.abs(x - 1)
# C1 non C2 : x|x|
f_c1 = x * np.abs(x - 1.5)
# C^inf : exp
f_cinf = np.exp(-(x-1.5)**2)

ax.plot(x, f_lip / np.max(np.abs(f_lip)) + 2, 'b-', lw=2, label='Lipschitz : $|x-1|$ (non $\\mathcal{C}^1$)')
ax.plot(x, f_c1 / np.max(np.abs(f_c1)) + 1, 'r-', lw=2, label='$\\mathcal{C}^1$ mais non $\\mathcal{C}^2$')
ax.plot(x, f_cinf, 'g-', lw=2, label='$\\mathcal{C}^\\infty$ : $e^{-(x-1.5)^2}$')

ax.set_yticks([])
ax.set_title('Hiérarchie des régularités\n(normalisé pour comparaison)')
ax.legend(fontsize=9)
ax.set_xlabel('$x$')
ax.axhline(0, color='k', lw=0.8)

plt.tight_layout()
plt.show()
_images/34e2b2ae55cfa4e44c48f0fe8cf32143c50e6349c347233126d7b97016fa1561.png

Fonctions continues par morceaux#

Définition 92 (Continue par morceaux)

\(f : [a, b] \to \mathbb{R}\) est continue par morceaux s’il existe une subdivision \(a = x_0 < x_1 < \cdots < x_n = b\) telle que \(f\) est continue sur chaque \(]x_{i-1}, x_i[\) et admet des limites finies aux extrémités.

Remarque 51

Les fonctions continues par morceaux sont intégrables au sens de Riemann (cf. chapitre 15). La partie entière \(\lfloor x \rfloor\) et la fonction signe sont des exemples canoniques.

Points fixes#

Proposition 132 (Théorème du point fixe (Brouwer en dim 1))

Toute fonction continue \(f : [a, b] \to [a, b]\) admet au moins un point fixe : \(\exists c \in [a, b]\), \(f(c) = c\).

Proof. Soit \(g(x) = f(x) - x\). Alors \(g(a) = f(a) - a \geq 0\) (car \(f(a) \in [a,b]\)) et \(g(b) = f(b) - b \leq 0\). Par le TVI, il existe \(c\) avec \(g(c) = 0\), soit \(f(c) = c\).

Proposition 133 (Théorème du point fixe de Banach (contraction))

Soit \((E, d)\) un espace métrique complet et \(f : E \to E\) une contraction, c’est-à-dire qu’il existe \(k \in [0, 1[\) tel que \(d(f(x), f(y)) \leq k \cdot d(x, y)\) pour tous \(x, y \in E\).

Alors \(f\) admet un unique point fixe \(c\), et la suite \(x_{n+1} = f(x_n)\) converge vers \(c\) pour tout \(x_0\), avec l’estimation :

\[d(x_n, c) \leq \frac{k^n}{1-k} d(x_1, x_0).\]

Proof. Unicité : Si \(f(c) = c\) et \(f(c') = c'\), alors \(d(c, c') = d(f(c), f(c')) \leq k \cdot d(c, c')\), donc \((1-k)d(c,c') \leq 0\), d’où \(c = c'\).

Existence : \((x_n)\) est de Cauchy : \(d(x_{n+p}, x_n) \leq d(x_1, x_0)(k^n + \cdots + k^{n+p-1}) \leq \dfrac{k^n}{1-k} d(x_1, x_0) \to 0\). Elle converge vers \(c\) par complétude. Par continuité de \(f\) : \(f(c) = \lim f(x_n) = \lim x_{n+1} = c\).

Remarque 52

Ce théorème est le fondement de nombreux résultats d’existence en analyse :

  • Théorème de Cauchy-Lipschitz (existence/unicité pour les EDO)

  • Méthode de Newton en analyse numérique

  • Inversibilité locale (théorème des fonctions implicites)

La convergence est géométrique (de raison \(k\)), ce qui est rapide en pratique.

Hide code cell source

fig, axes = plt.subplots(2, 1, figsize=(9, 9))

# Théorème du point fixe de Brouwer (dim 1) illustré
ax = axes[0]
x = np.linspace(0, 1, 400)
f_pf = lambda t: 0.8*np.sin(np.pi*t/2) + 0.1*t + 0.05

ax.plot(x, f_pf(x), 'b-', lw=2.5, label='$f : [0,1] \\to [0,1]$')
ax.plot(x, x, 'k--', lw=1.5, alpha=0.7, label='$y=x$')
ax.fill_between(x, x, f_pf(x), where=(f_pf(x) >= x), alpha=0.1, color='green', label='$f(x) \\geq x$')
ax.fill_between(x, x, f_pf(x), where=(f_pf(x) < x), alpha=0.1, color='red', label='$f(x) < x$')

# Point fixe
c_pf = brentq(lambda t: f_pf(t) - t, 0, 1)
ax.scatter([c_pf], [c_pf], color='red', s=150, zorder=6, label=f'Point fixe $c \\approx {c_pf:.3f}$')
ax.axhline(0, color='k', lw=0.8)
ax.axvline(0, color='k', lw=0.8)
ax.set_xlim(0, 1)
ax.set_ylim(0, 1)
ax.set_aspect('equal')
ax.set_title('Théorème de Brouwer (dim 1)\n$f:[a,b]\\to[a,b]$ continue $\\Rightarrow$ point fixe')
ax.legend(fontsize=9)

# Convergence de la suite des itérées (Banach)
ax = axes[1]
f_banach = lambda t: 0.7 * np.cos(t) + 0.2

x_iter = np.linspace(-0.5, 2, 400)
ax.plot(x_iter, f_banach(x_iter), 'b-', lw=2.5, label='$f(x) = 0.7\\cos(x)+0.2$')
ax.plot(x_iter, x_iter, 'k--', lw=1.5, alpha=0.7, label='$y=x$')

c_ban = brentq(lambda t: f_banach(t) - t, 0, 1)
ax.scatter([c_ban], [c_ban], color='red', s=150, zorder=8, label=f'Point fixe $c \\approx {c_ban:.3f}$')

# Spirale de convergence
x0 = 0.0
xs, ys = [x0], [0]
for _ in range(12):
    y0 = f_banach(x0)
    xs.extend([x0, y0])
    ys.extend([y0, y0])
    x0 = y0

ax.plot(xs, ys, 'r-', lw=1.2, alpha=0.8, label='Itérations $x_{n+1}=f(x_n)$')
ax.set_xlim(-0.3, 1.5)
ax.set_ylim(-0.3, 1.5)
ax.set_title('Banach : convergence des itérées\n$x_{n+1} = f(x_n) \\to$ point fixe')
ax.legend(fontsize=9)

plt.tight_layout()
plt.show()
_images/9c3688117fd411feee8d21793bd3848d89a8e3cd124c7e6051f5618aeeb50e5c.png