Lissage de données sur l'année

Olympiades mathématiques, énigmes et défis
josse34
Membre Naturel
Messages: 22
Enregistré le: 14 Mai 2012, 11:17

Lissage de données sur l'année

par josse34 » 07 Nov 2013, 16:48

Bonjour!
Voici un problème qui je pense est très intéressant :mur: , voici les données d'entrée dont nous disposons :

-> Une valeur pour chaque mois de l'année :
[list=]
[*]Janvier = 60
[*]Février = 80
[*]Mars = 130
[*]Avril = 150
[*]Mai = 180
[*]Juin = 200
[*]Juillet = 210
[*]Aout = 170
[*]Septembre = 140
[*]Octobre = 90
[*]Novembre = 60
[*]Decembre = 50
[/list]
-> Le nombre de jour par mois.


Pour connaitre la valeur chaque jour, je peux prendre Mars par exemple et le diviser par le nombre de jours dans le mois, soit 130 / 30 = 4,33.
Pour Février : 80 / 29 = 2,76.

Néanmoins je sais que ces valeurs de 2,76 et 4,33 concerne la moyenne en milieu du mois, je considère donc le 15 Février et 15 Mars.

Ainsi avec cette méthode simpliste, le 29 Février je suis à 2,76 tandis que je lendemain (1er Mars) je saute à 4,33 soit prés du double me créant une "marche".

Je souhaite donc lisser (par une formule mathématique) de façon journalière ces données mensuelles mais je dois respecter absolument la valeur du 15 de chaque mois (Février 2.76 et Mars 4.33) et surtout la somme mensuelle (Février 80 et Mars 130).
En gros en expliquant graphiquement, passer de barres (série 1) à une spline (série 2).
Image


Mon explication est elle compréhensible?

Merci pour votre aide!!!



Avatar de l’utilisateur
Ben314
Le Ben
Messages: 21709
Enregistré le: 11 Nov 2009, 21:53

par Ben314 » 07 Nov 2013, 19:56

Si tu ne précise rien de particulier concernant ta "série 2" (sauf visiblement la continuité vu que tu ne veut pas de "saut"), il y a quand même une ENORMMMMMMME infinité de solution.
Pour t'en donner juste une famille de solutions (à mon sens les plus simples).
Sur ta feuille, tu ne trace pour commencer que les points correspondant aux "valeurs du 15 du mois" (encore que, pour février, c'est peut-être plutôt le 14... :marteau:)
Tu cherche donc une courbe qui passe par ces points là.
Si tu prend une hauteur totalement au pif pour le premier janvier puis que, pour tout le mois de janvier, tu trace la droite reliant ton point "au pif" du 1er janvier avec le point fixé du 15 janvier, tu vérifiera aisément que ça te fait la bonne somme pour le mois de janvier.
Tu recommence de même pour février en partant du point obtenu pour le 31 janvier etc. etc.
Quel que soit le point de départ (pour le 1er janvier), ça te donnera une "courbe" continue ayant les propriétés que tu as demandé (mais qui risque fortement de faire d'énormes "dents de scie"...)

Après, parmi toutes ces "courbes" (continues et affines par morceaux), on pourrait chercher celle qui minimise (par exemple) la moyenne des carrés des pentes des morceaux pour essayer de "limiter la casse" au niveau des dents de scie.
On peut aussi essayer d'utiliser des paraboles (i.e. équation du 2nd degrés) à la place des droites (du 1er degrés) et demander que la fonction finale soit dérivable en plus d'être continue. Mais on pourra encore choisir le point de départ et sa tangente "au pif" et il faudra décider d'un "truc" à minimiser ou maximiser pour obtenir une et une seule courbe.
Qui n'entend qu'un son n'entend qu'une sonnerie. Signé : Sonfucius

josse34
Membre Naturel
Messages: 22
Enregistré le: 14 Mai 2012, 11:17

par josse34 » 07 Nov 2013, 19:57

Bonsoir!
Toutes mes excuses et très honnêtement, je suis en train de me noyer tout seul!
Je tourne en rond depuis des jours sur ce problème et me demande si il existe une solution!

Je repose le problème d'une façon plus simple :

-> je connais seulement un valeur mensuelle comme ceci :
Janvier = 60
Février = 80
Mars = 130
Avril = 150
Mai = 180
Juin = 200
Juillet = 210
Aout = 170
Septembre = 140
Octobre = 90
Novembre = 60
Decembre = 50

Comment en déduire une valeur journalière tout en conservant strictement la valeur mensuelle (somme des valeurs journalières = valeur mensuelle).
En gros actuellement j'ai quelque chose qui ressemble à ça et souhaite obtenir le graph du dessous :
Image

Désolé pour ces revirements mais je compte beaucoup sur votre aide pour éviter d'exploser!!!!!!

Grand merci!

josse34
Membre Naturel
Messages: 22
Enregistré le: 14 Mai 2012, 11:17

par josse34 » 08 Nov 2013, 11:06

Bonjour!
Concernant les jours, il est certainement plus simple d'oublier le bissextile et de partir sur une base composée de numéros de jours fixes avec intervalles tout aussi fixes :
Janvier - 31 jours - du jour 1 au jour 31
Février - 28 jours - du jour 32 au jour 59
Mars - 31 jours - du jour 60 au jour 90
Avril - 30 jours - du jour 91 au jour 120
Mai - 31 jours - du jour 121 au jour 151
Juin - 30 jours - du jour 152 au jour 181
Juillet - 31 jours - du jour 182 au jour 212
Août - 31 jours - du jour 213 au jour 243
Septembre - 30 jours - du jour 244 au jour 273
Octobre - 31 jours - du jour 274 au jour 304
Novembre - 30 jours - du jour 305 au jour 334
Décembre - 31 jours - du jour 335 au jour 365

Voici une base excel de travail : http://cjoint.com/?CKilaalz7z2 , la colonne A désigne les numéros de jours. La colonne B en orange les mois, la colonne C en jaune les valeurs mensuelles à respecter strictement, et en colonne D les valeurs journalières obtenues basiquement par division de la valeur mensuelle par le nombre de jours du mois.

Je veux donc éviter ce genre de marche entre les jours 59 et 60 passant de 2.85 à 4.19, lisser chaque jour tout en respectant la somme mensuelle.

Merci!!!!!

Avatar de l’utilisateur
Ben314
Le Ben
Messages: 21709
Enregistré le: 11 Nov 2009, 21:53

par Ben314 » 08 Nov 2013, 19:21

Tu as lu mon post précédent ?

Donc voila ce que donne la méthode "affine" :
https://drive.google.com/file/d/0B_QwUIT1NM2YdGV2TDJYd2s2elU/edit?usp=sharing

Tu vérifiera qu'elle "évite ce genre de marche entre les jours 59 et 60 passant de 2.85 à 4.19", qu'elle "lisse chaque jour" et qu'elle "respecte la somme mensuelle"

Après, c'est encore mieux que prévu : pour la case correspondant à la ligne "1er Janvier", colonne "lissage", tu peut mettre... absolument la valeur que tu veut...
Dans tout les cas, ça continuera à vérifier les contraintes que tu as donné.

Donc je le (re)dit : avec uniquement les désidérata que tu as, il y a une ENORME infinité de solutions...


P.S. Les calculs de droite correspondent à différentes métodes de calculs pour éviter le plus possible l'effet "dent de scie" que tu obtient si tu met par exemple 50 dans "lissage" pour le 1er janvier.
Ca conduit à mettre plutôt des valeurs entre 2.07 et 2.47 dans la fameuse case.
Qui n'entend qu'un son n'entend qu'une sonnerie. Signé : Sonfucius

josse34
Membre Naturel
Messages: 22
Enregistré le: 14 Mai 2012, 11:17

par josse34 » 09 Nov 2013, 11:43

Merci Ben314.

Il est vrai que l'on peut choisir la valeur dans la première case mais je cherche plutôt à obtenir quelque chose de plus "automatique".
Néanmoins, désolé de faire l'inspecteur des travaux finis :marteau: mais quelque soit cette première case, ça part en freestyle dans la descente :
Image
Merci!!

Avatar de l’utilisateur
Ben314
Le Ben
Messages: 21709
Enregistré le: 11 Nov 2009, 21:53

par Ben314 » 09 Nov 2013, 15:53

josse34 a écrit:Néanmoins, désolé de faire l'inspecteur des travaux finis :marteau: mais quelque soit cette première case, ça part en freestyle dans la descente :

Tout à fait, parfaitement, exactement (et encore, là tu es gentil, tu as pas mis 50 dans la première case)
Sauf que justement, dans tes désidérata :
josse34 a écrit:Je veux donc éviter ce genre de marche entre les jours 59 et 60 passant de 2.85 à 4.19, lisser chaque jour tout en respectant la somme mensuelle.

Il n'y a rien qui dit que la courbe çi dessus ne "convient pas".

N'étant pas stupide, je me doutais bien que ça n'irais pas, mais je te rappelle que mon but n'était pas de donner une solution à ton problème, mais simplement de te faire comprendre que l'énoncé de ton problème était (trés) insuffisant pour qu'on puisse mathématiquement trouver UNE solution.


P.S. avec la solution "affine", c'est peut-être plutôt la valeur 2,2768817204 (pour le 1er janvier) qui est la plus "raisonnable" : c'est elle qui minimise la somme des carrés des pentes des différents segments.
Qui n'entend qu'un son n'entend qu'une sonnerie. Signé : Sonfucius

Avatar de l’utilisateur
leon1789
Membre Transcendant
Messages: 5486
Enregistré le: 27 Nov 2007, 15:25

par leon1789 » 09 Nov 2013, 16:32

Bonjour

en imaginant que le phénomène est périodique sur une année, je vous propose cette fonction :



où m désigne le numéro du mois (entre 1 et 12)

ou bien



où j désigne le numéro du jour (entre 1 et 365)

josse34
Membre Naturel
Messages: 22
Enregistré le: 14 Mai 2012, 11:17

par josse34 » 10 Nov 2013, 12:54

leon1789 a écrit:Bonjour

en imaginant que le phénomène est périodique sur une année, je vous propose cette fonction :



où j désigne le numéro du jour (entre 1 et 365)


Merci!
Formule atypique et simple mais qui, selon moi, ne respecte pas les totaux mensuels :
56,49261062
81,41223884
118,5470708
157,9468584
189,0544602
203,5346195
197,5073894
172,5877612
135,4529292
96,05314162
64,94553979
50,46538046
et ne fonctionne pas (30 fois trop grand) concernant les jours (exemple pour les 10 premiers jours) :
51,07397682
51,30582517
51,56010333
51,83673596
52,13564109
52,45673015
52,79990798
53,1650729
53,55211671
53,96092471

La courbe est une parfaite sinusoïde en tout cas!


En tout état de cause, on m'a suggéré un modèle qui fonctionne parfaitement :
a0+a1*cos((2*PI*t)/365)+a2*cos(2*((2*PI*t)/365))+a3*cos(3*((2*PI*t)/365))+a4*cos(4*((2*PI*t)/365))+a5*cos(2*((5*PI*t)/365))+b1*sin((2*PI*t)/365)+b2*sin(2*((2*PI*t)/365))+b3*sin(3*((2*PI*t)/365))+b4*sin(4*((2*PI*t)/365))+b5*sin(5*((2*PI*t)/365))+b6*sin(6*((2*PI*t)/365))

t étant le numéro de jour et les coefficients a0, a1, a2, a3, a4, a5, b1, b2, b3, b4, b5, b6 obtenus par équation à 12 inconnus que je n'arrive pas à déterminer simplement.

Par ailleurs, les COS et SIN sont ils placés en fonction de la phase montante ou descendante du mois?

Grand merci et bonne journée.

Avatar de l’utilisateur
Ben314
Le Ben
Messages: 21709
Enregistré le: 11 Nov 2009, 21:53

par Ben314 » 10 Nov 2013, 16:01

Les matrice OpenOffice sait les inverser (donc je pense qu'exel aussi) donc tu n'as aucun problème pour calculer les coeffs.

Concernant LA série que tu donne comme exemple, le résultat est visuellement "sympatique" sauf que... il ne vérifie pas les contraintes que tu avais mise (que la nouvelle série ait la bonne valeur le 15 du mois). Et vu que déjà, des contraintes il n'y en avait pas assez pour avoir une unique solution, je trouve ça pour le moins surprenant que tu enlève des contraintes...

J'espère aussi que tu ne compte pas utiliser cette approximation avec une quelconque autre série de valeurs mensuelles : tu tombera très rapidement sur des "dents de scie" liées à ce que l'on appelle le phénomène de Gibbs.

Enfin, pourquoi approximer avec un polygone trigo. dont le "degré" en cosinus est 5 et celui en sinus est 6 ? Qu'est ce qui, dans le phénomène concret que tu cherche à modéliser fait que tu ne va pas plus loin dans les exposants ? Pourquoi ne va tu pas à l'ordre 8 sur les cosinus et 15 sur les sinus ?
Je suppute que la raison n'a absolument rien à voir avec le phénomène que tu cherche à modéliser, mais uniquement avec le fait que, pour que solution unique il y ait, il te faut 12 variables vu que tu va avoir 12 équation (uniquement les égalités sur les sommes des mois vu que, je sais pas pour quelle raison, tu as laisser tomber les égalités sur les 15 du mois...) et que tu as pris des poly. de degrés 6 en sinus et 5 en cosinus parce que... ça te fait bien 12 inconnues.

Par exemple, une VRAI question (à laquelle j'aimerais que tu réponde s'il te plait) : Pourquoi ne pas prendre des polynômes trigo de degré 5 en sinus et 6 en cosinus ? (le résultat obtenu est trés trés différent...)

En bref, utilise la méthode que tu veut, mais par contre, je t'interdit de dire que "les matheux ont cautionnés que c'était la bonne façon de faire".
Qui n'entend qu'un son n'entend qu'une sonnerie. Signé : Sonfucius

Avatar de l’utilisateur
leon1789
Membre Transcendant
Messages: 5486
Enregistré le: 27 Nov 2007, 15:25

par leon1789 » 10 Nov 2013, 18:21

josse34 a écrit:Merci!
Formule atypique et simple mais qui, selon moi, ne respecte pas les totaux mensuels :

oui, c'est une formule simple qui ne fait qu'approcher les totaux mensuels.

D'ailleurs, vos données ne sont-elles pas elles aussi des approximations ? Est-ce vraiment utile d'avoir une formule qui donne exactement les valeurs signalées ? Cela a-t-il un sens concret ?

josse34 a écrit:et ne fonctionne pas (30 fois trop grand) concernant les jours (exemple pour les 10 premiers jours) :

exact, j'ai oublié de diviser par 30... Il suffit donc de diviser la formule par 30.4 (jours / mois) !

josse34 a écrit:En tout état de cause, on m'a suggéré un modèle qui fonctionne parfaitement :
a0+a1*cos((2*PI*t)/365)+a2*cos(2*((2*PI*t)/365))+a3*cos(3*((2*PI*t)/365))+a4*cos(4*((2*PI*t)/365))+a5*cos(2*((5*PI*t)/365))+b1*sin((2*PI*t)/365)+b2*sin(2*((2*PI*t)/365))+b3*sin(3*((2*PI*t)/365))+b4*sin(4*((2*PI*t)/365))+b5*sin(5*((2*PI*t)/365))+b6*sin(6*((2*PI*t)/365))
t étant le numéro de jour et les coefficients a0, a1, a2, a3, a4, a5, b1, b2, b3, b4, b5, b6 obtenus par équation à 12 inconnus que je n'arrive pas à déterminer simplement.

oui, c'est exactement ce que je vous ai proposé, mais avec une formule comportant moins de paramètres (seulement 3 au lieu de 12), pour voir si cela pouvait vous convenir.

Augmenter fortement le nombre de paramètres peut faire plaisir ponctuellement, donnant une impression de perfection sur certaines valeurs spécifiques, mais cela peut aussi avoir de gros défauts sur l'ensemble de la courbe... A vous de voir.


josse34
Membre Naturel
Messages: 22
Enregistré le: 14 Mai 2012, 11:17

par josse34 » 10 Nov 2013, 20:16

Bonsoir!
Tout d'abord Ben314, je ne peux répondre à ta question tout simplement parce que mon niveau en mathématique est bien en deçà de vos compétences, et je rejoint leon1789 concernant mes multiples posts qui permettent de comparer plusieurs approches viables :
Image

Ainsi, j'admet qu'il existe une multitude de solutions possible, celles ci-sont très intéressantes :

La votre étant d'une simplicité très agréable pour un profane comme moi mais avec quelques imprécisions.

La solution de IleMaths http://www.ilemaths.net/forum-sujet-578936.html est le meilleur rapport simplicité/performance mais déjà d'une mise en oeuvre plus fastidieuse bien que peu complexe.

Enfin, la solution de loin la plus satisfaisante sur http://www.forum.math.ulg.ac.be/viewthread.html?SESSID=f9d2be83fe5f5d2e0085ed613adbdf86&id=56988 avec une précision de 100%, une courbe absolument parfaite mais complexe mathématiquement (en tout cas pour moi!) et difficile à mettre en oeuvre (car nombre de calculs préliminaires et surtout cette équation linéaire à 12 inconnus!!) mais pas impossible!

Ainsi, pour un problème comme celui la, le principe du forum étant de partager l'information, je vais regrouper ces informations sur tout mes posts en fin de recherche et pour répondre à ta question Ben314 "Pourquoi ne pas prendre des polynômes trigo de degré 5 en sinus et 6 en cosinus ? (le résultat obtenu est trés trés différent...)" je n'en ai pas la moindre idée, encore une fois, cela dépasse largement mes connaissances et compétences! Si il est possible d'obtenir un résultat idéal avec moins de calcul complexe (peu importe le volume de calcul à faire, c'est la complexité qui me rebute pour retranscrire en PHP) sur la base/comparaison des 3 méthodes décrites ici, alors je te remercie d'avance de me la proposer!

En tout cas, grand merci pour votre participation, j'apprécie grandement et c'est sincere :lol3:

Bonne soirée!

Avatar de l’utilisateur
Ben314
Le Ben
Messages: 21709
Enregistré le: 11 Nov 2009, 21:53

par Ben314 » 11 Nov 2013, 01:24

Moi, ce que je constate en lisant les autres forums, c'est ça a beau "largement dépasser tes connaissances et compétences", n’empêche que quand on est des tas à te dire que ton problème n'a pas assez de contrainte (ou, ce qui revient au même que "lisser", il y a 36 000 façons de le faire et que si on connait pas le contexte, on fait n'importe quoi...) le résultat est systématiquement le même :
on aurait "pissé dans un violon" (comme on dit), ben ça aurait été pareil !!!

Sinon, "juste pour voir", tu as fait gaffe que celle des méthodes que tu trouve "la plus satisfaisante", elle donne ça :
Image
La courbe 1, c'est l'exemple que tu as donné : nickel.
Pour les deux autres, on a appliqué (sans rien comprendre...) la même méthode.
Pour la deuxième, les valeurs trouvées sont négatives pour toute la fin juillet et le début aout.
La troisième, c'est pour te montrer ce qu'est le "phénomène de Gibbs" dont je te parle dans le post précédent.

Tu en pense quoi de ces deux courbes, toujours aussi "satisfaisantes" ?

Donc je le re-re-re-re-re-dit : tant que tu ne sera pas plus précis sur tes désidérata, tout ce que tu vas faire, ça sera du "grand n'importe quoi" sans le début du commencement d'une démarche scientifique.

Déjà que de voir que ta façon de comparer les méthode ça consiste uniquement à essayer sur UN exemple, sans même te demander ce que la méthode en question à cherché à minimiser, ni ce qu'on sait concernant la méthode en question (par exemple, j'ai bien l'impression que les recherches de Gibbs concernant les approximation par des polygones trigo, tu t'en fout comme de l'an 40 : pourvu que ça ait l'air propre sur LE exemple que tu as, tout va bien...)
Qui n'entend qu'un son n'entend qu'une sonnerie. Signé : Sonfucius

josse34
Membre Naturel
Messages: 22
Enregistré le: 14 Mai 2012, 11:17

par josse34 » 11 Nov 2013, 11:13

Bonjour!

C'est pour cela que récolter différentes méthodes et les comparer ensuite est très enrichissant pour un têtu comme moi!
IleMaths vient de me faire la même démonstration que mon favori n'était finalement pas idéal, et tu remue le couteau dans la plaie!!!!!!
Vous avez en tout état de cause tout à fait raison, mais faut le temps que ça rentre! :mur: :we:
En tout cas, leur solution vient être améliorée à une erreur de 0,6%, une mise en oeuvre simplifiée et une gestion des phénomènes très bonne selon moi :
Image

C'est à but professionnel, je monte un site internet composé en grande partie de code PHP. Dans une partie du fonctionnement global, je calcule un prévisionnel me donnant ces 12 données mensuelles d'entrée. Je pourrais m'en contenter mais dans un souci de justesse je veux "lisser" ces valeurs jours après jours dans l'année, c'est pour cela que ces 12 paramètres sont les seules données à respecter!
Evidemment, comme le fait remarquer IleMaths, l'erreur générée avec la "justesse" de ce prévisionnel compense largement les petites erreurs de lissage, on est clairement dans un énoncé d'approximation perpétuelle! Néanmoins c'est exactement cela qu'il me faut, qu'en pensez vous?

Grand merci et bonne journée!

Bye

Avatar de l’utilisateur
Ben314
Le Ben
Messages: 21709
Enregistré le: 11 Nov 2009, 21:53

par Ben314 » 11 Nov 2013, 23:26

A force de cogiter, j'ai fini par trouver un truc qui pourrait rendre ton problème cohérent (mathématiquement parlant) :
On veut minimiser la somme des carrés des écarts entre 2 jours consécutifs, c'est à dire est la valeur "approximée" pour le n-ième jour de l'année.
Le tout en respectant les sommes mensuelles de départ.

Ca donne ça :
https://drive.google.com/file/d/0B_QwUIT1NM2YLVdNU1lLcjUyQW8/edit?usp=sharing

Teste avec PLUSIEURS séries mensuelles et dit moi ce que tu en pense.
Pour la résolution, il y a un système linéaire de 24 équations à 24 inconnues à résoudre (les valeurs de début et de fin des 12 mois), mais il est "creux" (i.e. 90% de la matrice est nulle) donc trés simple à résoudre (et vu que la matrice ne dépend que du nombre de jours dans chaque mois, il faudrait calculer quelle erreur on commet au final si on faisait comme si chaque mois avait 30 jours)
On peut aussi simplifier le problème (matrice 12x12 toujours aussi creuse) en imposant que la valeur approximée le 1er du mois soit exactement la même que celle du jour précédent, mais la courbe obtenue est moins "lissée".

P.S. Sur le diagramme de ton post çi dessus, ça m'étonnerais fort que la somme des valeurs approximées pour le mois de janvier soit la bonne...
Qui n'entend qu'un son n'entend qu'une sonnerie. Signé : Sonfucius

josse34
Membre Naturel
Messages: 22
Enregistré le: 14 Mai 2012, 11:17

par josse34 » 14 Nov 2013, 16:08

Bonjour!

Je viens de terminer mon codage PHP, cela fonctionne à merveille.

J'ai choisi (surtout pour la précision et simplicité des calculs via PHP) la solution suivante : lien
Espérons que cela serve aux prochains!!

Grand merci à vous tous pour votre attention et surtout votre aide précieuse qui m'ont permis de choisir la meilleure solution pour mon projet, je n'aurais rien pu faire sans vous tous!

Bonne continuation, post clos!

 

Retourner vers ⚔ Défis et énigmes

Qui est en ligne

Utilisateurs parcourant ce forum : Aucun utilisateur enregistré et 14 invités

Tu pars déja ?



Fais toi aider gratuitement sur Maths-forum !

Créé un compte en 1 minute et pose ta question dans le forum ;-)
Inscription gratuite

Identification

Pas encore inscrit ?

Ou identifiez-vous :

Inscription gratuite