Bonjour à tous...
Je fais un petit topic sur une façon de réaliser la "moyenne" des direction du vent pour ceux qui relève leur données dans un tableur et qui souhaiteraient réaliser cette opération.
Bien entendu, je précise bien que cela ne reste qu'une valeur mathématiques, et que dans le cadre d'un relevé manuel, elle reste représentative du nombre de relevé effectué (une station automatique donnera des valeurs beaucoup plus représentative (relevés quasi continus) que 4 ou 5 relevés effectués dans la journée) et je n'affirme en rien qu'elle soit rigoureusement juste... J'affirme seulement qu'un peu de courage vous sera nécessaire pour aller au bout de mon post...
Donc, si vous êtes comme moi, et que vous aimez vous amuser avec votre tableur, vous avez peut-être eu envie de faire des moyennes sur les vents, comme on fait avec les T°, l'humidité, ou autre valeur météorologique.
Pour ce qui est de la vitesse du vent, c'est pas bien sorcier, mais dès qu'il s'agit des directions, là c'est une autre histoire.
Le principal problème avec les angles, c'est que si on essaie de faire une bête moyenne avec ceux-ci, on se retrouve vite avec des résultat "illogiques" (exemple grosso modo, la moyenne de vents de secteur compris entre SO et SE peut renvoyer en zone NO...). Cela tient du fait qu'un angle de 135° (par exemple) equivaut aussi un angle de 315° sur une bousolle (Si on prend un vent de secteur 315° (NO) et un de secteur 45°(NE), la "moyenne" de ces vent devrait être logiquement 0°(N), mais une formule mathèmatique renverra toujours 180° (S)).
Confronté à ce problème, j'ai longuement cherché une solution qui évite ces erreurs. Mettre une moitié du cercle en degrés +, et l'autre moitié en - résolvait quelques incohérences, mais pas toutes... :shock:
La solution est venue des nombre complexe (ou imaginaires, de la forme a+bi avec i *** que i²=-1) (le fameux i pour ceux qui connaissent) et d'une formule trouvé sur un forum (merci à V. Lascaux qui l'a proposée en 2005). Il existerait d'autre formules, utilisant cos et sin, mais je ne l'ai pas trouvées pratiques à utiliser dans le tableur.
L'avantage des nombres complexes, c'est que du coup, 2 directions diamétralement opposées auront chacune un et un seul nombre complexe la représentant (exemple simpliste, SE = 1-1i, NO= -1+1i ou bien SO= -1-1i et NE= 1+1i).
Ainsi, chaque résultats de "moyenne" de direction du vent sera unique (et logique). Je n'ai pas encore trouvé de resultats erronés...
Bon, passons au choses sérieuse qui nous(vous) intéresses:
La fameuse formule: z(k)=v(k)*exp(i*Tetha(k))
avec, mathématiquement parlant, z(k) = le vecteur vent, v(k) = une intensité (vitesse, durée, etc...)et Tetha(k) = l'angle du vent, sa direction autrement dit.
Ici, on notera que v(k) nous permet, on en reparlera par la suite, de pouvoir tenir compte de la vitesse (je priviligie cette option car on a assez souvent un girouette associée avec un anémomètre), ce qui peut s'avèrer une composante non négligeable pour calculer une moyenne des directions... Mais pour l'instant je considérerais cette valeur à 1.
Donc, on se retrouve simplement avec z(k)=exp(i*Tetha(k)).
Maintenant, on va pouvoir exploiter nos données, mais il va falloir les "transformer" pour effectuer les calculs. Il faut déja savoir que les opérations sur les angles dans OpenOffice (OOo) se réalise en Radians. Il faudra donc convertir les degrés dans cette unité.
Pour mon exemple, je travaillerais sur une base de 360°, c'est à dire le nord à 0°, l'est à 90°, le sud à 180°...etc, et les entrées (3 dans mon cas) et les sorties (résultats) seront basées sur 16 divisions de la rose des vents (N, NNE, NE, ENE... etc).
On veut donc que le résultat de l'opération nous affiche la donnée la plus proche par les 16 valeurs définies ci-dessus. Pour ce faire, on va devoir utiliser les fonctions d'arrondi, de modulo en plus des fonctions d'opérations sur les nombres complexes. On utilisera aussi une fonction de recherche pour afficher le résultat sous forme alpha (N, NE, plutot que 0°, 90°, c'est plus parlant.).
Je détaille toutes les opérations avant de donner la formule qui tient dans une cellule... c'est mieux de comprendre chaque étape, non?
On ne tient pas compte de la vitesse du vent:
1- on transforme les ° en radians (@représentera la valeurs en ° , ou la cellule du tableur ou celle ci se trouve)
RADIANS(@) (bon, là c'était facile...)
2-on transforme cet angle en nombre complexe
COMPLEXE(0;[1]) avec 0 qui représente la partie réelle du nombre complexe, [1] l'angle @ en radians est la partie imaginaire qui multiplie i ( je reprendrai une valeurs précédemment calculé par le numéro de ligne entre crochet. Ici,
il faut comprendre COMPLEXE(0;RADIANS(@)) ), soit 0+"@"i
3- on calcule l'exponentielle de ce nombre(j'ai cru comprendre que c'est la partie cos/sin des opérations... :? )
COMPLEXE.EXP([2])
Vu qu'on part sur la "moyenne" de 3 mesures, on effectue,bien entendu ces opérations pour chaques mesures;
Soit pour @1, @2, et @3, on obtient
COMPLEXE.EXP ([2pour@1]), COMPLEXE.EXP([2pour@2]) et COMPLEXE.EXP([2pour@3].
4- On fait la somme de ces valeurs.
Cette partie réalise en fait "l'addition" des direction des vents. Si on le faisait graphiquement sur la rose des vent, ça reviendrai à prendre la 1ère direction, au bout de celle ci, tracer la 2nde, puis au bout de la 2nde on trace la 3ième. Si joint alors l'extrémite de la 3ième avec le centre de la rose des vents, on obtient alors la direction "moyenne" du vent...
COMPLEXE.SOMME(COMPLEXE.EXP ([2pour@1]);COMPLEXE.EXP([2pour@2]);COMPLEXE.EXP([2pour@3])
On à donc ici notre résultat, mais malheureusement, il n'est pas exploitable en la matiére, il faut revenir au degrés pour pouvoir en tirer quelque chose de parlant.
5- on récupère l'angle que représente ce nombre imaginaire, c'est l'argument.
COMPLEXE.ARGUMENT([4])
6- Le résultat précédent est en radians, on convertis en degrés.
DEGRES([5])
7- On "taille" le résultat...
L'angle obtenu peut être supérieur à 360°, grace au modulo, on retire autant de fois que nécessaire 360 au résultat afin que celui-ci soit compris entre 0° et 360°
MOD([6];360) avec [6] la valeur à moduler, 360, le modulo que l'on désire...
8-on "sectorise" le résultat...
Maintenant, nous allons définir la valeur qui est la plus proche de notre résultat, pour ensuite obtenir l'affichage d'un des 16 secteurs que nous avons prédéfinie plus haut.
ARRONDI.AU.MULTIPLE([7];22.5) avec [7] la valeur à arrondir, 22.5 le multiple à utiliser (360/16=22.5)
On inclut tout ça dans une fontion de recherche:
RECHERCHEV(ARRONDI.AU.MULTIPLE([7];22.5);plage de données;colonne à afficher;0)
plage de données: 2 colonnes, la 1ère de 0 à 360 par pas de 22.5, la seconde avec N, NNE, NE, ENE...etc
colonne à afficher: ici 2, retourne le code alpha correspondant à la valeurs de l'angle obtenu
0: option qui signifie que la plage de données n'est pas croissante, personellement, je met toujours cette valeur, je suis ainsi sur que la recherche s'effectue sur toute la plage de données.
N'oubliez pas de "caler" la plage de donnée avec $, ça évite qu'elle se décale lors des copier/coller de formules...
Pour les yeux, la formule dans son intégralité (issue de mon tableur, sans condition SI):
Maintenant, il peut être judicieux de tenir compte d'une autre composante du vent, comme sa vitesse car il semble logique qu'un vent à 0km/h ne "pèse" pas pareil qu'un vent à 20Km/h...
La démarche est la même que précédemment, sauf qu'on rajoute un produit par la vitesse.
Il va là aussi falloir transformer la valeur vitesse en nombre imaginaire (sinon le calcul renvoie une erreur).
On garde les étapes 1, 2 et 3 pour les angles
pour la vitesse (v@1, v@2, v@3)
COMPLEXE(v@1;0) ce qui donnerait ici v+0i
3b-Pour la fonction z=v*exp(i*@):
COMPLEXE.PRODUIT(COMPLEXE(v@1;0);COMPLEXE.EXP(COMP LEXE(0;[1]))
4b- La somme des nombres imaginaires:
COMPLEXE.SOMME([3bpour@1];[3bpour@2];[3bpour@3]
Ensuite, on reprend en 5. En fait, graphiquement, la vitesse va faire varier la "longueur" de la direction du vent, ce qui influeras sur la "direction" finale et donc sur l'angle...
Là aussi, pour les yeux, la formule tenant compte de la vitesse:
Voilà, tout d'abord merci d'avoir lu ce topic jusque là (et bravo car c'est un beau pavé...) et j'espère avoir modestement pu vous apporter quelque chose d'intèressant...
Cordialement.
Je fais un petit topic sur une façon de réaliser la "moyenne" des direction du vent pour ceux qui relève leur données dans un tableur et qui souhaiteraient réaliser cette opération.
Bien entendu, je précise bien que cela ne reste qu'une valeur mathématiques, et que dans le cadre d'un relevé manuel, elle reste représentative du nombre de relevé effectué (une station automatique donnera des valeurs beaucoup plus représentative (relevés quasi continus) que 4 ou 5 relevés effectués dans la journée) et je n'affirme en rien qu'elle soit rigoureusement juste... J'affirme seulement qu'un peu de courage vous sera nécessaire pour aller au bout de mon post...
Donc, si vous êtes comme moi, et que vous aimez vous amuser avec votre tableur, vous avez peut-être eu envie de faire des moyennes sur les vents, comme on fait avec les T°, l'humidité, ou autre valeur météorologique.
Pour ce qui est de la vitesse du vent, c'est pas bien sorcier, mais dès qu'il s'agit des directions, là c'est une autre histoire.
Le principal problème avec les angles, c'est que si on essaie de faire une bête moyenne avec ceux-ci, on se retrouve vite avec des résultat "illogiques" (exemple grosso modo, la moyenne de vents de secteur compris entre SO et SE peut renvoyer en zone NO...). Cela tient du fait qu'un angle de 135° (par exemple) equivaut aussi un angle de 315° sur une bousolle (Si on prend un vent de secteur 315° (NO) et un de secteur 45°(NE), la "moyenne" de ces vent devrait être logiquement 0°(N), mais une formule mathèmatique renverra toujours 180° (S)).
Confronté à ce problème, j'ai longuement cherché une solution qui évite ces erreurs. Mettre une moitié du cercle en degrés +, et l'autre moitié en - résolvait quelques incohérences, mais pas toutes... :shock:
La solution est venue des nombre complexe (ou imaginaires, de la forme a+bi avec i *** que i²=-1) (le fameux i pour ceux qui connaissent) et d'une formule trouvé sur un forum (merci à V. Lascaux qui l'a proposée en 2005). Il existerait d'autre formules, utilisant cos et sin, mais je ne l'ai pas trouvées pratiques à utiliser dans le tableur.
L'avantage des nombres complexes, c'est que du coup, 2 directions diamétralement opposées auront chacune un et un seul nombre complexe la représentant (exemple simpliste, SE = 1-1i, NO= -1+1i ou bien SO= -1-1i et NE= 1+1i).
Ainsi, chaque résultats de "moyenne" de direction du vent sera unique (et logique). Je n'ai pas encore trouvé de resultats erronés...
Bon, passons au choses sérieuse qui nous(vous) intéresses:
La fameuse formule: z(k)=v(k)*exp(i*Tetha(k))
avec, mathématiquement parlant, z(k) = le vecteur vent, v(k) = une intensité (vitesse, durée, etc...)et Tetha(k) = l'angle du vent, sa direction autrement dit.
Ici, on notera que v(k) nous permet, on en reparlera par la suite, de pouvoir tenir compte de la vitesse (je priviligie cette option car on a assez souvent un girouette associée avec un anémomètre), ce qui peut s'avèrer une composante non négligeable pour calculer une moyenne des directions... Mais pour l'instant je considérerais cette valeur à 1.
Donc, on se retrouve simplement avec z(k)=exp(i*Tetha(k)).
Maintenant, on va pouvoir exploiter nos données, mais il va falloir les "transformer" pour effectuer les calculs. Il faut déja savoir que les opérations sur les angles dans OpenOffice (OOo) se réalise en Radians. Il faudra donc convertir les degrés dans cette unité.
Pour mon exemple, je travaillerais sur une base de 360°, c'est à dire le nord à 0°, l'est à 90°, le sud à 180°...etc, et les entrées (3 dans mon cas) et les sorties (résultats) seront basées sur 16 divisions de la rose des vents (N, NNE, NE, ENE... etc).
On veut donc que le résultat de l'opération nous affiche la donnée la plus proche par les 16 valeurs définies ci-dessus. Pour ce faire, on va devoir utiliser les fonctions d'arrondi, de modulo en plus des fonctions d'opérations sur les nombres complexes. On utilisera aussi une fonction de recherche pour afficher le résultat sous forme alpha (N, NE, plutot que 0°, 90°, c'est plus parlant.).
Je détaille toutes les opérations avant de donner la formule qui tient dans une cellule... c'est mieux de comprendre chaque étape, non?
On ne tient pas compte de la vitesse du vent:
1- on transforme les ° en radians (@représentera la valeurs en ° , ou la cellule du tableur ou celle ci se trouve)
RADIANS(@) (bon, là c'était facile...)
2-on transforme cet angle en nombre complexe
COMPLEXE(0;[1]) avec 0 qui représente la partie réelle du nombre complexe, [1] l'angle @ en radians est la partie imaginaire qui multiplie i ( je reprendrai une valeurs précédemment calculé par le numéro de ligne entre crochet. Ici,
il faut comprendre COMPLEXE(0;RADIANS(@)) ), soit 0+"@"i
3- on calcule l'exponentielle de ce nombre(j'ai cru comprendre que c'est la partie cos/sin des opérations... :? )
COMPLEXE.EXP([2])
Vu qu'on part sur la "moyenne" de 3 mesures, on effectue,bien entendu ces opérations pour chaques mesures;
Soit pour @1, @2, et @3, on obtient
COMPLEXE.EXP ([2pour@1]), COMPLEXE.EXP([2pour@2]) et COMPLEXE.EXP([2pour@3].
4- On fait la somme de ces valeurs.
Cette partie réalise en fait "l'addition" des direction des vents. Si on le faisait graphiquement sur la rose des vent, ça reviendrai à prendre la 1ère direction, au bout de celle ci, tracer la 2nde, puis au bout de la 2nde on trace la 3ième. Si joint alors l'extrémite de la 3ième avec le centre de la rose des vents, on obtient alors la direction "moyenne" du vent...
COMPLEXE.SOMME(COMPLEXE.EXP ([2pour@1]);COMPLEXE.EXP([2pour@2]);COMPLEXE.EXP([2pour@3])
On à donc ici notre résultat, mais malheureusement, il n'est pas exploitable en la matiére, il faut revenir au degrés pour pouvoir en tirer quelque chose de parlant.
5- on récupère l'angle que représente ce nombre imaginaire, c'est l'argument.
COMPLEXE.ARGUMENT([4])
6- Le résultat précédent est en radians, on convertis en degrés.
DEGRES([5])
7- On "taille" le résultat...
L'angle obtenu peut être supérieur à 360°, grace au modulo, on retire autant de fois que nécessaire 360 au résultat afin que celui-ci soit compris entre 0° et 360°
MOD([6];360) avec [6] la valeur à moduler, 360, le modulo que l'on désire...
8-on "sectorise" le résultat...
Maintenant, nous allons définir la valeur qui est la plus proche de notre résultat, pour ensuite obtenir l'affichage d'un des 16 secteurs que nous avons prédéfinie plus haut.
ARRONDI.AU.MULTIPLE([7];22.5) avec [7] la valeur à arrondir, 22.5 le multiple à utiliser (360/16=22.5)
On inclut tout ça dans une fontion de recherche:
RECHERCHEV(ARRONDI.AU.MULTIPLE([7];22.5);plage de données;colonne à afficher;0)
plage de données: 2 colonnes, la 1ère de 0 à 360 par pas de 22.5, la seconde avec N, NNE, NE, ENE...etc
colonne à afficher: ici 2, retourne le code alpha correspondant à la valeurs de l'angle obtenu
0: option qui signifie que la plage de données n'est pas croissante, personellement, je met toujours cette valeur, je suis ainsi sur que la recherche s'effectue sur toute la plage de données.
N'oubliez pas de "caler" la plage de donnée avec $, ça évite qu'elle se décale lors des copier/coller de formules...
Pour les yeux, la formule dans son intégralité (issue de mon tableur, sans condition SI):
Code:
RECHERCHEV(ARRONDI.AU.MULTIPLE(MOD(DEGRES(COMPLEXE.ARGUMENT(COMPLEXE.SOMME(COMPLEXE.EXP(COMPLEXE(0;RADIANS(C4)));COMPLEXE.EXP(COMPLEXE(0;RADIANS(E4)));COMPLEXE.EXP(COMPLEXE(0;RADIANS(G4))))));360);22,5);'Matrice de Transformation'.$B$3:$C$18;2;0)
La démarche est la même que précédemment, sauf qu'on rajoute un produit par la vitesse.
Il va là aussi falloir transformer la valeur vitesse en nombre imaginaire (sinon le calcul renvoie une erreur).
On garde les étapes 1, 2 et 3 pour les angles
pour la vitesse (v@1, v@2, v@3)
COMPLEXE(v@1;0) ce qui donnerait ici v+0i
3b-Pour la fonction z=v*exp(i*@):
COMPLEXE.PRODUIT(COMPLEXE(v@1;0);COMPLEXE.EXP(COMP LEXE(0;[1]))
4b- La somme des nombres imaginaires:
COMPLEXE.SOMME([3bpour@1];[3bpour@2];[3bpour@3]
Ensuite, on reprend en 5. En fait, graphiquement, la vitesse va faire varier la "longueur" de la direction du vent, ce qui influeras sur la "direction" finale et donc sur l'angle...
Là aussi, pour les yeux, la formule tenant compte de la vitesse:
Code:
RECHERCHEV(ARRONDI.AU.MULTIPLE(MOD(DEGRES(COMPLEXE.ARGUMENT(COMPLEXE.SOMME(COMPLEXE.PRODUIT(COMPLEXE(J4;0);COMPLEXE.EXP(COMPLEXE(0;RADIANS(C4))));COMPLEXE.PRODUIT(COMPLEXE(K4;0);COMPLEXE.EXP(COMPLEXE(0;RADIANS(E4))));COMPLEXE.PRODUIT(COMPLEXE(L4;0);COMPLEXE.EXP(COMPLEXE(0;RADIANS(G4)))))));360);22,5);'Matrice de Transformation'.$B$3:$C$18;2)
Voilà, tout d'abord merci d'avoir lu ce topic jusque là (et bravo car c'est un beau pavé...) et j'espère avoir modestement pu vous apporter quelque chose d'intèressant...
Cordialement.
).

Commentaire