Méthode de point fixe

1. Principe

Définition: Point Fixe vs Trouver une racine

Un procédé général pour trouver les racines d’une équation non linéaire \(f(x) = 0\) consiste en la transformer en un problème équivalent \(x-\phi(x) = 0\), où la fonction auxiliaire \(\phi:[a,b]\rightarrow\mathbb{R}\) doit avoir la propriété suivante :

\[\phi(\alpha)=\alpha \qquad \text{si et seulement si} \qquad f(\alpha) = 0.\]

Le point \(\alpha\) est dit alors point fixe de la fonction \(\phi\). Approcher les zéros de \(f\) se ramène donc au problème de la détermination des points fixes de \(\phi\).

Idée de l’algorithme de Point Fixe

On va construire des suites qui vérifient \(x^{(k+1)}=\phi(x^{(k)})\), \(k\geq 0\). En effet, si \(x^{(k)}\rightarrow \alpha\) et si \(\phi\) est continue dans \([a,b]\), alors la limite \(\alpha\) satisfait \(\phi(\alpha)=\alpha\).

Exemple: États d’équilibre

Dans l’étude des populations (e.g. bacteries) on veut établir un lien entre le nombre d’individus d’une génération \(x\) et le nombre d’individus de la génération suivante \(x^+\):

\[\label{eq:evodisc} x^+=\phi(x)=xR(x),\]

où \(R(x)\) représente le taux de croissance (ou bien la décroissance) de la population considérée.

Plusieurs modèles sont disponibles pour \(R(x)\):

  • le modèle de Malthus (Thomas Malthus 1766-1834),

    \[x^+=\phi_1(x)=xR_1(x) \ \text{avec} \ R_1(x)=r, \quad r \ \text{constante positive}\]
  • le modèle de croissance avec ressources limitées (Pierre François Verhulst, 1804-1849),

    \[x^+=\phi_2(x)=xR_2(x) \ \text{avec} \ R_2(x)=r/(1+x/K), \quad r>0,K>0\]

    qui améliore le modèle de Malthus en tenant compte la croissance d’une population limitée par les ressources à disposition.

  • le modèle du proie-prédateur avec saturation

    \[x^+=\phi_3(x)=xR_3(x) \ \text{avec} \ R_3(x)=rx/(1+(x/K)^2)\]

    qui représente l’évolution du modèle de Verhulst dans la présence d’une population antagoniste.

La dynamique d’une population est définie par un processus itératif, à partir d’un état initial donné (\(x^{(0)}\)),

\[x^{(k)}=\phi(x^{(k-1)}), \quad k>0,\]

où \(x_k\) représente le nombre d’individus \(k\) générations après de l’état initial.

De plus, les états stationnaires (d’équilibre) \(x^*\) de la population considérée sont identifiés par le problème suivant,

\[x^*=\phi(x^*),\]

ou de façon équivalente,

\[x^*=x^*R(x^*), \quad \text{c.à.d} \quad R(x^*)=1.\]

Dans les deux cas on demande de résoudre un problème non linéaire. En particulier le problème [eq:evostat1] est dit problème de point fixe.

Exemple: \(f(x) = \sin(2x) -1 + x = 0\)

On considère toujours l’équation \(f(x) = \sin(2x) -1 + x = 0\). On peut construire deux problèmes équivalents

\[\begin{aligned} &x = \phi_1(x) = 1-\sin(2x) \\ &x = \phi_2(x) = \frac{1}{2}\arcsin(1-x), \qquad 0\leq x \leq 1 \end{aligned}\]
image
Proposition: Convergence globale

Supposons que les hypothèses suivantes sont vérifiées:

H1

Soit \(\phi:[a,b]\rightarrow\mathbb{R}\) une fonction continue et différentiable sur \([a,b]\) telle que \(\forall x\in[a,b]\) \(\phi(x) \in [a,b]\); Alors il existe au moins un point fixe \(\alpha \in [a, b]\) de \(\phi\).

H2

De plus supposons que \(\exists K<1\) tel que \(|\phi^\prime(x)|\leq K\) \(\forall x\in[a,b]\).

Alors

  1. il existe un unique point fixe \(\alpha\) de \(\phi\) dans \([a,b]\) ;

  2. \(\forall x^{(0)}\in[a,b]\), la suite \(\{x^{(k)}\}\) définie par \(x^{(k+1)}=\phi(x^{(k)})\), \(k\geq 0\) \(\phantom{2-}\) converge vers \(\alpha\) lorsque \(k\rightarrow\infty\) ;

  3. on a le résultat de convergence suivant :

\[\mid x^{(k+1)}-\alpha\mid\leq K\mid x^{(k)}-\alpha\mid, \quad \forall k\in\mathbb{N}.\]
Démonstration
  1. Si l’hypothèse H1 est vérifiée: La fonction \(g(x) = \phi(x) - x\) est continue sur \([a,b]\) et, pour l’hypothèse sur l’image de \(\phi\), on a que \(g(a) = \phi(a) - a \geq 0\) et \(g(b) = \phi(b) - b \leq 0\). On sait alors qu’il existe au moins un zéro de \(g\) dans l’intervalle \([a,b]\), donc il existe au moins un point fixe de \(\phi\) dans \([a,b]\).

  2. Si l’hypothèse H2 est vérifiée: on peut montrer que l’hypothèse H2 est équivalent à:

    \(\exists K<1\) tel que \(|\phi(x_1) - \phi(x_2) |\leq K |x_1 - x_2|, \quad \forall x_1, x_2 \in [a,b]\).

Soient \(\alpha_1, \alpha_2 \in [a, b]\) deux points fixes différents, on a donc que

\[| \alpha_1 - \alpha_2 | = |\phi(\alpha_1) - \phi(\alpha_2) | \leq K | \alpha_1 - \alpha_2 | < | \alpha_1 - \alpha_2 |,\]

ce qui est absurde. Il existe donc un unique point fixe \(\alpha\) de \(\phi\) dans \([a,b]\).

Soient \(x^{(0)} \in [a, b]\) et \(x^{(k+1)}=\phi(x^{(k)})\). On a que

\[0 \leq | x^{(k+1)} - \alpha | = | \phi(x^{(k)}) - \phi(\alpha) | \leq K |x^{(k)} - \alpha | \leq ... \leq K^{k+1} |x^{(0)} - \alpha |,\]

c-à-d

\[\frac{|x^{(k)} - \alpha|}{|x^{(0)} - \alpha|} \leq K^k.\]

Puisque \(K < 1\), pour \(k \rightarrow \infty\), on a que

\[\lim_{k \rightarrow \infty} |x^{(k)} - \alpha | \leq \lim_{k \rightarrow \infty} K^k = 0.\]

Donc, \(\forall x^{(0)}\in[a,b]\), la suite \(\{x^{(k)}\}\) définie par \(x^{(k+1)}=\phi(x^{(k)})\), \(k\geq 0\) converge vers \(\alpha\) lorsque \(k\rightarrow\infty\).

Pour la dernière partie, on peut montrer cela de manière alternative

A partir de

\[x^{(k+1)}-\alpha=\phi\left(x^{(k)}\right)-\phi(\alpha)\]

on tire, grâce au théorème de Lagrange appliqué à la fonction \(\phi\), qu’il existe \(\eta\) compris entre \(x^{(k)}\) et \(\alpha\) tel que

\[x^{(k+1)}-\alpha=\phi^{\prime}(\eta)\left(x^{(k)}-\alpha\right) .\]

Or, \(x^{(k)}\) et \(\alpha\) appartiennent à \([a, b]\), donc on a \(\eta \in[a, b]\) aussi; ceci entraîne le résultat voulu, grâce à l’hypothèse \(\mathrm{H} 2\) :

\[\left|x^{(k+1)}-\alpha\right|=\left|\phi^{\prime}(\eta)\left(x^{(k)}-\alpha\right)\right|=\left|\phi^{\prime}(\eta)\right|\left|x^{(k)}-\alpha\right| \leq K\left|x^{(k)}-\alpha\right| .\]
Définition: Ordre de convergence

Pour une suite de nombres réels \(\{x^{(k)}\}\) qui converge, \(x^{(k)}\rightarrow \alpha\), on dit que

la convergence vers \(\alpha\) est linéaire

s’il existe une constante \(C<1\) telle que, pour \(k\) suffisamment grand,

\[\mid x^{(k+1)}-\alpha\mid\leq C\mid x^{(k)}-\alpha\mid.\]
la convergence vers \(\alpha\) est quadratique

S’il existe une constante \(C>0\) telle que

\[\mid x^{(k+1)}-\alpha\mid\leq C\mid x^{(k)}-\alpha\mid^2.\]

En général, la convergence est d’ordre \(p\), \(p\in\mathbb{N}^*\), s’il existe une constante \(C>0\) telle que l’inégalité suivante soit satisfaite

\[\mid x^{(k+1)}-\alpha\mid\leq C\mid x^{(k)}-\alpha\mid^p.\]
Proposition: Convergence locale

Soient \(\phi\) une fonction différentiable sur \([a,b\)] et \(\alpha\) un point fixe de \(\phi\). Si \(\mid \phi'(\alpha)\mid<1\), alors il existe un \(\delta>0\) tel que, pour tout \(x^{(0)}\) , \(\mid x^{(0)}-\alpha\mid\leq \delta\), la suite \(\{x^{(k)}\}\) définie par \(x^{(k+1)}=\phi(x^{(k)})\) converge vers \(\alpha\) lorsque \(k\rightarrow\infty\)._

En plus, on a

\[\lim_{k\rightarrow\infty}\displaystyle\frac{x^{(k+1)}-\alpha}{x^{(k)}-\alpha}=\phi'(\alpha).\]

On remarque que, si \(0<\mid \phi'(\alpha)\mid<1\), alors pour n’importe quelle constante \(C\) telle que \(|\phi'(\alpha)|<C<1\), si \(k\) est suffisamment grand on a :

\[\mid x^{(k+1)}-\alpha\mid\leq C\mid x^{(k)}-\alpha\mid.\]
Proposition:. Convergence d’ordre 2

Soient \(\phi\) une fonction deux fois différentiable sur \([a,b]\) et \(\alpha\) un point fixe de \(\phi\). Si \(\phi'(\alpha) = 0\), alors la méthode de point fixe associée à la fonction d’itération \(\phi\) est d’ordre 2 et

\[ \lim_{k\rightarrow\infty}\frac{x^{(k+1)} - \alpha}{(x^{(k)} - \alpha)^2} = \frac{\phi^{\prime\prime}(\alpha)}{2}.\]
Démonstration: Convergence d’ordre 2

Un développement de Taylor de \(\phi\) en \(x=\alpha\) donne

\[x^{(k+1)} - \alpha = \phi(x^{(k)}) - \phi(\alpha) = \phi^\prime(\alpha)(x^{(k)} - \alpha) + \frac{\phi^{\prime\prime}(\eta)}{2}(x^{(k)} - \alpha)^2\]

où \(\eta\) est entre \(x^{(k)}\) et \(\alpha\). Ainsi, on a

\[\lim_{k\rightarrow\infty}\frac{x^{(k+1)} - \alpha}{(x^{(k)} - \alpha)^2} = \lim_{k\rightarrow\infty}\frac{\phi^{\prime\prime}(\eta)}{2} = \frac{\phi^{\prime\prime}(\alpha)}{2}.\]

2. Implémentation de la méthode de point fixe

L’implémentation de la méthode de point fixe est très simple:

Implémentation
def fixpoint(phi, x0, tol, nmax, *args):
    """
    FIXPOINT Fixed point iterations.
    P=FIXPOINT(PHI,X0,TOL,NMAX) tries to find the fixed point P of the 
    continuous and differentiable function PHI using fixed point iterations 
    starting from X0. PHI is a function which accepts real scalar input x 
    and returns a real scalar value. If the search fails, an error message is displayed.
    
    [P,RES,NITER]= FIXPOINT(PHI,...) returns the value of the residual in ZERO
    and the iteration number at which ZERO was computed.
    
    [P,RES,NITER,INC]= FIXPOINT(PHI,...) returns a list INC with the absolute values of the
    differences between successive approximations (increments).
    """
    x = x0
    phix = phi(x, *args)
    niter = 0
    diff = tol + 1
    inc = [x0]
    
    while diff >= tol and niter < nmax:
        niter += 1
        diff = abs(phix - x)
        x = phix
        phix = phi(x, *args)
        inc.append(diff)
        
    if niter >= nmax:
        print('fixpoint stopped without converging to the desired tolerance',
              'because the maximum number of iterations was reached')
        
    p = x
    res = phix - x
    
    return p, res, niter, inc

voici un exemple d’utilisation de la méthode de point fixe

Zéro de \(f(x) = x^2 - 4\)
from tan.eqnonlin.fixpoint import fixpoint
# Define a function phi for fixed-point iteration
phi = lambda x: -x**2/4 + x +1  # Example function
x0 = 1.5  # Initial guess
tol = 1e-5  # Tolerance
nmax = 100  # Maximum number of iterations

# Call the fixpoint function
p, res, niter, inc = fixpoint(phi, x0, tol, nmax)
print(f"Fixed Point: {p}, Residual: {res}, Iterations: {niter}")
Results
Fixed Point: 1.9999999999999858, Residual: 1.4210854715202004e-14, Iterations: 4

3. Influence de \(\mid \phi'(\alpha) \mid\)

Quelques exemples sur comment la valeur de \(\mid \phi'(\alpha)\mid\) influence la convergence.

Cas convergent

\(0<\phi'(\alpha)<1\), \(\qquad \qquad \qquad\) \(-1<\phi'(\alpha)<0\).

image
image
Cas divergent

\(\phi'(\alpha)>1\), \(\qquad \qquad \qquad\) \(\phi'(\alpha)<-1\).

image

image

4. Exemples

Exemple: Population de bactéries

On applique la méthode de point fixe aux fonctions \(\phi_2(x)=rx/(1+x/K)\) et \(\phi_3(x)=rx^2/(1+(x/K)^2)\) qui représentent le modèles de Verhulst et proie-predateur respectivement.

On considère le point de départ \(x^{(0)}=1.0\).

import numpy as np
import plotly.graph_objs as go

# Define the functions
phi2 = lambda x: x * (2 / (1 + (x / 1.5)))
phi3 = lambda x: x * (2 * x / (1 + (x / 1.5)**2))

# Define the x range
x = np.linspace(0, 5, 50)

# Calculate y values for phi2 and phi3
y_phi2 = phi2(x)
y_phi3 = phi3(x)

# Create the plot
fig = go.Figure()

# Add traces for phi2, phi3, and y=x
fig.add_trace(go.Scatter(x=x, y=y_phi2, mode='lines', name='phi2', line=dict(color='blue')))
fig.add_trace(go.Scatter(x=x, y=y_phi3, mode='lines', name='phi3', line=dict(color='red')))
fig.add_trace(go.Scatter(x=x, y=x, mode='lines', name='y=x', line=dict(color='black')))

# Add grid and customize layout
fig.update_layout(
    title='Plot of phi2, phi3, and y=x',
    xaxis_title='x',
    yaxis_title='y',
    xaxis=dict(showgrid=True),
    yaxis=dict(showgrid=True)
)

# Show the plot
fig.show()
Results

Nous pouvons à présent appliquer les méthodes de point fixe

from tan.eqnonlin.fixpoint import fixpoint
# Calculate fixed points
p_phi2, res_phi2, niter_phi2,_ = fixpoint(phi2, 1, 1.e-6, 1000)
p_phi3, res_phi3, niter_phi3,_ = fixpoint(phi3, 1, 1.e-6, 1000)

print(f"Fixed point for phi2: {p_phi2}, Residual: {res_phi2}, Iterations: {niter_phi2}")
print(f"Fixed point for phi3: {p_phi3}, Residual: {res_phi3}, Iterations: {niter_phi3}")
Results
Fixed point for phi2: 1.4999992847446035, Residual: 3.576276128569589e-07, Iterations: 20
Fixed point for phi3: 3.927050862971204, Residual: 8.955723318493369e-08, Iterations: 15

On retrouve les points stationnaires \(\alpha_2=1.5\) et \(\alpha_3=3.9271\).

Fonction \(\phi_2(x)\)

voici les valeurs de \(x^{(k)}\) et \(|x^{(k)} - \alpha_2|\) pour \(k=0,1,2,3\).

\[\begin{array}{l} x^{(0)}=1.0000, \\ x^{(1)}=1.2000,\\ x^{(2)}=1.3333, \\ x^{(3)}=1.4118, \end{array} \qquad \quad \begin{array}{l} |x^{(0)} - \alpha_2| =0.5000 \\ |x^{(1)} - \alpha_2| =0.3000\\ |x^{(2)} - \alpha_2| =0.1667 \\ |x^{(3)} - \alpha_2| =0.0882 \end{array}\]
Fonction \(\phi_3(x)\)

voici les valeurs de \(x^{(k)}\) et \(|x^{(k)} - \alpha_3|\) pour \(k=0,1,2,3\).

\[\begin{array}{l} x^{(0)}=1.0000, \\ x^{(1)}=1.3846,\\ x^{(2)}=2.0703, \\ x^{(3)}=2.9509, \end{array} \qquad \quad \begin{array}{l} |x^{(0)} - \alpha_3|=2.9271 \\ |x^{(1)} - \alpha_3|=2.5424\\ |x^{(2)} - \alpha_3|=1.8568 \\ |x^{(3)} - \alpha_3|=0.9761 \end{array}\]
Exemple: \(f(x) = \sin(2x) -1 + x = 0\)

On a appliqué la méthode de point fixe aux deux fonctions \(\phi_1\) et \(\phi_2\) à partir de la valeur initiale \(x^{(0)}= 0.7\).

\[\begin{aligned} &x = \phi_1(x) = 1-\sin(2x) \\ &x = \phi_2(x) = \frac{1}{2}\arcsin(1-x), \qquad 0\leq x \leq 1 \end{aligned}\]
from tan.eqnonlin.fixpoint import fixpoint
# Define the functions
phi1 = lambda x: 1 - np.sin(2 * x)
phi2 = lambda x: 0.5 * np.arcsin(1 - x)

p,res,niter,inc=fixpoint(phi1,0.7,1e-8,1000)
print(f"Fixed point for phi1: {p}, Residual: {res}, Iterations: {niter}")
p,res,niter,inc=fixpoint(phi2,0.7,1e-8,1000)
print(f"Fixed point for phi2: {p}, Residual: {res}, Iterations: {niter}")
Results
fixpoint stopped without converging to the desired tolerance because the maximum number of iterations was reached
Fixed point for phi1: 0.8359761926820418, Residual: -0.830864279811731, Iterations: 1000
Fixed point for phi2: 0.35228845955865007, Residual: -5.130744273884602e-09, Iterations: 44

On remarque que la première méthode ne converge pas tandis que la deuxième converge à la valeur \(\alpha = 0.352288459558650\) en \(44\) itérations.

En effet, on a \(\phi^\prime_1(\alpha) = -1.5237713\) et \(\phi^\prime_2(\alpha) = -0.65626645\).

5. Newton: une méthode de point fixe

La méthode de Newton constitue une méthode de point fixe : \(x^{(k+1)}=\phi(x^{(k)})\) pour la fonction

\[\phi(x)=x-\displaystyle\frac{f(x)}{f'(x)}.\]

Soit \(\alpha\) un zéro pour la fonction \(f\), c-à-d tel que \(f(\alpha)=0\). On remarque que \(\phi'(\alpha)=0\), lorsque \(f'(\alpha)\neq 0\). En effet,

\[\phi'(x)=1-\displaystyle\frac{[f'(x)]^2-f(x)f''(x)}{[f'(x)]^2}.\]
Théorème: Convergence de la méthode de Newton

Si \(f\) est deux fois différentiable, \(f(\alpha)=0\) et \(f'(\alpha)\neq 0\), alors il existe \(\delta>0\) telle que, si \(\mid x^{(0)} - \alpha\mid\leq \delta\), la suite définie par la méthode de Newton converge vers \(\alpha\).

De plus, la convergence est quadratique; plus précisement

\[ \lim_{k \to \infty} \frac{x^{(k+1)} - \alpha}{(x^{(k)} - \alpha)^2} = \frac{f''(\alpha)}{2f'(\alpha)} \, .\]
Details

La propriété de la convergence vient de la Proposition Proposition: Convergence locale, tandis que la convergence quadratique est une conséquence de la Proposition Proposition:. Convergence d’ordre 2 et du fait que \(\phi^\prime(\alpha) = 0\) et que \(\frac{\phi''(\alpha)}{2} = \frac{f''(\alpha)}{2 f'(\alpha)}\).

Multiplicté d’un zéro

On dit que un zéro \(\alpha\) de \(f\) est de multiplicité \(p\), \(p\in\mathbb{N}\) si \(f(\alpha)=\ldots =f^{(p-1)}(\alpha)=0\,\,\,\,\text{ et } f^{(p)}(\alpha)\neq 0.\) Un zéro de multiplicité \(p=1\) est appelé zéro simple.

_Si \(f'(\alpha)=0\), la convergence de la méthode de Newton est seulement linéaire, pas quadratique. On considère alors la méthode de Newton modifiée:

\[{x^{(k+1)}=x^{(k)}-p\frac{f(x^{(k)})}{f'(x^{(k)})},\,\,\,k=0,1,2\ldots.}\]

avec \(p\) la multiplicité de \(\alpha\)._

Si la multiplicité \(p\) de \(\alpha\) n’est pas connue, il y a d’autres méthodes, des méthodes adaptatives, qui permettent de récupérer l’ordre quadratique de la convergence.

5.1. Un critère d’arrêt pour Newton

Quand faut-il terminer les itérations de l’algorithme de Newton?

Un bon critère d’arrêt est le contrôle de l’incrément: les itérations s’achèvent dès que

\[ |x^{(k+1)} - x^{(k)}| < \epsilon\]

où \(\epsilon\) est une tolérance fixée.

En fait, si on note \(e^{(k)} = \alpha - x^{(k)}\) l’erreur à l’itération \(k\), on a

\[e^{(k+1)} = \alpha - x^{(k+1)} = \phi(\alpha) - \phi(x^{(k)}) = \phi^\prime(\xi^{(k)})e^{(k)},\]

avec \(\xi^{(k)}\) entre \(x^{(k)}\) et \(\alpha\), et

\[x^{(k+1)} - x^{(k)} = \alpha - x^{(k)} - \alpha + x^{(k+1)} = e^{(k)} - e^{(k+1)} = \left(1-\phi^\prime(\xi^{(k)})\right)e^{(k)}.\]

Or, si \(k\) est suffisamment grand, \(\phi^\prime(\xi^{(k)}) \approx \phi^\prime(\alpha)\), et on sait que pour la méthode de Newton \(\phi'(\alpha) = 0\).

Donc on a

\[e^{(k)} \approx x^{(k+1)} - x^{(k)}.\]

L’erreur qu’on commet lorsque l’on adopte le critère [crit-arret] est donc plus petite que la tolérance fixée.

6. Critères d’arrêt

En général, pour toutes les méthodes étudiées, on peut utiliser deux critères d’arrêt différents : les itérations s’achèvent dès que

Contrôle de l’incrément

on contrôle l’incrément \(|x^{(k+1)} - x^{(k)}|\) et on s’arrête dès que \(|x^{(k+1)} - x^{(k)}| < \epsilon\) où \(\epsilon\) est une tolérance fixée.

Contrôle du résidu

on contrôle le résidu \(|f(x^{(k)})|\) et on s’arrête dès que \(|f(x^{(k)})| < \epsilon\) où \(\epsilon\) est une tolérance fixée.

On a vu que pour la méthode de Newton le premier critère (contrôle de l’incrément) est optimal au sens qu’il garantit que l’erreur finale soit plus petite que la tolérance fixée.

Par contre, le deuxième critére (contrôle du residu) est satisfaisant lorsque \(|f'|\simeq 1\) dans un voisinage de la racine \(\alpha\). Sinon il est soit trop restrictif (si \(|f'|\gg 1\)) soit trop faible (si \(|f|\ll 1\)):

image

Deux cas où le résidu est un mauvais estimateur de l’erreur: \(|f'(x)|\gg 1\) (à gauche), \(|f'(x)|\ll 1\) (à droite) avec \(x\) dans un voisinage de \(\alpha\).