%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\documentclass[a4paper,french]{article}
\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}

\title{}
\author{}
\date{}

%%------------------------------------------------------------------------------
%% Packages

\usepackage{amsmath,amsfonts}
\usepackage{mathtools}
\usepackage[]{mathabx} % french mathematical symbols and more
\usepackage{amsthm}
\usepackage{geometry}
\usepackage[svgnames]{xcolor}
\usepackage{fancyhdr}
\usepackage{lastpage}
\usepackage{enumitem}
\usepackage{multicol}

\usepackage{hyperref}
\hypersetup{colorlinks=true,
  citecolor=DarkBlue,
  linkcolor=DarkBlue,
  linktoc=page,
  urlcolor=black,
}

\usepackage{babel}

%% ------------------------------------------------------------------------------
%% Packages setup

% multicol
\setlength{\columnseprule}{.5pt}

% enumitem
\setlist{itemsep=0pt, topsep=0pt} % vertical spacing for all lists
  
\newlist{pbenum}{enumerate}{10} % enumerate for problems (nested like so : 1., 1.1., 1.1.1., etc)
\setlist[pbenum]{label*=\arabic*.}
\setlist[pbenum, 1]{itemsep=4pt plus 2pt minus 1pt, topsep=8pt plus 2pt minus 4pt} % default enumerate spacing

\setlist[enumerate, 1]{label = \arabic*.} % standard enumerate labels 
\setlist[enumerate, 2]{label = \alph*.}

% geometry
\geometry{textwidth = 0.85\paperwidth,
  textheight = 0.8\paperheight}
%defaults : textwidth = 0.7\paperwidth = 1675.8pt, textheight = 0.7\paperheight = 4788pt

% hyperref
\hypersetup{colorlinks=true,
  citecolor=DarkBlue,
  linkcolor=DarkBlue,
  linktoc=page,
  urlcolor=black}

% fancyhdr
%% BUG: Do not issue \fancypagestyle{fancy}{<fancyhdr commands>}, the LaTeX compiler will hang at the first \pagestyle{fancy} call since it will enter in an infinite recursive loop.

%% \fancypagestyle{fancy}{%
%%   \fancyhf{} % clear all header and footer fields
%%   \lhead{École Normale Supérieure de Lyon\\Département de mathématiques}
%%   \rhead{2021--2022\\Option B pour l'agrégation}
%%   \rfoot{\thepage /\pageref{LastPage}}
%%   \renewcommand{\footrulewidth}{0.5pt}
%%   \setlength{\headheight}{24.2pt}} % required for headers spanning two lines

\fancypagestyle{plain}{%
  \fancyhf{}
  \rfoot{\thepage /\pageref{LastPage}}
  \renewcommand{\headrulewidth}{0pt}}

\pagestyle{fancy} % sets page style for the whole document
\pagestyle{fancy}							% En-tête et pieds de page
\fancyhead[L]{Prépa agreg\\2023--2024\vspace{1em}}
\fancyhead[C]{Remise à niveau en Python}
\fancyhead[R]{ENS de Lyon \vspace{1em} }
\fancyfoot[C]{}
\renewcommand{\footrulewidth}{0.5pt}
\setlength{\headheight}{24.2pt} % required for headers spanning two lines

%%------------------------------------------------------------------------------
%% Custom environments/macros

\theoremstyle{definition}
\newtheorem*{defi}{Définition}

\newcommand{\R}{\mathbb{R}}
\newcommand{\C}{\mathbb{C}}
\newcommand{\Z}{\mathbb{Z}}
\newcommand{\Q}{\mathbb{Q}}
\newcommand{\N}{\mathbb{N}}
\newcommand{\ds}{\displaystyle}

\newcommand{\mc}{\mathcal}
\renewcommand{\Im}{\operatorname{Im}}

\DeclarePairedDelimiter{\norm}{\lVert}{\rVert} %% requires mathtools
\DeclarePairedDelimiter{\abs}{\lvert}{\rvert}
\DeclarePairedDelimiter{\sbra}{[}{]}
\DeclarePairedDelimiter{\pare}{(}{)}
\DeclarePairedDelimiter{\osbral}{]}{]}
\DeclarePairedDelimiter{\osbra}{]}{[}
\DeclarePairedDelimiter{\osbrar}{[}{[}
\newcommand{\dbra}[1]{\ldbrack #1 \rdbrack}

\newcounter{exercice}

\newcommand{\ex}{\refstepcounter{exercice}\paragraph{Exercice \theexercice.}}
\newtheorem{exo}{Exercice}
\newcommand{\staritem}{\refstepcounter{enumi}\item[$(\star)~$\theenumi]}

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\begin{document}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

\begin{center}
  {\LARGE \bf TD 2 : matplotlib}
\end{center}
\bigskip

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%


\section*{Quelques exercices de prise en main}

\begin{enumerate}
\item Écrire un programme qui trace le graphe des fonctions \(x\mapsto 1/x\) et \(\cos\) sur \([-1,1]\), l'une en pointillés rouges, l'autre solide et en bleu. Ajouter un titre, une légende, des labels pour chaque axe, et restreindre l'axe des ordonnées à \([-5,5]\).
\item Écrire une fonction (de votre choix) qui prend en entrée un entier \(n\) et qui renvoit un vecteur de valeurs dépendant de \(n\), puis générer un array de taille \(4\times N\), chaque ligne étant remplie grâce à la fonction.

  Écrire un programme qui crée quatre graphes en utilisant \texttt{plt.subplot}, où chaque graphe correspond à une ligne de l'array, sans oublier d'ajouter un titre à chaque subplot.
\item Générer un array de valeurs de la fonction \(x\mapsto x^{-3/2}\), en ajoutant un bruit aléatoire (en utilisant \texttt{np.random.randn} par exemple). Tracer le graphe des valeurs obtenues en échelle logarithmique. Vaut-il mieux utiliser \texttt{plt.semilogx}, \texttt{plt.semilogy} ou \texttt{plt.loglog} ?

  Faire une régression linéaire avec \texttt{np.polyfit} sur les données obtenues, et tracer la droite correspondante sur le graphe.
\item Écrire un programme qui trace les lignes de niveau de la fonction \((x,y)\mapsto (x^2+y^2)\cos(x)\), puis le champ de vecteur de son gradient.
\end{enumerate}



\section*{Une équation de transport}

On se propose d'étudier l'équation de transport suivante sur le tore \(\R/2\pi\Z\)
\[
\left\{
\begin{aligned}
 & \frac{\partial u}{\partial t} + \frac{\partial u}{\partial x} = 0, && x\in[0,2\pi],\, t>0,\\
 & u(0,x) = \cos(x), && x\in[0,2\pi].
\end{aligned}
\right. \tag{E}
\]
On discrétise le problème, et on applique la méthode d'Euler pour sa résolution approchée.
\begin{itemize}
\item Soit \(N\) un entier non nul, et \(\Delta x=2\pi/N\). Pour \(i\in\dbra{0,N-1}\), on pose \(x_i=i\Delta x\).
\item On choisit aussi un pas de temps \(\Delta t\), et pour \(n\in\N\), définit \(t^n = n\Delta t\).
\item On approche les dérivées partielles par des différences finies,
  \[
  \frac{\partial u}{\partial x}(t,x) \simeq \frac{u(t,x+\Delta x)-u(t,x)}{\Delta x}, \quad
  \frac{\partial u}{\partial t}(t,x) \simeq \frac{u(t+\Delta t,x)-u(t,x)}{\Delta t}.
  \]
\item On note \(u_i^n\) la solution approchée au temps \(t^n\) et au point \(x_i\), et on suit un schéma d'Euler pour la résolution : pour tout \(n\in\N\),
  \[
  u_i^{n+1} = u_i^n - \frac{\Delta t}{\Delta x}(u_i^n - u_{i-1}^n),\quad \forall i\in\dbra{0,N-1}
  \]
  avec la convention \(u^n_{-1} = u^n_{N-1}\).
\end{itemize}

\bigskip

\begin{enumerate}
\item Quelle est la solution de (E) ?
\item Écrire une fonction qui prend en entrée un réel \(T\), et des entiers \(N\) et \(M=T/\Delta t\), et qui renvoit le vecteur de la solution approchée donnée par le schéma d'Euler, \((u^M_i)_{i\in\dbra{0,N-1}}\).
\item Tracer la solution avec \texttt{matplotlib.pyplot} pour plusieurs choix de paramètres \((T,N,M)\). Ajouter un titre au plot, ainsi qu'une légende.
\item Écrire une fonction qui prend en entrée les paramètres \(T\), \(N\) et \(M\), et qui renvoit l'erreur, c'est-à-dire la norme infinie entre la solution approchée donnée par le schéma d'Euler et la solution exacte, au temps \(T\).
\item Tracer l' erreur en fonction du pas de temps sur un graphe à échelle logarithmique  avec \texttt{plt.loglog}
\item Effectuer une régression linéaire avec \texttt{np.polyfit} pour mettre en évidence la dépendance entre l'erreur et le pas de temps, puis ajouter la droite obtenue au graphe log-log.
\item Modifier le solveur basé sur le schéma d'Euler pour qu'il renvoit, en plus, le temps d'exécution de la fonction, puis refaire les questions 5. et 6. avec le temps d'exécution à la place de l'erreur. Vaut-il mieux tracer le temps d'exécution sur un graphe à échelle logarithmique, ou bien un graphe standard ?
\item (*) Faire une animation avec \texttt{plt.pause} ou la librairie \texttt{matplotlib.pyplot.animation} de la solution donnée par le schéma d'Euler au cours du temps.
\end{enumerate}




%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\end{document}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%


