diff --git a/module3/exo3/exercice_python_fr.org b/module3/exo3/exercice_python_fr.org index 354538af4c4d782eac34b0e8a5c72345a5d7c79a..b9f81952652c13c86b43d616c7c3f41f81644161 100644 --- a/module3/exo3/exercice_python_fr.org +++ b/module3/exo3/exercice_python_fr.org @@ -13,8 +13,15 @@ #+HTML_HEAD: * Introduction -** Généralités +** Objectifs + 1. Proposer un modèle de la variation de CO2 dans l'atmosphère en + fonction du temps depuis 1958 à l'aide de différentes mesures. + 2. À l'aide du modèle prédire la concentration future de CO2 + en 2025. +** Généralités sur les données utilisées +Voici quelques points généraux sur les données utilisées dans cette +étude : - Lien de téléchargement des données est le suivant : [[https://scrippsco2.ucsd.edu/assets/data/atmospheric/stations/in_situ_co2/weekly/weekly_in_situ_co2_mlo.csv][link]] - Les données ont été téléchargées le 2020-11-16 (date au format ISO). - D'après le site de téléchargement la concentration de CO2 est @@ -22,18 +29,13 @@ - Finalement, d'après le site : "The weekly values have been adjusted to 12:00 hours at middle day of each weekly period." -** Objectifs - - 1. Proposer un modèle de la variation de CO2 dans l'atmosphère en - fonction du temps. - 2. À l'aide du modèle prédire la concentration future de CO2 - en 2025. -** Démarche +** Démarche générales de l'étude 1. Dans un premier temps effectuer une analyse fréquentielle des données afin de tenter de modéliser certains phénomènes. 2. Utiliser un outil d'optimisation pour déterminer certains - paramètres du modèle en utilisant les mesures. -** Outils utilisés + paramètres du modèle proposé en utilisant les mesures. + +** Outils utilisés 1. Python 3.8.6 (GCC 10.2.0) 2. numpy 1.19.2 3. scipy 1.5.3 @@ -46,7 +48,7 @@ téléchargement utilisé est le suivant : #+name: data-url https://scrippsco2.ucsd.edu/assets/data/atmospheric/stations/in_situ_co2/weekly/weekly_in_situ_co2_mlo.csv -On télécharge les données si celles-ci ne sont pas disponibles +On télécharge les données si celles-ci ne sont pas déjà disponibles localement. #+BEGIN_SRC python :results silent :var data_url=data-url :session @@ -82,10 +84,14 @@ table[:5] | 1958-05-03 | 316.95 | * Traitement et affichage des données. + +Dans cette partie on convertit les données dans des formats qui +permettront de traiter les données plus facilement. + ** Converstion des string en valeurs numériques. -Les données dans =table= sont des string. On va convertir la première -colonne en objets =datetime= de Python, et la deuxième colonne en -=float=. +Les données dans ~table~ sont des string. On va convertir la première +colonne en objets ~datetime~ de Python, et la deuxième colonne en +~float~. #+begin_src python :results silent :session :exports both import datetime @@ -149,10 +155,15 @@ les oscillations rapides observés précédément. Sur cette figure on met plus en évidence le phénomène périodique sur le niveau de concentration de CO2. D'après la figure, dans un premier -temps supposer que les oscillations ont une période de un an et une +temps on peut supposer que les oscillations ont une période de un an et une amplitude entre cinq et sept. * Analyse fréquentielle de la variation de la concentration de CO2. +Dans cette partie on souhaite faire une analyse fréquentielle des +données en effectuant une transformée de Fourier sur les mesures afin +de mieux caractériser les phénomènes observés. Pour cela on utilise le +module =numpy= et l'on affiche les résultats avec =matplotlib=. + #+begin_src python :results file :session :var matplot_lib_filename="dataFFT.png" :exports both import numpy as np @@ -190,6 +201,9 @@ amplitude entre cinq et sept. #+RESULTS: [[file:dataFFT.png]] +Sur ce graphique on peut voir l'ensemble du spectre des mesures. On +remarque quelques pics qui devraient correpondre au phénomène +périodique. On tentera de caractériser plus précisement ses pics. ** FFT zoom On effectue un zoom sur la partie positive du graphique pour tenter de @@ -221,11 +235,11 @@ données. En effet on a supposé précédemment que les oscillations avaient une période de un an, notre unité de temps étant une semaine, on peut déduire la fréquence des oscillation en supposant que une année a 52 semaine : \( f = \frac{1}{52} \approx 0.019 \) ce qui reste -cohérent avec notre analyse fréquentielle. +cohérent avec les résultats dans le graphique. ** Filtrage de la contribution lente -On élimine toutes les valeurs au dessus des seuis établis -précédemment. +On élimine toutes les valeurs supérieures aux seuis établis précédemment +dans le spectre pour éliminer la contribution lente dans le signal. #+begin_src python :results file :session :var matplot_lib_filename="smallOsillations.png" :exports both # Extraction of the small oscillations @@ -249,7 +263,8 @@ précédemment. ** Reconstruction du du phénomène périodique L'objectif est de déterminer l'amplitude des oscillations en prenant -en compte toutes les mesures. +en compte toutes les mesures et non pas juste sur une fenêtre +d'observation comme on l'a fait précédemment. #+begin_src python :results file :session :var matplot_lib_filename="smallOsillationsTime.png" :exports both smallFreqSignal = smallNorm*np.exp(1j*concentrationFFTAngle) @@ -270,6 +285,7 @@ en compte toutes les mesures. #+RESULTS: [[file:smallOsillationsTime.png]] +Effectuons un zoom sur le signal reconstruit : #+begin_src python :results file :session :var matplot_lib_filename="smallOsillationsTimeZoom.png" :exports both plt.figure(figsize=(10,5)) @@ -287,8 +303,9 @@ en compte toutes les mesures. On peut déduire que le phénomère périodique a une amplitude de cinq d'après le graphique. ** Filtrage du phénomène périodique - -On élimine toutes les valeurs au dessus du seuil établit précédemment. +On souhaite maintenant filtrer le phénomène périodique ce qui pourrait +nous aider a mieux comprendre la contribution lente. On élimine donc +toutes les valeurs inférieures au seuil établit précédemment. #+begin_src python :results file :session :var matplot_lib_filename="bigOsillations.png" :exports both # Extraction of the big oscillations @@ -312,6 +329,9 @@ On élimine toutes les valeurs au dessus du seuil établit précédemment. ** Reconstruction du signal : contribution lente +Finalement on recontruit le signal temporel puis l'on affiche afin de +mieux le caractériser. + #+begin_src python :results file :session :var matplot_lib_filename="bigOsillationsTime.png" :exports both bigFreqSignal = bigNorm*np.exp(1j*concentrationFFTAngle) bigSignal = np.fft.ifft(bigFreqSignal) @@ -330,6 +350,9 @@ On élimine toutes les valeurs au dessus du seuil établit précédemment. #+RESULTS: [[file:bigOsillationsTime.png]] + +Ce graphique nous permet pas de déduire grand chose quant à cette +contribution lente. Tentons de le comparer avec les mesures. ** Comparaison des signaux filtré et brut #+begin_src python :results file :session :var matplot_lib_filename="bigOsillationsComparisons.png" :exports both @@ -348,6 +371,12 @@ On élimine toutes les valeurs au dessus du seuil établit précédemment. #+RESULTS: [[file:bigOsillationsComparisons.png]] + +Malheurement, cette approche nous permet pas d'avoir plus +d'informations pertinentes quant à cette contribution lente. Donc par +la suite on décidera de modéliser cette contribution par un polynôme +d'ordre 2. + * Modélisation des phénomènes et extrapolations ** Oscillations périodiques L'analyse fréquentielle nous a permis caractériser le phénomène @@ -399,6 +428,7 @@ Puis l'on utilise le module =scipy= plus spécifiquement le module : [ 4.78171606e-09 -1.81982548e-05 1.44289419e-02]] Finalement on compare le modèle obtenu avec les données des mesures : + #+begin_src python :results file :session :var matplot_lib_filename="modelBigOsillations.png" :exports both co2Model = slowContributionModel(t,params[0], params[1], params[2]) @@ -420,6 +450,7 @@ Finalement on compare le modèle obtenu avec les données des mesures : On constate que l'on obtient des résultats satisfaisants pour la caractérisation de la contribution lente. + ** Extrapolation de la concentration de CO2 jusqu'à 2025 Dans un premier temps on crée une liste qui contient l'ensemble des