Systèmes d'équations non linéaires

Objectifs d'apprentissage

À la fin de cette leçon, vous serez en mesure de :

  • Comprendre pourquoi on rencontre des systèmes non linéaires et leurs particularités
  • Appliquer la méthode du point fixe à plusieurs variables
  • Maîtriser la méthode de Newton multivariable
  • Calculer et interpréter la matrice jacobienne
  • Choisir une bonne estimation initiale et comprendre son importance

Prérequis

  • Méthode de Newton pour une équation (Chapitre 2)
  • Systèmes linéaires et factorisation LU (ce chapitre)
  • Notion de dérivées partielles

Pourquoi des systèmes non linéaires ?

Le monde réel est rarement linéaire

Jusqu'ici, nous avons résolu des systèmes linéaires Ax=bAx = b. Mais dans de nombreuses applications, les équations ne sont pas linéaires :

Exemple 1 : Cinématique d'un robot

Un bras robotique à 2 articulations doit atteindre un point (x,y)(x, y) dans l'espace. Si les bras ont des longueurs L1L_1 et L2L_2, les angles θ1\theta_1 et θ2\theta_2 doivent satisfaire :

{L1cos(θ1)+L2cos(θ1+θ2)=xL1sin(θ1)+L2sin(θ1+θ2)=y\begin{cases} L_1 \cos(\theta_1) + L_2 \cos(\theta_1 + \theta_2) = x \\ L_1 \sin(\theta_1) + L_2 \sin(\theta_1 + \theta_2) = y \end{cases}

Ce sont des équations non linéaires en θ1,θ2\theta_1, \theta_2 à cause des fonctions trigonométriques.

Exemple 2 : Équilibre chimique

Les concentrations à l'équilibre d'une réaction chimique satisfont des relations impliquant des produits de concentrations (loi d'action de masse).

Exemple 3 : Intersection de courbes

Trouver où un cercle intersecte une hyperbole :

{x2+y2=4(cercle)xy=1(hyperbole)\begin{cases} x^2 + y^2 = 4 \quad \text{(cercle)} \\ xy = 1 \quad \text{(hyperbole)} \end{cases}

Formulation générale

Un système de n équations non linéaires à n inconnues s'écrit :

F(x)=0F(x) = 0

où :

  • x=(x1,x2,,xn)TRnx = (x_1, x_2, \ldots, x_n)^T \in \mathbb{R}^n est le vecteur des inconnues
  • F:RnRnF : \mathbb{R}^n \to \mathbb{R}^n est une fonction vectorielle
  • F(x)=(f1(x),f2(x),,fn(x))TF(x) = (f_1(x), f_2(x), \ldots, f_n(x))^T

Chaque fif_i peut dépendre de toutes les variables x1,,xnx_1, \ldots, x_n de manière non linéaire.


Différences fondamentales avec le cas linéaire

AspectSystème linéaire Ax = bSystème non linéaire F(x) = 0
Nombre de solutions0, 1 ou infinitéPeut être 0, 1, 2, 3, ... ou infinité
Méthode directeOui (Gauss, LU)Non — toujours itératif
Solution trouvéeLa solution (si elle existe)Une solution parmi plusieurs possibles
Dépendance à l'initialisationAucuneCruciale — détermine quelle solution on trouve
⚠️

Conséquence importante

Pour un système non linéaire, différents points de départ peuvent mener à différentes solutions. Il n'y a pas de méthode garantie pour trouver toutes les solutions.

Illustration géométrique

Notre exemple x2+y2=4x^2 + y^2 = 4 et xy=1xy = 1 a 4 solutions (les 4 points d'intersection du cercle et de l'hyperbole). Selon le point de départ, Newton convergera vers l'une ou l'autre.


La matrice jacobienne : généralisation de la dérivée

Rappel : Newton en 1D

Pour résoudre f(x)=0f(x) = 0 en une variable, Newton utilise la dérivée f(x)f'(x) :

x(k+1)=x(k)f(x(k))f(x(k))x^{(k+1)} = x^{(k)} - \frac{f(x^{(k)})}{f'(x^{(k)})}

Qu'est-ce qui joue le rôle de ff' pour un système à plusieurs variables ?

La jacobienne : la "dérivée" d'une fonction vectorielle

💡

Définition : Matrice jacobienne

La matrice jacobienne de F:RnRnF : \mathbb{R}^n \to \mathbb{R}^n au point xx est la matrice n×nn \times n des dérivées partielles :

J(x)=(f1x1f1x2f1xnf2x1f2x2f2xnfnx1fnx2fnxn)J(x) = \begin{pmatrix} \frac{\partial f_1}{\partial x_1} & \frac{\partial f_1}{\partial x_2} & \cdots & \frac{\partial f_1}{\partial x_n} \\ \frac{\partial f_2}{\partial x_1} & \frac{\partial f_2}{\partial x_2} & \cdots & \frac{\partial f_2}{\partial x_n} \\ \vdots & \vdots & \ddots & \vdots \\ \frac{\partial f_n}{\partial x_1} & \frac{\partial f_n}{\partial x_2} & \cdots & \frac{\partial f_n}{\partial x_n} \end{pmatrix}

L'élément JijJ_{ij} mesure comment fif_i change quand on perturbe xjx_j.

Exemple concret

Pour notre système cercle-hyperbole :

F(x,y)=(x2+y24xy1)F(x, y) = \begin{pmatrix} x^2 + y^2 - 4 \\ xy - 1 \end{pmatrix}

La jacobienne est :

J(x,y)=(x(x2+y24)y(x2+y24)x(xy1)y(xy1))=(2x2yyx)J(x, y) = \begin{pmatrix} \frac{\partial}{\partial x}(x^2 + y^2 - 4) & \frac{\partial}{\partial y}(x^2 + y^2 - 4) \\ \frac{\partial}{\partial x}(xy - 1) & \frac{\partial}{\partial y}(xy - 1) \end{pmatrix} = \begin{pmatrix} 2x & 2y \\ y & x \end{pmatrix}

Au point (1.5,0.5)(1.5, 0.5) :

J(1.5,0.5)=(310.51.5)J(1.5, 0.5) = \begin{pmatrix} 3 & 1 \\ 0.5 & 1.5 \end{pmatrix}

Interprétation géométrique

La jacobienne donne la meilleure approximation linéaire de FF autour d'un point :

F(x+Δx)F(x)+J(x)ΔxF(x + \Delta x) \approx F(x) + J(x) \cdot \Delta x

C'est l'analogue multidimensionnel de f(x+h)f(x)+f(x)hf(x + h) \approx f(x) + f'(x) h.


Méthode de Newton multivariable

Principe : linéariser et résoudre

L'idée de Newton est simple : remplacer le problème non linéaire par une suite de problèmes linéaires.

À chaque itération :

  1. Linéariser FF autour de x(k)x^{(k)} : F(x)F(x(k))+J(x(k))(xx(k))F(x) \approx F(x^{(k)}) + J(x^{(k)})(x - x^{(k)})
  2. Résoudre l'équation linéarisée F(x(k))+J(x(k))(xx(k))=0F(x^{(k)}) + J(x^{(k)})(x - x^{(k)}) = 0
  3. Itérer avec la solution comme nouveau point

Formule de Newton

En posant Δx=x(k+1)x(k)\Delta x = x^{(k+1)} - x^{(k)}, on obtient le système linéaire :

J(x(k))Δx=F(x(k))J(x^{(k)}) \cdot \Delta x = -F(x^{(k)})

puis :

x(k+1)=x(k)+Δxx^{(k+1)} = x^{(k)} + \Delta x
🚨

Point crucial

À chaque itération de Newton, on résout un système linéaire. Toutes les techniques du chapitre (LU, pivotage, etc.) sont donc utiles ici !

Exemple pas à pas

Résolvons x2+y2=4x^2 + y^2 = 4 et xy=1xy = 1 en partant de (x(0),y(0))=(1.5,0.5)(x^{(0)}, y^{(0)}) = (1.5, 0.5).

Itération 1 :

  1. Évaluer FF :
F(1.5,0.5)=(1.52+0.5241.5×0.51)=(2.25+0.2540.751)=(1.50.25)F(1.5, 0.5) = \begin{pmatrix} 1.5^2 + 0.5^2 - 4 \\ 1.5 \times 0.5 - 1 \end{pmatrix} = \begin{pmatrix} 2.25 + 0.25 - 4 \\ 0.75 - 1 \end{pmatrix} = \begin{pmatrix} -1.5 \\ -0.25 \end{pmatrix}
  1. Calculer la jacobienne :
J(1.5,0.5)=(2×1.52×0.50.51.5)=(310.51.5)J(1.5, 0.5) = \begin{pmatrix} 2 \times 1.5 & 2 \times 0.5 \\ 0.5 & 1.5 \end{pmatrix} = \begin{pmatrix} 3 & 1 \\ 0.5 & 1.5 \end{pmatrix}
  1. Résoudre JΔx=FJ \cdot \Delta x = -F :
(310.51.5)(ΔxΔy)=(1.50.25)\begin{pmatrix} 3 & 1 \\ 0.5 & 1.5 \end{pmatrix} \begin{pmatrix} \Delta x \\ \Delta y \end{pmatrix} = \begin{pmatrix} 1.5 \\ 0.25 \end{pmatrix}

Par élimination de Gauss (ou substitution) : Δx=0.5\Delta x = 0.5, Δy=0\Delta y = 0

  1. Mettre à jour :
x(1)=1.5+0.5=2.0,y(1)=0.5+0=0.5x^{(1)} = 1.5 + 0.5 = 2.0, \quad y^{(1)} = 0.5 + 0 = 0.5

Itération 2 :

F(2.0,0.5)=(2.02+0.5242.0×0.51)=(0.250)F(2.0, 0.5) = \begin{pmatrix} 2.0^2 + 0.5^2 - 4 \\ 2.0 \times 0.5 - 1 \end{pmatrix} = \begin{pmatrix} 0.25 \\ 0 \end{pmatrix}

Le résidu a déjà été divisé par six. Après quelques itérations supplémentaires, on converge vers (1.9319,0.5176)(1.9319, 0.5176).

Vérification : 1.93192+0.51762=4.0001.9319^2 + 0.5176^2 = 4.000 ✓ et 1.9319×0.5176=1.0001.9319 \times 0.5176 = 1.000

Visualisation interactive


Convergence de Newton

Théorème de convergence locale

💡

Théorème

Si xx^* est une solution de F(x)=0F(x) = 0 avec J(x)J(x^*) inversible, alors il existe un voisinage de xx^* tel que pour tout x(0)x^{(0)} dans ce voisinage, la méthode de Newton converge vers xx^*.

De plus, la convergence est quadratique :

x(k+1)xCx(k)x2\|x^{(k+1)} - x^*\| \leq C \|x^{(k)} - x^*\|^2

Interprétation de la convergence quadratique

Quadratique signifie que le nombre de chiffres corrects double à chaque itération :

ItérationErreur approximative
k = 010110^{-1} (1 chiffre)
k = 110210^{-2} (2 chiffres)
k = 210410^{-4} (4 chiffres)
k = 310810^{-8} (8 chiffres)
k = 4101610^{-16} (précision machine !)

En 4-5 itérations, on atteint souvent la précision maximale possible.

Quand Newton échoue

La méthode peut échouer si :

  1. Jacobienne singulière : det(J(x(k)))=0\det(J(x^{(k)})) = 0 → division par zéro
  2. Point de départ trop loin : on peut diverger ou osciller
  3. Pas de solution : F(x)=0F(x) = 0 n'a pas de solution

Choix de l'estimation initiale

Le succès de Newton dépend fortement du point de départ x(0)x^{(0)}.

Stratégies pratiques

StratégieDescriptionExemple
Analyse physiqueUtiliser la connaissance du problèmeRobot : les angles sont entre 0 et π
VisualisationTracer les courbes pour localiser les solutionsIntersection cercle-hyperbole visible graphiquement
ContinuationRésoudre d'abord un problème plus simplePartir d'un système linéarisé
Multi-startEssayer plusieurs points de départGrille de points initiaux

Exemple : trouver les 4 solutions

Pour notre système cercle-hyperbole, la contrainte xy=1>0xy = 1 > 0 impose que xx et yy soient de même signe : les 4 solutions se répartissent deux par deux dans les quadrants 1 et 3. En partant d'un point proche de chacune, on peut les trouver toutes :

Point de départSolution trouvée
(1.5,0.5)(1.5, 0.5)(1.932,0.518)(1.932, 0.518)
(1.5,0.5)(-1.5, -0.5)(1.932,0.518)(-1.932, -0.518)
(0.5,1.5)(0.5, 1.5)(0.518,1.932)(0.518, 1.932)
(0.5,1.5)(-0.5, -1.5)(0.518,1.932)(-0.518, -1.932)

Approximation numérique de la jacobienne

Quand les dérivées analytiques sont difficiles

Parfois, calculer les dérivées partielles analytiquement est :

  • Fastidieux (formules complexes)
  • Impossible (fonction définie par du code, pas une formule)

On peut alors approximer la jacobienne par différences finies.

Formule par différences finies

fixjfi(x+hej)fi(x)h\frac{\partial f_i}{\partial x_j} \approx \frac{f_i(x + h \cdot e_j) - f_i(x)}{h}

ej=(0,,0,1,0,,0)Te_j = (0, \ldots, 0, 1, 0, \ldots, 0)^T est le j-ème vecteur de base.

Choix de h : typiquement hεmachine108h \approx \sqrt{\varepsilon_{\text{machine}}} \approx 10^{-8} en double précision.

Coût computationnel

Pour une jacobienne n×nn \times n :

  • Analytique : une évaluation de J
  • Numérique : n+1n + 1 évaluations de F (une pour F(x), une pour chaque colonne)

Pour de grands systèmes, l'approximation numérique peut être coûteuse !


Méthode du point fixe (alternative)

Principe

Comme pour une équation scalaire, on peut reformuler F(x)=0F(x) = 0 en :

x=G(x)x = G(x)

et itérer x(k+1)=G(x(k))x^{(k+1)} = G(x^{(k)}).

Exemple

Pour x2+y2=4x^2 + y^2 = 4 et xy=1xy = 1, une reformulation :

{x=4y2y=1/x\begin{cases} x = \sqrt{4 - y^2} \\ y = 1/x \end{cases}

Condition de convergence

💡

Théorème

Si GG est continûment différentiable et si le rayon spectral de sa jacobienne satisfait :

ρ(Gx)<1\rho\left(\frac{\partial G}{\partial x}\right) < 1

dans un voisinage de la solution, alors la méthode converge.

Comparaison avec Newton

AspectPoint fixeNewton
VitesseLinéaireQuadratique
Dérivées requisesNonOui (jacobienne)
ReformulationNécessaireNon
Coût par itérationFaibleÉlevé (système linéaire)

En pratique, Newton est généralement préféré pour sa convergence rapide.


Résumé

MéthodeFormuleConvergence
Point fixex(k+1)=G(x(k))x^{(k+1)} = G(x^{(k)})Linéaire si ρ(G/x)<1\rho(\partial G/\partial x) < 1
NewtonJ(x(k))Δx=F(x(k))J(x^{(k)}) \Delta x = -F(x^{(k)})Quadratique si J(x)J(x^*) inversible
Newton numériqueIdem, J approx. par diff. finiesQuadratique (moins précis)

Points clés à retenir :

  1. Systèmes non linéaires : peuvent avoir plusieurs solutions, pas de méthode directe
  2. Jacobienne : matrice des dérivées partielles, généralise la dérivée
  3. Newton : convergence quadratique, résout un système linéaire à chaque itération
  4. Estimation initiale : cruciale — détermine vers quelle solution on converge
  5. Jacobienne numérique : alternative quand les dérivées analytiques sont indisponibles

Implémentations Python

Méthode de Newton avec jacobienne analytique

newton_systeme.pypython
import numpy as np

def newton_systeme(F, jacobian, x0, max_iter=50, tol=1e-10):
  """
  Méthode de Newton pour système F(x) = 0.

  Paramètres:
  -----------
  F : fonction qui retourne le vecteur F(x)
  jacobian : fonction qui retourne la matrice J(x)
  x0 : estimation initiale
  max_iter : nombre maximum d'itérations
  tol : tolérance pour ||F(x)||

  Retourne:
  ---------
  x : solution approchée
  """
  x = np.array(x0, dtype=float)

  for k in range(max_iter):
      f = F(x)

      # Test de convergence sur ||F(x)||
      if np.linalg.norm(f) < tol:
          print(f"Convergence en {k+1} itérations")
          return x

      # Calculer la jacobienne
      J = jacobian(x)

      # Résoudre le système linéaire J · Δx = -F
      delta_x = np.linalg.solve(J, -f)

      # Mise à jour : x = x + Δx
      x = x + delta_x

  print(f"Non convergé après {max_iter} itérations")
  return x

Jacobienne par différences finies

jacobienne_numerique.pypython
def jacobienne_numerique(F, x, h=1e-8):
  """
  Calcule la matrice jacobienne par différences finies.

  Coût : n+1 évaluations de F pour une jacobienne n×n.
  """
  n = len(x)
  f0 = F(x)
  J = np.zeros((n, n))

  for j in range(n):
      x_perturb = x.copy()
      x_perturb[j] += h
      J[:, j] = (F(x_perturb) - f0) / h

  return J

def newton_numerique(F, x0, max_iter=50, tol=1e-10):
  """
  Newton avec jacobienne calculée numériquement.
  Utile quand les dérivées analytiques sont indisponibles.
  """
  x = np.array(x0, dtype=float)

  for k in range(max_iter):
      f = F(x)

      if np.linalg.norm(f) < tol:
          print(f"Convergence en {k+1} itérations")
          return x

      J = jacobienne_numerique(F, x)
      delta_x = np.linalg.solve(J, -f)
      x = x + delta_x

  print(f"Non convergé après {max_iter} itérations")
  return x

Méthode du point fixe

point_fixe_systeme.pypython
def point_fixe_systeme(G, x0, max_iter=100, tol=1e-8):
  """
  Méthode du point fixe pour système x = G(x).

  Converge si le rayon spectral de ∂G/∂x < 1
  près de la solution.
  """
  x = np.array(x0, dtype=float)

  for k in range(max_iter):
      x_new = G(x)

      if np.linalg.norm(x_new - x) < tol:
          print(f"Convergence en {k+1} itérations")
          return x_new

      x = x_new

  print(f"Non convergé après {max_iter} itérations")
  return x

Exemple complet : cercle et hyperbole

exemple_complet.pypython
import numpy as np

# Système : x² + y² = 4 et xy = 1
def F(x):
  return np.array([
      x[0]**2 + x[1]**2 - 4,
      x[0] * x[1] - 1
  ])

def J(x):
  return np.array([
      [2*x[0], 2*x[1]],
      [x[1], x[0]]
  ])

# Trouver les 4 solutions avec différents points de départ
print("=== Recherche des 4 solutions ===\n")

points_depart = [
  [1.5, 0.5],    # Quadrant 1
  [-1.5, -0.5],  # Quadrant 3
  [0.5, 1.5],    # Quadrant 1 (autre solution)
  [-0.5, -1.5]   # Quadrant 3 (autre solution)
]

for x0 in points_depart:
  sol = newton_systeme(F, J, x0)
  print(f"  Point de départ : {x0}")
  print(f"  Solution trouvée : ({sol[0]:.6f}, {sol[1]:.6f})")
  print(f"  Vérification : x² + y² = {sol[0]**2 + sol[1]**2:.6f}, xy = {sol[0]*sol[1]:.6f}")
  print()

Fin du chapitre

Ce chapitre a couvert les méthodes de résolution des systèmes d'équations linéaires et non linéaires. Les concepts clés sont :

  1. Méthodes directes : Gauss, LU, pivotage — solution exacte en temps fini
  2. Analyse : rang, déterminant, conditionnement — comprendre le système
  3. Méthodes itératives : Jacobi, Gauss-Seidel, SOR — grands systèmes creux
  4. Systèmes non linéaires : Newton multivariable — convergence quadratique locale

Ces outils sont fondamentaux pour de nombreuses applications en sciences, ingénierie, et informatique.