Commit 3ca3bd001ef665eb83373ebbdf709ce62c49d6dd

Authored by Rémi Emonet
1 parent 61fb7cabf6
Exists in master

tp7

Showing 3 changed files with 174 additions and 0 deletions

... ... @@ -84,6 +84,9 @@
84 84 <a class="item sep" href="tp6.pdf">TP 6 <br/> plot, neige</a>
85 85 <a class="item" href="raw/generation_donnees.py">TP 6<br/>fichier</a>
86 86  
  87 + <a class="item sep" href="tp7.pdf">TP 7 <br/> plot, encore</a>
  88 + <a class="item" href="raw/generateur_donnees.py">TP 7<br/>fichier</a>
  89 +
87 90 <!--
88 91  
89 92 <a class="item" href="raw/correction-tp2.zip">Correction<br/>TP 2</a>
raw/generateur_donnees.py View file @ 3ca3bd0
  1 +import numpy as np
  2 +
  3 +# Heure du lever de soleil
  4 +DEBUT_JOUR = 7
  5 +# Heure du coucher de soleil
  6 +FIN_JOUR = 17
  7 +
  8 +def generer_donnees(nb_jours):
  9 + """
  10 + Génère des données aléatoirement
  11 + """
  12 +
  13 + donnees = np.empty((7, nb_jours, 24))
  14 +
  15 + donnees[0], donnees[1] = generer_temperatures(nb_jours)
  16 + donnees[2] = generer_ensoleillement(nb_jours)
  17 + donnees[3], donnees[4], donnees[5] = generer_neige(nb_jours)
  18 + donnees[6] = generer_vent(nb_jours)
  19 +
  20 +
  21 + return donnees
  22 +
  23 +def generer_temperatures(nb_jours):
  24 + """
  25 + Génère aléatoirement des données de températures en °C
  26 + """
  27 +
  28 + temp_ombre = np.empty(nb_jours*24)
  29 + temp_soleil = np.empty(nb_jours*24)
  30 +
  31 + for jour in range(nb_jours):
  32 + debut_jour = jour*24+DEBUT_JOUR
  33 + fin_jour = jour*24+FIN_JOUR
  34 +
  35 + temp_ombre[jour*24:debut_jour] = generer_valeur(nb_mesures=DEBUT_JOUR, val_min=-10, val_max=5, ecart_max=2)
  36 + temp_ombre[debut_jour:fin_jour+1] = generer_valeur(nb_mesures=FIN_JOUR-DEBUT_JOUR+1, val_min=-5, val_max=15, ecart_max=5)
  37 + temp_ombre[fin_jour+1:(jour+1)*24] = generer_valeur(nb_mesures=24-FIN_JOUR-1, val_min=-10, val_max=5, ecart_max=2)
  38 +
  39 + temp_soleil[jour*24:debut_jour] = temp_ombre[jour*24:debut_jour]
  40 + temp_soleil[debut_jour:fin_jour+1] = generer_valeur(nb_mesures=FIN_JOUR-DEBUT_JOUR+1, val_min=temp_ombre[debut_jour:fin_jour+1], val_max=25, ecart_max=5)
  41 + temp_soleil[fin_jour+1:(jour+1)*24] = temp_ombre[fin_jour+1:(jour+1)*24]
  42 +
  43 + return (temp_ombre, temp_soleil)
  44 +
  45 +def generer_ensoleillement(nb_jours):
  46 + """
  47 + Génère aléatoirement des données d'ensoleillement en MJ/m²
  48 + """
  49 +
  50 + ensol = np.empty(nb_jours*24)
  51 +
  52 + for jour in range(nb_jours):
  53 + debut_jour = jour*24+DEBUT_JOUR
  54 + fin_jour = jour*24+FIN_JOUR
  55 +
  56 + ensol[jour*24:debut_jour] = generer_valeur(nb_mesures=DEBUT_JOUR, val_min=0, val_max=5, ecart_max=2)
  57 + ensol[debut_jour:fin_jour+1] = generer_valeur(nb_mesures=FIN_JOUR-DEBUT_JOUR+1, val_min=4320, val_max=5400, ecart_max=500)
  58 + ensol[fin_jour+1:(jour+1)*24] = generer_valeur(nb_mesures=24-FIN_JOUR-1, val_min=0, val_max=5, ecart_max=2)
  59 +
  60 + return (ensol)
  61 +
  62 +def savitzky_golay(tableau, taille_fenetre):
  63 + """
  64 + Fonction servant à lisser une courbe
  65 + """
  66 +
  67 + ordre=1
  68 + deriv=0
  69 +
  70 + range_ordre = range(ordre + 1)
  71 + moitie_fenetre = (taille_fenetre-1)//2
  72 +
  73 + b = np.mat([[k ** i for i in range_ordre] for k in range(-moitie_fenetre, moitie_fenetre + 1)])
  74 + m = np.linalg.pinv(b).A[deriv]
  75 +
  76 + premieres_vals = tableau[0] - np.abs(tableau[1:moitie_fenetre + 1][::-1] - tableau[0])
  77 + dernieres_vals = tableau[-1] + np.abs(tableau[-moitie_fenetre - 1:-1][::-1] - tableau[-1])
  78 +
  79 + tableau = np.concatenate((premieres_vals, tableau, dernieres_vals))
  80 +
  81 + return np.convolve(m, tableau, mode='valid')
  82 +
  83 +def generer_neige(nb_jours):
  84 + """
  85 + Génère aléatoirement des données d’épaisseur de neige en cm
  86 + """
  87 +
  88 + jauge_1 = generer_valeur(nb_mesures=nb_jours*24, val_min=100, val_max=200, ecart_max=10)
  89 + # On considère que l'épaisseur de la neige doit avoir des transitions plus lentes que les autres mesures
  90 + jauge_1 = savitzky_golay(jauge_1, 12)
  91 +
  92 + jauge_2 = generer_valeur(nb_mesures=nb_jours*24, val_min=100, val_max=200, ecart_max=10)
  93 + jauge_2 = savitzky_golay(jauge_2, 12)
  94 +
  95 + jauge_3 = generer_valeur(nb_mesures=nb_jours*24, val_min=100, val_max=200, ecart_max=10)
  96 + jauge_3 = savitzky_golay(jauge_3, 12)
  97 +
  98 + # Les décimales sont tronquées, le précision des jauges ne dépassant pas le cm
  99 + return (jauge_1.astype(int), jauge_2.astype(int), jauge_3.astype(int))
  100 +
  101 +def generer_vent(nb_jours):
  102 + """
  103 + Génère aléatoirement des données de vitesse de vent en m/s
  104 + """
  105 +
  106 + duree_totale = nb_jours*24
  107 + valeurs = np.empty(duree_totale)
  108 +
  109 + # Initialisez le début de "valeurs" avec une période d'une durée aléatoire entre 2 et 10h
  110 + # Attention, les indices d'un tableau doivent être des entiers
  111 + fin_periode = np.random.randint(2, 11)
  112 +
  113 + # Lors de cette période le vent a une vitesse aléatoire entre 0.1 et 15m/s
  114 + valeurs[:fin_periode] = np.random.uniform(0.1, 15)
  115 +
  116 + # Faites une boucle pour remplir "valeurs" sans dépasser sa longueur
  117 + while fin_periode < duree_totale:
  118 + # A chaque itération définissez une période d'une durée aléatoire entre 2 et 10h
  119 + duree_periode = np.random.randint(2, 11)
  120 +
  121 + # Attention, Si une période dépasse la longueur du tableau, vous devrez la tronquer afin de finir de remplir le tableau sans erreur
  122 + if fin_periode+duree_periode > duree_totale:
  123 + duree_periode = duree_totale-fin_periode
  124 +
  125 + # Durant cette période le vent a accéléré ou ralenti d'une valeur aléatoire d'au maximum 2m/s
  126 + nouvelle_val = valeurs[fin_periode-1]+np.random.uniform(-2, 2)
  127 +
  128 + # Attention, un vent ne peut pas avoir une vitesse négative
  129 + nouvelle_val = np.maximum(0, nouvelle_val)
  130 +
  131 + # Attention, la vitesse a été limitée à maximum 20 m/s
  132 + nouvelle_val = np.minimum(20, nouvelle_val)
  133 +
  134 + valeurs[fin_periode:fin_periode+duree_periode] = nouvelle_val
  135 +
  136 + fin_periode += duree_periode
  137 +
  138 + return valeurs
  139 +
  140 +def generer_valeur(nb_mesures, val_min, val_max, ecart_max):
  141 + """
  142 + Génère aléatoirement des données
  143 + nb_mesures: nombre de données générées
  144 + val_min: valeur minimale (valeur ou tableau de valeur)
  145 + val_max: valeur maximale (valeur ou tableau de valeur)
  146 + ecart_max: variation maximale entre 2 valeurs successives
  147 + """
  148 +
  149 + if isinstance(val_min, int):
  150 + val_min = np.full(nb_mesures, val_min)
  151 +
  152 + if isinstance(val_max, int):
  153 + val_max = np.full(nb_mesures, val_max)
  154 +
  155 + valeurs = np.empty(nb_mesures)
  156 +
  157 + valeurs[0] = np.random.random()*(val_max[0]-val_min[0])+val_min[0]
  158 +
  159 + for val_i in range(1, nb_mesures):
  160 + val_suivante = valeurs[val_i-1]+np.random.random()*(2*ecart_max)-ecart_max
  161 +
  162 + val_suivante = np.maximum(val_min[val_i], val_suivante)
  163 + val_suivante = np.minimum(val_max[val_i], val_suivante)
  164 +
  165 + valeurs[val_i] = val_suivante
  166 +
  167 + return valeurs
  168 +
  169 +if __name__ == "__main__":
  170 + print(generer_donnees(7))
  171 +

No preview for this file type