Commit 054051ce authored by Matthieu Boileau's avatar Matthieu Boileau

Update tp6/exercice2

plot moved to external function
parent 1fb66d71
Pipeline #4003 passed with stages
in 1 minute and 59 seconds
CC = g++
CC_FLAGS = -std=c++11 -Wall
EXEC_NAME = main
OBJ_FILES = main.o modele.o modele_sir.o modele_seir.o solveur_temps.o euler_ex.o rk2.o graphe.o
all: $(EXEC_NAME)
clean:
rm -f $(EXEC_NAME) $(OBJ_FILES)
$(EXEC_NAME) : $(OBJ_FILES)
$(CC) $(CC_FLAGS) -o $(EXEC_NAME) $(OBJ_FILES)
%.o: %.cpp %.hpp
$(CC) $(CC_FLAGS) -o $@ -c $<
main.o : main.cpp modele_graphe.hpp
......@@ -39,15 +39,23 @@ public:
template< class T > class noeud{
T val;
int number;
string name;
vector<voisin> voisins;
public:
noeud(){
val = T();
number = 0;
name = "";
};
noeud(string n){
val = T();
number = 0;
name = n;
};
noeud(const noeud & n){
val = n.val;
number = n.number;
name = n.name;
voisins = n.voisins;
};
~noeud (){
......@@ -59,7 +67,9 @@ public:
void ajout_num(int n){
number = n;
}
void ajout_nom(string n){
name = n;
}
vector<voisin> get_voisins() {
return voisins;
}
......@@ -68,6 +78,10 @@ public:
return val;
}
string get_nom() {
return name;
}
int num(){
return number;
}
......@@ -90,15 +104,16 @@ public:
noeud & operator = (const noeud & n){
if(this != &n){
voisins.clear();
val = n.val;
voisins = n.voisins;
number = n.number;
val = n.val;
voisins = n.voisins;
number = n.number;
name = n.name;
}
return *this;
}
bool operator == (const noeud & n){
bool res = false;
res = (val == n.val) && (n.number == number);
res = (val == n.val) && (n.number == number) && (n.name == name);
return res;
}
......@@ -156,7 +171,7 @@ template <class T> ostream & operator<<(ostream & out, noeud<T> & x){
vector<voisin>::iterator ii;
int nvoisins=0;
out<<" noeuf numero: "<<x.number<<" de valeur "<<x.val<<endl;
out<<" noeud "<<x.name<<" numero: "<<x.number<<" de valeur "<<x.val<<endl;
if(x.voisins.size() != 0){
out<<">>>>> liste des voisins:"<<endl;
for(ii = x.voisins.begin(); ii != x.voisins.end(); ii++){
......
......@@ -12,9 +12,10 @@ class ModeleGraphe : public Modele {
// Graphe sur lequel le modèle d'épidémie sera appliqué
graphe<T> *m_graphe;
public:
ModeleGraphe();
ModeleGraphe();
ModeleGraphe(graphe<T> *g);
~ModeleGraphe();
~ModeleGraphe();
graphe<T> *get_graphe();
// Calcule les conditions initiales du modèle en fonction des conditions initiales
// du modèle associé à chaque noeud du graphe.
void setInitialValue();
......@@ -43,6 +44,11 @@ template<class T>
ModeleGraphe<T>::~ModeleGraphe() {
}
template<class T>
graphe<T> * ModeleGraphe<T>::get_graphe() {
return m_graphe;
}
template<class T>
void ModeleGraphe<T>::setInitialValue() {
// création du vecteur contenant les conditions initiale :
......
......@@ -7,7 +7,7 @@
class ModeleSeir : public Modele {
private:
double m_beta;
double m_gamma;
double m_gamma;
double m_alpha;
double m_nu;
double m_mu;
......@@ -16,7 +16,7 @@ class ModeleSeir : public Modele {
ModeleSeir();
ModeleSeir(double beta, double gamma, double alpha, double nu, double mu, double g);
~ModeleSeir() {}
double g();
double g();
std::vector<double> flux(std::vector<double>);
};
......
#ifndef PLOT_HPP
#define PLOT_HPP
#include "solveur_temps.hpp"
#include "matplotlibcpp.h"
void plotSolutionNoeud(const int, const std::string&, SolveurTemps*);
#endif
......@@ -4,7 +4,6 @@
#include <vector>
#include "modele.hpp"
#include "matplotlibcpp.h"
class SolveurTemps {
protected:
......@@ -25,10 +24,13 @@ class SolveurTemps {
// Calcule la valeur initiale du vecteur solution
void setInitialValue();
// Renvoie le temps correspondant au dernier vecteur de m_variablesTemps
double getCurrentTime();
double getCurrentTime();
// Renvoie le pas de temps
double get_dt();
// Renvoie la dernière solution calculée
std::vector<double> getSolutionCurrentTime();
void plotSolution(const int inoeud, const std::string&);
std::vector<double> getSolutionCurrentTime();
// Renvoie les solutions pour chaque pas de temps
std::vector< std::vector<double> > getVariablesTime();
};
#endif
This diff is collapsed.
......@@ -6,6 +6,7 @@
#include "rk2.hpp"
#include "modele_sir.hpp"
#include "modele_graphe.hpp"
#include "plot.hpp"
using namespace std;
......@@ -13,35 +14,25 @@ int main() {
// Création du graphe de villes
graphe<ModeleSir> france;
// On crée une liste des noms de villes
vector<string> villes;
noeud<ModeleSir> Paris;
villes.push_back("Paris");
noeud<ModeleSir> Paris("Paris");
france.ajout_noeud(&Paris); // 0
noeud<ModeleSir> Lille;
villes.push_back("Lille");
noeud<ModeleSir> Lille("Lille");
france.ajout_noeud(&Lille); //1
noeud<ModeleSir> Bordeaux;
villes.push_back("Bordeaux");
noeud<ModeleSir> Bordeaux("Bordeaux");
france.ajout_noeud(&Bordeaux); //2
noeud<ModeleSir> Strasbourg;
villes.push_back("Strasbourg");
noeud<ModeleSir> Strasbourg("Strasbourg");
france.ajout_noeud(&Strasbourg); //3
noeud<ModeleSir> Nantes;
villes.push_back("Nantes");
noeud<ModeleSir> Nantes("Nantes");
france.ajout_noeud(&Nantes); //4
noeud<ModeleSir> Lyon;
villes.push_back("Lyon");
noeud<ModeleSir> Lyon("Lyon");
france.ajout_noeud(&Lyon); //5
noeud<ModeleSir> Marseille;
villes.push_back("Marseille");
noeud<ModeleSir> Marseille("Marseille");
france.ajout_noeud(&Marseille); //6
// Ordre des paramètres dans le constructeur du modèle :
......@@ -159,16 +150,18 @@ int main() {
cout << "Final time : " << solveur_temps.getCurrentTime() << endl;
int nb_noeuds = modele_graphe.get_graphe()->get_nbnodes();
// On boucle sur les villes pour afficher la solution finale et tracer l'évolution temporelle
for (int k=0; k<villes.size(); k++) {
cout << "Values for " << villes[k] << " : " << endl;
for (int i=k*3; i<(k+1)*3; i++) {
for (int n=0; n<nb_noeuds; n++) {
string noeud = modele_graphe.get_graphe()->get_noeud(n)->get_nom();
cout << "Values for " << noeud << " : " << endl;
for (int i=n*3; i<(n+1)*3; i++) {
cout << solveur_temps.getSolutionCurrentTime()[i] << endl;
}
solveur_temps.plotSolution(k, villes[k]);
plotSolutionNoeud(n, noeud, &solveur_temps);
}
solveur_temps.plotSolution(-villes.size(), "Total");
// On trace l'évolution temporelle de la somme sur toutes les villes
plotSolutionNoeud(-nb_noeuds, "Total", &solveur_temps);
return 0;
}
......@@ -3,7 +3,7 @@
int Modele::get_n() {
return m_n;
}
std::vector<double> Modele::initial_value() {
return m_initial_value;
}
......
#include "plot.hpp"
namespace plt = matplotlibcpp;
using namespace std;
void plotSolutionNoeud(const int inoeud, const string& nom, SolveurTemps* solveur_temps) {
std::vector< std::vector<double> > m_variablesTemps = solveur_temps->getVariablesTime();
int nstep = m_variablesTemps.size();
vector<double> t(nstep);
vector<double> s(nstep);
vector<double> i(nstep);
vector<double> r(nstep);
if (inoeud >= 0) {
// On cible la ville inoeud
for(int k = 0; k < nstep; k++) {
t[k] = solveur_temps->get_dt() * k;
s[k] = m_variablesTemps[k][inoeud*3];
i[k] = m_variablesTemps[k][inoeud*3 + 1];
r[k] = m_variablesTemps[k][inoeud*3 + 2];
}
} else {
// On fait la somme sur toutes les villes
for(int k = 0; k < nstep; k++) {
t[k] = solveur_temps->get_dt() * k;
s[k] = 0.;
i[k] = 0.;
r[k] = 0.;
for(int j = 0; j < -inoeud; j++) {
s[k] += m_variablesTemps[k][j*3];
i[k] += m_variablesTemps[k][j*3 + 1];
r[k] += m_variablesTemps[k][j*3 + 2];
}
}
}
map<string, string> keywords; // utilisé seulement pour les labels
keywords["label"] = "S";
plt::plot(t, s, keywords);
keywords["label"] = "I";
plt::plot(t, i, keywords);
keywords["label"] = "R";
plt::plot(t, r, keywords);
plt::legend(); // On affiche la légende
plt::title(nom);
plt::xlabel("t");
//plt::show();
const string& filename = nom + ".png";
plt::save(filename);
cout << "Tracé sauvé dans " << filename << endl;
plt::close();
}
\ No newline at end of file
......@@ -2,8 +2,6 @@
using namespace std;
namespace plt = matplotlibcpp;
SolveurTemps::SolveurTemps() {
m_dt = 0.001;
m_modele = NULL;
......@@ -41,60 +39,14 @@ double SolveurTemps::getCurrentTime() {
return m_dt * (m_variablesTemps.size() - 1);
}
double SolveurTemps::get_dt() {
return m_dt;
}
vector<double> SolveurTemps::getSolutionCurrentTime() {
return m_variablesTemps.back();
}
void SolveurTemps::plotSolution(const int inoeud, const string& city) {
int nstep = m_variablesTemps.size();
vector<double> t(nstep);
vector<double> s(nstep);
vector<double> i(nstep);
vector<double> r(nstep);
if (inoeud >= 0) {
// On cible la ville inoeud
for(int k = 0; k < nstep; k++) {
t[k] = m_dt * k;
s[k] = m_variablesTemps[k][inoeud*3];
i[k] = m_variablesTemps[k][inoeud*3 + 1];
r[k] = m_variablesTemps[k][inoeud*3 + 2];
}
} else {
// On fait la somme sur toutes les villes
for(int k = 0; k < nstep; k++) {
t[k] = m_dt * k;
s[k] = 0.;
i[k] = 0.;
r[k] = 0.;
for(int j = 0; j < -inoeud; j++) {
s[k] += m_variablesTemps[k][j*3];
i[k] += m_variablesTemps[k][j*3 + 1];
r[k] += m_variablesTemps[k][j*3 + 2];
}
}
}
map<string, string> keywords;
keywords["label"] = "S";
plt::plot(t, s, keywords);
keywords["label"] = "I";
plt::plot(t, i, keywords);
keywords["label"] = "R";
plt::plot(t, r, keywords);
plt::legend(); // On affiche la légende
plt::title(city);
plt::xlabel("t");
//plt::show();
const string& filename = city + ".png";
plt::save(filename);
cout << "Tracé sauvé dans " << filename << endl;
plt::close();
vector< vector<double> > SolveurTemps::getVariablesTime() {
return m_variablesTemps;
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment