Public feed #528396

Something

public text v1 · immutable
Raw Edit
·published 2007-06-01 15:14 UTC
rendered paste body
%% \usepackage{amsmath}

\section*{Méthodes numériques de résolution d'équations
  différentielles}
Nous allons ici développer plusieurs méthodes numériques de résolution
d'équations différentielles. Ce sont des méthodes à un pas, i.e. 
$$y_{n+1}=y_n+h_n\Phi(y_n,t_n,h_n)$$

Nous avons défini dans un premier temps la condition initiale $y(t_0)=y_0$ comme un couple
$(t_0,y_0)$. Nous avons conservé la fonction différentielle
représentant l'équation sous forme d'une fonction.\\
Nous avons ensuite eu des problèmes lorsque nous avons voulu passer en
dimension supérieure à 1 puisque $y_0$ est devenu un vecteur et non
plus un réel. Nous avons donc séparé $t_0$ et $y_0$.\\

Nous avons programmé chacune des méthodes proposées en fixant un
nombre $N$ de pas ou en donnant une précision $\epsilon$.

\subsection*{Méthode d'Euler}
Cette méthode d'ordre 1 repose sur l'équation suivante 
$$\Phi(y_n,t_n,h_n)=f(y_n,t_n)$$

Il suffit d'utiliser la fonction \textit{step\_euler} qui renvoie
$y_{n+1}$ pour $y_n$ donné. Pour la méthode où l'on fixe un certain
nombre de pas, on applique la fonction $N$ fois.\\
Au départ, nous avons choisi de fixer un nombre de pas en paramètre de
la fonction, nous avons décidé ensuite de la taille du pas $h$ en
fonction de $N$. En choisissant $h=\frac{1}{N}$, nous ne pouvions
intégrer que sur l'intervalle $\[0,1\]$. C'est pour cela que nous
avons introduit la taille du pas $h$ directement en paramètre.\\
Finalement, nous avons préféré introduire un paramètre $t_1$ qui nous
permettait de faire l'intégration sur l'intervalle $\[t_0,t_1\]$. Nous
avons fixé le pas $h$ dans la fonction, tel que
$h=\frac{|t_1-t_0|}{N}$.\\

Nous avons implémenté la méthode d'une deuxième manière, en utilisant
une précision $\epsilon$. Le but est d'améliorer la précision du
résultat. Comme nous divisions le pas par deux à chaque nouvel appel
de la fonction, le choix du pas a été délicat, en effet s'il est trop petit,
le temps de calcul est trop important. S'il est trop grand au départ,
l'algorithme va diviser de plus en plus le pas par deux et le temps de
calcul va être multiplié par deux à chaque fois. Nous avons fait le
choix dsuivant :
$\left\{\begin{array}{l}h=\frac{1}{2} si\ (t_1 - t_0) > 1\\
h=\frac{(t_1 - t_0)}{2} sinon\end{array}\right.$

Nous divisons le pas par deux tant que l'écart entre deux solutions
successives est supérieur à $\epsilon$.\\

Au départ, nous renvoyions un tableau d'abscisses et un vecteur de
solution. Pour s'adapter à la dimension supérieure, nous renvoyons un
tableau d'abscisses et un matrice de solutions 
$\begin{pmatrix}
 & \cdots& \\
y_1&\cdots&y_n \\
 &\cdots& \end{pmatrix}$

Pour visualiser le résultat, nous affichons $y_n$ en fonction des
abscisses.\\
Pour la méthode avec un nombre de pas fixé, la solution est de moins
en moins précise au fur et à mesure des calculs puisque l'on cumule
les erreurs. On voit cette erreur sur le figure~\ref{cos_erreur}.

\begin{figure}
\centering
\includegraphics[angle=-90,width=10]{euler_ex30}
\label{cos_erreur}
\caption{Visualisation de l'erreur avec la méthode d'Euler}
\end{figure}

Sur l'exemple $y^{'}(t) = -2 * t * y(t)^2$, on obtient la figure~\ref{ex1}
\begin{figure}
\centering
\includegraphics[angle=-90,width=10]{euler_ex1}
\label{ex1}
\caption{Exemple d'application de la méthode d'Euler}
\end{figure}

Sur le premier exemple du sujet, on obtient bien la solution
$\exp(arctan(x))$ sur la figure~\ref{ex2}
\begin{figure}
\centering
\includegraphics[angle=-90,width=10]{euler_ex1}
\label{ex1}
\caption{Exemple d'application de la méthode d'Euler}
\end{figure}

Sur le premier exemple du sujet, on obtient bien la solution
$\exp(arctan(x))$ sur la figure~\ref{ex2}
\begin{figure}
\centering
\includegraphics[angle=-90,width=10]{euler_ex2}
\label{ex2}
\caption{Exemple d'application de la méthode d'Euler sur le premier
  exemple du sujet}
\end{figure}

Sur le deuxième exemple, nous obtenons la figure~\ref{ex30} pour la
méthode avec $N=100$ et la figure~\ref{ex31} pour la méthode avec
$\epsilon=0.1$.
\begin{figure}
\centering
\includegraphics[angle=-90,width=10]{euler_ex30}
\label{ex30}
\includegraphics[angle=-90,width=10]{euler_ex31}
\label{ex31}
\caption{Exemple d'application de la méthode d'Euler sur le deuxième
  exemple du sujet}
\end{figure}



\subsection{Méthodes du point milieu, de Heun et de Runge-Kutta}
Ces méthodes ont été implementées de la même manière que la méthode
d'Euler, il n'y a que la fonction qui effectue un pas qui change.\\

Les méthodes du point milieu et de Heun sont des méthodes d'ordre 2
tandis que la méthode de Runge-Kutta est d'ordre 4. Nous avons tracé
des courbes de convergence (Figure~\ref{convergence})pour les différentes méthodes. On voit bien
que les méthodes du point milieu et de Heun sont du même ordre. Sur
cet exemple, la méthode de Runge-Kutta converge trop rapidement.

\begin{figure}
\centering
\includegraphics[angle=-90,width=10]{test_conv}
\label{convergence}
\caption{Courbe de convergence des différentes méthodes : Euler
  (bleu), point milieu (violet) et Heun (rouge)}
\end{figure}

Nous avons aussi utilisé la fonction \textit{timer} de scilab pour
avoir la durée d'exécution des méthodes. Sur un même exemple, les
temps d'exécution sont de 21.66s, 1.01s, 1.1s et 0.88s pour les
méthodes d'Euler, du point milieu, de Heun et de Runge-Kutta.

\subsection{Champ des tangentes de l'équation différentielle}
Nous avons tracé le champ des tangentes pour l'exmple en dimension 2,
nous obtenons des solutions qui sont des cercles comme le montre la
figure~\ref{champ_tangentes}.

\begin{figure}
\centering
\includegraphics[angle=-90,width=10]{champ_cos}
\label{champ_tangentes}
\caption{Représentation du champ des tangentes}
\end{figure}