diff --git a/module3/exo3/bigOsillations.png b/module3/exo3/bigOsillations.png index 133f9e6c6999e403933d9c025a9f3a2631b5d606..03184e4d87448244317aad34a6d27ce1ee4f6de3 100644 Binary files a/module3/exo3/bigOsillations.png and b/module3/exo3/bigOsillations.png differ diff --git a/module3/exo3/bigOsillationsComparisons.png b/module3/exo3/bigOsillationsComparisons.png index b29d40f1cd361898124ab8f829b76b6eb62e9908..b11e69726acd535164dfb0892739ed506bdb0629 100644 Binary files a/module3/exo3/bigOsillationsComparisons.png and b/module3/exo3/bigOsillationsComparisons.png differ diff --git a/module3/exo3/bigOsillationsTime.png b/module3/exo3/bigOsillationsTime.png index 0b744ed7fce07cf175c9b753f4a22883031da4e0..00739e38354ddf75e7b29f247597720d32a776cd 100644 Binary files a/module3/exo3/bigOsillationsTime.png and b/module3/exo3/bigOsillationsTime.png differ diff --git a/module3/exo3/co2Prediction.png b/module3/exo3/co2Prediction.png index 196ca6d774942b8efa68374135ed7221375f99ef..0abfec201ac0b1c65d41077a913f4f670bc6a24d 100644 Binary files a/module3/exo3/co2Prediction.png and b/module3/exo3/co2Prediction.png differ diff --git a/module3/exo3/dataFFT.png b/module3/exo3/dataFFT.png index a62bc6c2befbfa9d1aeb3f59a27646749021dbfd..506fcc79ab8a947b0c961378dfef7942fff959cb 100644 Binary files a/module3/exo3/dataFFT.png and b/module3/exo3/dataFFT.png differ diff --git a/module3/exo3/exercice_python_fr.org b/module3/exo3/exercice_python_fr.org index b0d1df4bb19d4e1605213b728052c6896632a680..cf7c8ed9da26f57d92225b8be8530435358e4be3 100644 --- a/module3/exo3/exercice_python_fr.org +++ b/module3/exo3/exercice_python_fr.org @@ -89,10 +89,10 @@ table[:5] * 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. +Dans cette partie, on convertit les données dans des formats qui +permettront de les traiter plus facilement. -** Converstion des /string/ en valeurs numériques. +** Conversion 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~. @@ -106,7 +106,7 @@ colonne en objets ~datetime~ de Python, et la deuxième colonne en #+end_src ** Affichage des données. -Ensuite on convertit les dates dans un format qui peut être utilisé +Ensuite, on convertit les ~datetime~ dans un format qui peut être utilisé pour l'affichage des données, et on affiche les données brutes. #+begin_src python :results file :session :var matplot_lib_filename="rawData.png" :exports both @@ -118,7 +118,7 @@ pour l'affichage des données, et on affiche les données brutes. plt.figure(figsize=(10,5)) plt.plot_date(plotDates,concentration) plt.title("Concentration de CO2 en fonction du temps") - plt.xlabel("Temps [semaines]") + plt.xlabel("Temps [années]") plt.ylabel("Concentration de CO2 [ppm]") plt.tight_layout() @@ -130,13 +130,13 @@ pour l'affichage des données, et on affiche les données brutes. [[file:rawData.png]] On remarque sur la figure la superposition de deux phénomènes : -1. Un phénomène périodique de faible amplitude. -2. Une croissance lente avec une forme qui ressemble à un début de - parabole. +1. Un phénomène périodique de faible amplitude à haute fréquence. +2. Une croissance globale, "lente" de forme parabolique. + ** /Zoom/ sur l'affichage des données -Effectuons un /zoom/ sur une période de temps plus courte caractériser -les oscillations rapides observés précédemment. +Effectuons un /zoom/ sur une période de temps plus courte pour +caractériser les oscillations rapides observées précédemment. #+begin_src python :results file :session :var matplot_lib_filename="zoomRawData.png" :exports both # Window's size where we want to zoom. @@ -146,7 +146,7 @@ les oscillations rapides observés précédemment. plt.figure(figsize=(10,5)) plt.plot_date(plotDatesZoom,concentration[:windowSize]) plt.title("Concentration de CO2 en fonction du temps") - plt.xlabel("Temps [semaines]") + plt.xlabel("Temps [années]") plt.ylabel("Concentration de CO2 [ppm]") plt.tight_layout() @@ -157,16 +157,20 @@ les oscillations rapides observés précédemment. #+RESULTS: [[file:zoomRawData.png]] -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 on peut supposer que les oscillations ont une période de un an et une -amplitude entre cinq et sept. +Sur cette figure, on met en évidence le phénomène périodique sur le +niveau de concentration de CO2. On peut faire les premières hypothèses +suivantes : + +1. La période des oscillations est de l'ordre d'une année. +2. L'amplitude varie entre cinq et 7 ppm. + * Analyse fréquentielle de la variation de la concentration de CO2. -Dans cette partie on souhaite faire une analyse fréquentielle des +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=. +de mieux caractériser les phénomènes observés précédemment. 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 @@ -194,7 +198,7 @@ module =numpy= et l'on affiche les résultats avec =matplotlib=. plt.figure(figsize=(10,5)) plt.plot(freq,concentrationFFTNorm) plt.title("Spectre des données mesurés") - plt.xlabel("Fréquence par unité de temps") + plt.xlabel("Fréquence par semaine") plt.ylabel("Amplitude") plt.tight_layout() @@ -205,9 +209,11 @@ module =numpy= et l'on affiche les résultats avec =matplotlib=. #+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écisément ses pics. +Sur ce graphique, on peut voir l'ensemble du spectre des mesures. On +remarque quatres pics qui devraient correpondre au phénomène +périodique. On tentera dans la prochaine partie de caractériser plus +précisément ces pics. + ** /Zoom/ sur le spectre du signal On effectue un zoom sur la partie positive du graphique pour tenter de @@ -220,7 +226,7 @@ caractériser les différentes fréquences d'oscillations du signal. plt.figure(figsize=(10,5)) plt.plot(freq[startIndx:fftzoomIndx],concentrationFFTNorm[startIndx:fftzoomIndx]) plt.title("Zoom sur le spectre des données mesurés") - plt.xlabel("Fréquence par unité de temps") + plt.xlabel("Fréquence par semaine") plt.ylabel("Amplitude") plt.tight_layout() @@ -232,18 +238,20 @@ caractériser les différentes fréquences d'oscillations du signal. [[file:fftZoom.png]] On remarque sur le spectre du signal que le phénomène périodique -possède deux pics d'amplitudes d'environ 1400 et 4000. On suppose que +possède deux pics d'amplitude d'environ 1400 et 4000. On suppose que le premier pic avec une plus grande amplitude correspond au phénomène -périodique que l'on a mis en évidence dans le graphique temporel des -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 +périodique que l'on a mis en évidence dans l'observation des données +brutes. En effet, on a supposé précédemment que les oscillations +avaient une période d'une année, notre unité de temps étant une semaine, +on peut déduire la fréquence des oscillations en considérant qu'une +année a 52 semaine : \( f = \frac{1}{52} \approx 0.019 \) [/semaines] ce qui reste cohérent avec les résultats dans le graphique. + ** Filtrage de la contribution lente -On élimine toutes les valeurs supérieures aux seuils établis précédemment -dans le spectre pour éliminer la contribution lente dans le signal. +On élimine toutes les valeurs supérieures au seuil établi +précédemment (4000) 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 @@ -254,7 +262,7 @@ dans le spectre pour éliminer la contribution lente dans le signal. plt.figure(figsize=(10,5)) plt.plot(freq,smallNorm) plt.title("Spectre des données sans la contribution lente") - plt.xlabel("Fréquence par unité de temps") + plt.xlabel("Fréquence par semaine") plt.ylabel("Amplitude") plt.tight_layout() @@ -277,7 +285,7 @@ d'observation comme on l'a fait précédemment. plt.figure(figsize=(10,5)) plt.plot(t,smallSignal) - plt.title("Reconstruction du phénomène périodique sur la concentration de CO2 en fonction du temps") + plt.title("Reconstruction du phénomène périodique de la concentration de CO2 en fonction du temps") plt.xlabel("Temps [semaines]") plt.ylabel("Concentration de CO2 [ppm]") plt.tight_layout() @@ -306,7 +314,9 @@ Effectuons un zoom sur le signal reconstruit : [[file:smallOsillationsTimeZoom.png]] On peut déduire que le phénomène périodique a une amplitude de cinq d'après le graphique. + ** Filtrage du phénomène périodique + 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. @@ -320,7 +330,7 @@ toutes les valeurs inférieures au seuil établit précédemment. plt.figure(figsize=(10,5)) plt.plot(freq,bigNorm) plt.title("Spectre des données sans le phénomène périodique") - plt.xlabel("Fréquence par unité de temps") + plt.xlabel("Fréquence par semaine") plt.ylabel("Amplitude") plt.tight_layout() @@ -333,7 +343,7 @@ toutes les valeurs inférieures au seuil établit précédemment. ** Reconstruction de la contribution lente du signal -Finalement on reconstruit le signal temporel puis l'on affiche afin de +Finalement on reconstruit le signal temporel puis on l'affiche afin de mieux le caractériser. #+begin_src python :results file :session :var matplot_lib_filename="bigOsillationsTime.png" :exports both @@ -344,7 +354,7 @@ mieux le caractériser. plt.figure(figsize=(10,5)) plt.plot(t,bigSignal) plt.title("Reconstruction du signal sans phénomène périodique sur la concentration de CO2 en fonction du temps") - plt.xlabel("Temps [semaines]") + plt.xlabel("Temps [années]") plt.ylabel("Concentration de CO2 [ppm]") plt.tight_layout() @@ -355,9 +365,9 @@ mieux le caractériser. #+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 +Ce graphique ne nous permet pas de déduire grand chose quant à cette +contribution lente. Tentons de le comparer avec les mesures. +** Comparaison des signaux filtrés et brut #+begin_src python :results file :session :var matplot_lib_filename="bigOsillationsComparisons.png" :exports both plt.figure(figsize=(10,5)) @@ -376,28 +386,28 @@ contribution lente. Tentons de le comparer avec les mesures. #+RESULTS: [[file:bigOsillationsComparisons.png]] -Malheuresement, cette approche nous permet pas d'avoir plus +Malheuresement, cette approche ne 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 +la suite, on modélisera 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 périodique par un signal de fréquence \( f = 0.02 \) par unité de -temps (par semaine), et avec une amplitude de 5. Ainsi, soit \(s_p(t)\) le -signal périodique avec \(t\) en semaine on a : +temps (par semaine), et avec une amplitude de 5 [ppm]. Ainsi, soit \(s_p(t)\) le +signal périodique avec \(t\) en semaine, on a : \begin{equation} s_p(t) = 5 \cos (0.02 t) \end{equation} ** Contribution lente du signal -L'analyse fréquentielle nous a pas permis d'avoir plus d'information -quant à la contribution lente du signal. Cependant si l'on regarde -l'allure générale des données peut supposer dans un premier temps que -le concentration de CO2 varie de façon quadratique par rapport au -temps. Donc on va modéliser cette contribution lente par un polynôme +L'analyse fréquentielle ne nous a pas permis d'avoir plus +d'information quant à la contribution lente du signal. Cependant, si +l'on regarde l'allure générale des données, on peut supposer que le +concentration de CO2 varie de façon quadratique par rapport au +temps. Donc, on va modéliser cette contribution lente par un polynôme d'ordre deux \( y(t) = at^2 +bt +c \). On utilisera un outil de /curve fitting/ pour caractériser ce polynôme. @@ -407,7 +417,7 @@ calculent la norme deux de l'erreur entre le modèle et les données, donc il est inutile de filtrer les données brute pour tenter d'enlever le phénomène périodique pour caractériser la contribution lente. -Dans un premier temps on définit une fonction de notre modèle pour la +Dans un premier temps, on définit une fonction de notre modèle pour la contribution lente #+begin_src python :results silent :session :exports both @@ -415,8 +425,8 @@ contribution lente return a*t*t + b*t + c #+end_src -Puis l'on utilise le module =scipy= plus spécifiquement le module -=scipy.optimize= pour déterminer les paramètres de notre modèle. +Puis l'on utilise le module ~scipy~ plus spécifiquement le module +~scipy.optimize~ pour déterminer les paramètres de notre modèle. #+begin_src python :results output :session :exports both from scipy import optimize @@ -441,7 +451,7 @@ Finalement on compare le modèle obtenu avec les données des mesures : plt.plot(t,co2Model,label="Model") plt.legend() plt.title("Modélisation de la variation lente de la concentration de CO2 en fonction du temps") - plt.xlabel("Temps [semaines]") + plt.xlabel("Temps [années]") plt.ylabel("Concentration de CO2 [ppm]") plt.tight_layout() @@ -457,7 +467,7 @@ 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 +Dans un premier temps, on crée une liste qui contient l'ensemble des données et l'on rajoute des dates jusqu'à la première semaine de 2025. #+begin_src python :results value :session :exports both @@ -473,7 +483,7 @@ données et l'on rajoute des dates jusqu'à la première semaine de 2025. #+RESULTS: : 2025-01-04 00:00:00 -Finalement on extrapole à l'aide du modèle puis on affiche les +Finalement, on extrapole à l'aide du modèle puis on affiche les résultats. #+begin_src python :results file :session :var matplot_lib_filename="co2Prediction.png" :exports both @@ -486,7 +496,7 @@ résultats. plt.plot_date(plotDates,concentration,label="Measurements") plt.legend() plt.title("Extrapolation de la variation lente de la concentration de CO2 en fonction du temps") - plt.xlabel("Temps [semaines]") + plt.xlabel("Temps [années]") plt.ylabel("Concentration de CO2 [ppm]") plt.tight_layout() @@ -497,7 +507,8 @@ résultats. #+RESULTS: [[file:co2Prediction.png]] -Calcul de l'augmentation de concentration en pourcentage : +On finit par calculer l'augmentation de concentration en pourcentage +par rapport à notre dernière mesure : #+begin_src python :results output :session :exports both augmentation = (co2Prediction[-1] - concentration[-1])/ concentration[-1] *100 @@ -506,3 +517,18 @@ Calcul de l'augmentation de concentration en pourcentage : #+RESULTS: : Augmentation de la concentration en % : 2.4518838408355386 + + +* Conclusion + +Cette étude propose un modèle de la variation de concentration de CO2, +puis utilise ce modèle afin de prédire l'augmentation de la +concentration de C02 en 2025 par rapport à la dernière mesure. + +On considère que l'on peut caractériser la variation de la +concentration de C02 en deux phénomènes dont on propose un modèle +mathématique : + +1. Une variation périodique dont la période correspond à une année et + d'amplitude 5 ppm. +2. Une variation "globale" modélisée par un polynôme d'ordre 2. diff --git a/module3/exo3/fftZoom.png b/module3/exo3/fftZoom.png index b32e850d8e7128677a53b4cc6d0ec96cbb583d25..63048e8df71b06b121a84e5a04c502f8430b5e1b 100644 Binary files a/module3/exo3/fftZoom.png and b/module3/exo3/fftZoom.png differ diff --git a/module3/exo3/modelBigOsillations.png b/module3/exo3/modelBigOsillations.png index df8f3578e210e521cb18deaa44b6c8793e06e82a..af0553eadb5a4a2d53b153614ceb3c3e22866c74 100644 Binary files a/module3/exo3/modelBigOsillations.png and b/module3/exo3/modelBigOsillations.png differ diff --git a/module3/exo3/rawData.png b/module3/exo3/rawData.png index 3c0c927a9306d81491e81341182d435613e7b0b9..06004d4da048c842e280b43c16d4f7e1352dc027 100644 Binary files a/module3/exo3/rawData.png and b/module3/exo3/rawData.png differ diff --git a/module3/exo3/smallOsillations.png b/module3/exo3/smallOsillations.png index 7f7b820b30e3232395096ceb0ad3e9531c208b5f..b49e372f6514eb49f8cd010f071a8d37be45f180 100644 Binary files a/module3/exo3/smallOsillations.png and b/module3/exo3/smallOsillations.png differ diff --git a/module3/exo3/smallOsillationsTime.png b/module3/exo3/smallOsillationsTime.png index 6842911710fee0f7beced2fada273ea3757b1453..a0cb26204b994ddbf265af910574a248819f6e2e 100644 Binary files a/module3/exo3/smallOsillationsTime.png and b/module3/exo3/smallOsillationsTime.png differ diff --git a/module3/exo3/smallOsillationsTimeZoom.png b/module3/exo3/smallOsillationsTimeZoom.png index 925ff995ba0b1c6d5ffeae39c9a61f7bfea68a81..f52b28da2499dbb0e6d5aa2d65cd85cdb7fb1f9c 100644 Binary files a/module3/exo3/smallOsillationsTimeZoom.png and b/module3/exo3/smallOsillationsTimeZoom.png differ diff --git a/module3/exo3/zoomRawData.png b/module3/exo3/zoomRawData.png index ba1dd9ca29dd9a4b8681fe4e48d3451193f447ee..1f9a3bdb72dc5352fb602177cd821416b9e04062 100644 Binary files a/module3/exo3/zoomRawData.png and b/module3/exo3/zoomRawData.png differ