Forum de mathématiques - Bibm@th.net
Vous n'êtes pas identifié(e).
- Contributions : Récentes | Sans réponse
Pages : 1
Discussion fermée
#1 07-11-2013 17:04:41
- josse34
- Invité
Lissage de données sur l'année
Bonjour!
Voici un problème qui je pense est très intéressant, voici les données d'entrée dont nous disposons :
->Une valeur pour chaque mois de l'année :
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
-> 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).
Mon explication est elle compréhensible?
Merci pour votre aide!!!
#2 07-11-2013 17:50:49
- Roro
- Membre expert
- Inscription : 07-10-2007
- Messages : 1 801
Re : Lissage de données sur l'année
Bonjour josse,
Si j'ai bien compris ta question, tu cherches une formule mathématique qui te lisse une courbe.
J'ai l'impression que tu as toi-même donné la réponse avec le mot "spline".
Le terme "spline" correspond à une formule mathématique qui te permet de faire ce que tu demandes !
Après je ne sais pas exactement ce que tu veux comme courbe "lisse" parce que ta courbe bleue ne fait pas vraiment de saut, contrairement à ce que tu dis dans le texte...
Roro.
Hors ligne
#3 07-11-2013 19:56:16
- josse34
- Invité
Re : Lissage de données sur l'année
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 :
Désolé pour ces revirements mais je compte beaucoup sur votre aide pour éviter d'exploser!!!!!!
Grand merci!
#4 07-11-2013 22:27:06
- freddy
- Membre chevronné

- Lieu : Paris
- Inscription : 27-03-2009
- Messages : 7 457
Re : Lissage de données sur l'année
Salut,
ce n'est pas très clair, mais puisque chaque mois est la somme des résultats quotidiens, tu as perdu une information que tu ne retrouveras pas.
Par ailleurs, le mois de mars contient 31 jours (comme janvier, mai, juillet, aout, octobre et décembre), les autres en ont 30 et février en a 28 (29 chaque année bissextile = année divisible par 4 et non divisible par 400).
Hors ligne
#5 07-11-2013 23:52:55
- totomm
- Membre
- Inscription : 25-08-2011
- Messages : 1 093
Re : Lissage de données sur l'année
Bonsoir,
Ce que vous montrez au post #3, josse34, est très exactement ce que fait Excel (ou autre tableur) en faisant un graphique "nuage de points" avec courbe.
Vous voulez programmer vous-même le tracé de courbe ?
Hors ligne
#6 08-11-2013 11:04:49
- josse34
- Invité
Re : Lissage de données sur l'année
Bonjour!
Merci pour votre attention.
Freddy, l'information ne se perd pas, c'est pour cela qu'il faut rentrer ces valeurs mensuelles dans le calcul.
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[/*]
totomm, Effectivement, je veux retrouver cette courbe par le calcul, le tableur nous aide et exécute cette courbe automatiquement mais je souhaite vraiment, par le calcul, retrouver la valeur à chaque jour sans l'aide de Excel.
Yoshi, voici une base excel de travail : http://cjoint.com/?CKilaalz7z2 , la colonne A désigne les numéros de jours comme ci dessus à Freddy. 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!!!!!
#7 08-11-2013 12:38:25
- totomm
- Membre
- Inscription : 25-08-2011
- Messages : 1 093
Re : Lissage de données sur l'année
Bonjour,
Comment vous aider si vous ne dites rien de votre environnement de programmation ni de l'interface utilisateur que vous projetez !
Dans cet ordre d'idées, votre document Excel qui s'étire sur 4 colonnes n'est pas très ergonomique ...
Programmer les "spline" est bien expliqué sur la toile
Si vous programmez , il est étonnant que vous n'ayez pas l'intention d'ajuster les jours et les mois à chaque année. C'est plus facile que programmer les spline...
Vous voulez recréer des valeurs journalières, mais Freddy a raison, vous n'avez pas (ou avez perdu) l'information journalière!
Bon courage et n'explosez pas.
Hors ligne
#8 08-11-2013 12:45:27
- freddy
- Membre chevronné

- Lieu : Paris
- Inscription : 27-03-2009
- Messages : 7 457
Re : Lissage de données sur l'année
Bonjour,
Comment vous aider si vous ne dites rien de votre environnement de programmation ni de l'interface utilisateur que vous projetez !
Dans cet ordre d'idées, votre document Excel qui s'étire sur 4 colonnes n'est pas très ergonomique ...Programmer les "spline" est bien expliqué sur la toile
Si vous programmez , il est étonnant que vous n'ayez pas l'intention d'ajuster les jours et les mois à chaque année. C'est plus facile que programmer les spline...
Vous voulez recréer des valeurs journalières, mais Freddy a raison, vous n'avez pas (ou avez perdu) l'information journalière!Bon courage et n'explosez pas.
Et je dirai même plus : puisque chaque mois est la somme des valeurs journalières, on ne peut pas se permettre d'ignorer le jour de plus du mois de février des années bisextilles au risque de créer un effet de marche supplémentaire prévisible inutile !
Hors ligne
#9 08-11-2013 13:04:53
- josse34
- Invité
Re : Lissage de données sur l'année
Bonjour!
Il y a erreur, les valeurs mensuelles ne sont pas définies en fonction de valeurs journalières. C'est le contraire dans le tableau!
Je n'ai QUE les valeurs mensuelles en données d'entrées, mais comment définir une courbe lissée avec précision journalière en respectant ces sommes mensuelles?
Désolé pour la méprise!
#10 08-11-2013 14:17:20
- freddy
- Membre chevronné

- Lieu : Paris
- Inscription : 27-03-2009
- Messages : 7 457
Re : Lissage de données sur l'année
Bonjour!
Il y a erreur, les valeurs mensuelles ne sont pas définies en fonction de valeurs journalières. C'est le contraire dans le tableau!
Je n'ai QUE les valeurs mensuelles en données d'entrées, mais comment définir une courbe lissée avec précision journalière en respectant ces sommes mensuelles?
Désolé pour la méprise!
Re,
je passe la main, tu n'es pas très cohérent !
Hors ligne
#11 08-11-2013 14:54:25
- even
- Invité
Re : Lissage de données sur l'année
Je ne comprends pas, j'ai toujours dis que les seules données d'entrées sont :
->Une valeur pour chaque mois de l'année
-> Le nombre de jour par mois.
Je reste cohérent sur le fond du problème, pas sur sa façon de l'aborder, c'est pourquoi je l'expose sur ce forum!
Je ne cherche pas une méthode tarabiscotée et qui dépasse largement les connaissances, je pense que l'exposé est simple et espère une solution simplissime à mettre en oeuvre, sur le excel par exemple.
Dois je comprendre que cela est impossible ou trop compliqué?
Merci!!!!
#12 08-11-2013 15:03:49
- MathRack
- Membre
- Inscription : 02-04-2012
- Messages : 78
Re : Lissage de données sur l'année
Bonjour,
Ci-dessous un petit raisonnement étalé sur 3 mois, facilement extensible sur une année, basé sur des interpolations linéaires.
Mois : [tex]A, B, C[/tex]
Nombre de jours/mois : [tex]N_a, N_b, N_c[/tex]
Somme mois : [tex]S_a, S_b, S_c[/tex]
Valeur journalières : [tex]A_i, B_i, C_i[/tex], [tex]i \gt 0[/tex]
On a des splines : [tex]A_i=\alpha_a i + \beta_a[/tex], [tex]B_i=\alpha_b i + \beta_b[/tex], [tex]C_i=\alpha_c i + \beta_c[/tex]
On a une contrainte de continuité : [tex]A_{N_a+0.5}=B_{0.5}[/tex] et [tex]B_{N_b+0.5}=C_{0.5}[/tex]
Elles équivalent respectivement à [tex]\alpha_a (N_a+0.5) + \beta_a =0.5 \alpha_b + \beta_b[/tex] et [tex]\alpha_b (N_b+0.5) + \beta_b =0.5 \alpha_c + \beta_c[/tex].
On a également une contrainte sur les sommes : [tex]\alpha_a (N_a) + \beta_a =S_a[/tex], [tex]\alpha_b (N_b) + \beta_b =S_b[/tex], [tex]\alpha_c (N_c) + \beta_c =S_c[/tex].
Par exemple, pour les 3 premiers mois donnés : résoudre système
Vous remarquerez qu'il faut rajouter une condition pour que la solution du système soit unique. On pourra par exemple imposer une valeur fin mars pour y remédier (il suffit d'ajouter une ligne c*(31+0.5)+d=0.5*(130+150) ). Vous pouvez pondérer la valeur en fin de mois par le nombre de jours dans chaque mois...
Dans le lien donné, [tex]x=\alpha_a[/tex], [tex]y=\beta_a[/tex], [tex]a=\alpha_b[/tex], [tex]b=\beta_b[/tex], [tex]c=\alpha_c[/tex] et [tex]d=\beta_c[/tex].
Cordialement, MathRack
EDIT : Excel dispose de fonctions permettant d'inverser des systèmes linéaires. Je ne suis pas spécialiste, mais il me semble que la fonction inversemat peut inverser une matrice et que la fonction produitmat peut calculer un produit matrice-vecteur
Dernière modification par MathRack (08-11-2013 15:08:19)
Hors ligne
#13 08-11-2013 15:38:29
- josse34
- Membre
- Inscription : 08-11-2013
- Messages : 5
Re : Lissage de données sur l'année
Merci MathRack, ton développement semble correct et clair mais je suis navré, je n'ai pas les connaissances nécessaires à sa compréhension, crois moi ce n'est pas de la mauvaise volonté!
Serait il possible de le développer dans un excel par exemple (sans fonction spécifique car je veux le transformer en PHP par la suite, excel n'est qu'un support pour m'aider à comprendre) et donc déterminer les 90 valeurs journalières pour le tester?
Grand merci pour votre aide!
Hors ligne
#14 08-11-2013 16:36:44
- MathRack
- Membre
- Inscription : 02-04-2012
- Messages : 78
Re : Lissage de données sur l'année
J'ai bricolé un truc, ce n'est pas très rigoureux mais a le mérite d'être relativement simple. La série pour l'ensemble des jours est calculée à partir de la valeur entrée pour le premier jour : http://cjoint.com/?0KiqHbBmGw3
Je pense que vous pouvez construire quelque chose de plus précis. D'un point de vue mathématique, c'est simplement un système linéaire à inverser. Je vous invite à vous renseigner sur les splines, il doit y avoir des outils tout préparés qui font ça très bien.
Hors ligne
#15 08-11-2013 16:50:46
- josse34
- Membre
- Inscription : 08-11-2013
- Messages : 5
Re : Lissage de données sur l'année
Merci MathRack.
Ca prend forme, et une erreur de 0.2% est largement soutenable !!!
Néanmoins, le système support une bonne montée (sauf en Avril/mai) pour partir en freestyle après juillet dans la descente :

En tout cas la démarche est parfaitement ce qu'il me fallait, il ne reste plus qu'à corriger la descente et pourquoi améliorer le système par spline mais je ne sais pas comment faire, tout ce que je trouve à ce sujet est compliqué et non adapté à ma demande spécifique. Si tu a un exemple dans le coin, merci de m'en faire part, en tout cas pour le moment, grand merci!!!!!!!!!
Hors ligne
#16 08-11-2013 17:29:43
- totomm
- Membre
- Inscription : 25-08-2011
- Messages : 1 093
Re : Lissage de données sur l'année
Bonjour,
Je dépose quand même ce conseil que j'avais préparé, alors que MathRack a, lui, mis en oeuvre sur Excel : Bravo
Essayons de voir clair numériquement après le bon exposé de MathRack :
15 février 2.76 par jour, 31+15= jour 46
15 mars 4.33 par jour, 59+15=jour 74, de l'un à l'autre : 28 jours, 14 en février et 14 en mars
si vous reliez ces deux milieux de mois par un segment de droite, son équation serait :
(y-2.76)/(x-46) =( 4.33-2.76)/(74-46) avec x compris entre 46 et 74
Ce qui vous permet de calculer y, par exemple, pour le 26 février en faisant x=46+(26-15)
Mais comme vous aurez alors des ruptures de pentes entre les segments des mois successifs, vous voulez mettre une portion de courbe (spline) à la place du segment de droite.
Et vous devez définir les paramètres qu'il faut alors introduire pour un bon raccord sans rupture de pente à chaque milieu de mois, deux mois successifs dépendant l'un de l'autre.
C'est ce que MathRack a expliqué : pour ce mois, il faut résoudre un système d'équation afin de pouvoir calculer ensuite y fonction de x suivant cette courbe.
et 12 autres équations pour l'année…
Comprenez-vous maintenant ce qu'il faudrait poser pour définir toutes ces équations et les résoudre par programme ?
Essayez alors de mettre en place et de faire fonctionner d'abord avec des segments de droite…
Hors ligne
#17 08-11-2013 18:25:24
- josse34
- Membre
- Inscription : 08-11-2013
- Messages : 5
Re : Lissage de données sur l'année
C'est tout à fait clair totomm, merci d'avoir pris le temps de le faire.
Grossièrement, je devrais calculer, à terme, 12 segments + 12 spline en guise de jonction entre les segments.
Néanmoins pour commencer le excel de Matrack est idéal, mais ne supporte pas la descente, comment y remédier?
Ensuite pour les splines, seriez vous capable de faire de même sur le excel?
Merci infiniment!
Hors ligne
#18 10-11-2013 09:22:50
- totomm
- Membre
- Inscription : 25-08-2011
- Messages : 1 093
Re : Lissage de données sur l'année
Bonjour,
Calcul de Spline fait.
Voici donc les coordonnées des 12 points, un index repère de 0 à 11 suivi de
x = Numéro du jour dans l'année (le 15 de chaque mois) suivi de y = moyenne de chaque jour dans le mois
0 15 1.9354839
1 46 2.8571429
2 74 4.1935484
3 105 5
4 135 5.8064516
5 166 6.6666667
6 196 6.7741935
7 227 5.483871
8 258 4.6666667
9 288 2.9032258
10 319 2
11 349 1.6129032
et voici la spline avec le même index repère pour chacun des 11 morceaux
Chaque morceau est un polynôme de degré 3 : [tex]a_0+a_1x+a_2x^2+a_3x^3\text{ coefficients donnés dans l'ordre }a_0\ à\ a_3[/tex]
Chaque morceau couvre l'intervalle [tex]x_{i-1}\ à\ x_i[/tex]
Attention : Il faut calculer les polynômes de degré 3 avec 9 décimales !
1 1,565 147 021 0,027 771 754 -0,000 308 263 0,000 006 850
2 3,846 730 690 -0,121 027 181 0,002 926 497 -0,000 016 590
3 -7,055 420 199 0,320 951 909 -0,003 046 194 0,000 010 314
4 6,925 581 459 -0,078 505 281 0,000 758 160 -0,000 001 763
5 11,305 186 069 -0,175 829 828 0,001 479 083 -0,000 003 543
6 46,703 426 355 -0,815 557 062 0,005 332 861 -0,000 011 282
7 -226,226 711 278 3,361 945 044 -0,015 980 925 0,000 024 966
8 358,480 978 017 -4,365 469 352 0,018 060 548 -0,000 025 021
9 -513,959 440 080 5,779 186 673 -0,021 259 824 0,000 025 780
10 326,035 717 644 -2,970 762 887 0,009 121 945 -0,000 009 384
11 72,442 128 255 -0,585 870 197 0,001 645 793 -0,000 001 572
Comme il faut bien que josse34 travaille un peu, je ne donne pas le report de ces données dans Excel
Je ne donne pas non plus le programme de calcul qui n'est pas simple !
Avertissement : Le lissage peut ne pas conserver très exactement le total de chaque mois !
Hors ligne
#19 10-11-2013 13:05:33
- josse34
- Membre
- Inscription : 08-11-2013
- Messages : 5
Re : Lissage de données sur l'année
Je n'ai pas encore approfondi ton système totomm, mais n'est ce pas la même chose en traitant l'année entière que de dire :
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.
Grand merci et bonne journée.
Hors ligne
#20 10-11-2013 14:32:00
- totomm
- Membre
- Inscription : 25-08-2011
- Messages : 1 093
Re : Lissage de données sur l'année
Bonjour,
@josse34 : Je ne vois pas du tout comment vous arriveriez "à lisser" avec un développement tel que vous l'écrivez
Je vous donne le résultat d'un calcul, comprenez-vous comment l'utiliser ?
Sachez que ce calcul d'une spline passant par 12 points, donc formée de 11 segments curvilignes consécutifs se raccordant avec mêmes tangentes et même courbure, correspond à un développement mathématique assez simple : Voir spline sur wikipedia...
On peut améliorer la présentation des résultats, affiner la précision, mais tout dépend, au-delà de ces résultats, de votre réponse aux questions que vous avez éludées. Revoir le post #7 qui pose :
"Comment vous aider si vous ne dites rien de votre environnement de programmation ni de l'interface utilisateur que vous projetez !"
Bonne continuation.
Hors ligne
#21 12-11-2013 10:59:53
- MathRack
- Membre
- Inscription : 02-04-2012
- Messages : 78
Re : Lissage de données sur l'année
Bonjour,
Je pense que la méthode la plus simple et la plus robuste est la suivante :
1 - Relier tous les milieux de mois par des segments (on pourra décréter le 15 de chaque mois comme milieu)
2 - Pour le premier mois, prolonger le segment jusqu'au début du mois
3 - Idem pour le dernier mais prolongement vers la fin
De cette manière, vous évitez un écueil : la valeur choisie pour le premier jour du mois qui était arbitraire.
Si vous souhaitez éviter les ruptures de pente entre les segments, comme indiqué par totomm, il faut remplacer les segments (polynôme d'ordre 1) par des polynômes d'ordre 3.
Je pense que vous pouvez adapter mon fichier excel pour implémenter cette méthode. L'algorithme devrait ressembler à ça :
- Moyenne mois [tex]M_i[/tex]
- Moyenne mois+1 [tex]M_{i+1}[/tex]
- [tex]N_i[/tex] jours entre le 15 du mois [tex]i[/tex] et le 15 du mois [tex]i+1[/tex]
Droite reliant les moyennes : [tex]y_i(x) = \frac{M_{i+1}-M_i}{N_i-1} * (x-1) + M_i[/tex], avec [tex]x[/tex] qui vaut 1 le 15 du premier mois et [tex]N_i[/tex] le 15 du mois suivant. Pour [tex]x \lt 1[/tex], on prolonge le premier mois en amont et pour [tex]x \gt N_i[/tex], on prolonge le dernier mois en aval.
Cordialement, MathRack
EDIT : Josse34, vous pouvez effectivement projeter vos données sur une base de cosinus ou de sinus. Mais il faut être prudent lorsqu'on interpole une fonction, on rencontre parfois des oscillations : http://fr.wikipedia.org/wiki/Ph%C3%A9no … e_de_Runge
Dernière modification par MathRack (12-11-2013 16:51:10)
Hors ligne
#22 14-11-2013 16:09:17
- josse34
- Membre
- Inscription : 08-11-2013
- Messages : 5
Re : Lissage de données sur l'année
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!
Hors ligne
#23 17-11-2013 11:46:09
- yoshi
- Modo Ferox
- Inscription : 20-11-2005
- Messages : 17 401
Re : Lissage de données sur l'année
Bonjour,
J'ai toujours trouvé désagréable que quelqu'un mange à 2 râteliers : dans ton cas, c'est même 3, puisque tu as oublié un lien vers Maths-forum...
En prime, tu viens ici nous remercier pour une réponse qu'on t'a donnée... dans un autre forum !
Si tu n'es pas satisfait d'un forum, rien ne t'empêche effectivement d'aller en voir un autre mais de ne plus revenir dans le 1er...
Content de t'avoir eu le plaisir de te lire...
Yoshi
- Modérateur -
Hors ligne
Pages : 1
Discussion fermée







