Discussion:
Moyenne de températures
(trop ancien pour répondre)
Éric Lévénez
2012-05-19 17:42:27 UTC
Permalink
Bonjour,

Ce que je veux faire est en théorie simple, c'est calculer la moyenne de
températures sur une période donnée.

Les données en entrée sont des couples date (en s) et température (en °C).

Le problème est que les intervalles entre les dates ne sont pas
identiques, sinon il suffirait de faire la somme des températures /
nombre de mesures.

J'avais pensé simuler des intervalles égaux d'une seconde en calculant
des températures intermédiaires par simple interpolation linéaire. La
moyenne est alors la somme des températures intermédiaires ou réels /
durée en s.

Mais il doit y avoir un autre moyen car l'interpolation linéaire, c'est
un peu trop rude je pense.
--
Éric Lévénez -- <http://www.levenez.com/>
Unix is not only an OS, it's a way of life.
Pascal J. Bourguignon
2012-05-19 20:25:56 UTC
Permalink
Post by Éric Lévénez
Mais il doit y avoir un autre moyen car l'interpolation linéaire,
c'est un peu trop rude je pense.
L'interpolation quadratique?
--
__Pascal Bourguignon__ http://www.informatimago.com/
A bad day in () is better than a good day in {}.
Éric Lévénez
2012-05-20 07:19:22 UTC
Permalink
Post by Pascal J. Bourguignon
Post by Éric Lévénez
Mais il doit y avoir un autre moyen car l'interpolation linéaire,
c'est un peu trop rude je pense.
L'interpolation quadratique?
Oui, c'est ce que je pensais, mais le but n'étant pas de calculer la
courbe complète des points, mais juste la moyenne, j'espérais un
algorithme plus simple.
--
Éric Lévénez -- <http://www.levenez.com/>
Unix is not only an OS, it's a way of life.
Pascal J. Bourguignon
2012-05-20 08:09:17 UTC
Permalink
Post by Éric Lévénez
Post by Pascal J. Bourguignon
Post by Éric Lévénez
Mais il doit y avoir un autre moyen car l'interpolation linéaire,
c'est un peu trop rude je pense.
L'interpolation quadratique?
Oui, c'est ce que je pensais, mais le but n'étant pas de calculer la
courbe complète des points, mais juste la moyenne, j'espérais un
algorithme plus simple.
Le plus simple, c'est de calculer la surface.

Σ δtᵢ·Tᵢ
----------
Σ δtᵢ

(/ (sum i (* (delta-t i) (temp i)))
(sum i (delta-t i)))


Mais comme on suppose que la température évolue continuement, les sauts
de températures ne sont pas réaliste, donc on peut faire une
interpolation linéaire.


Σ δtᵢ·½(Tᵢ₊₁+Tᵢ)
---------------
Σ δtᵢ

(/ (sum i (* (delta-t i) (/ (+ (temp (+ i 1)) (temp i)) 2)))
(sum i (delta-t i)))




Maintenant, avec l'interpolation linéraire, on a des changements de
variation de température aux temps de mesures qui sont discontinus, et
ceci n'est probablement pas réaliste non plus. En tout cas, il n'y a
aucune raison pour que tous les changement de variation de température
discontinus se produisent toujours au moment de la mesure. Une
interpolation quadratique ne résoudrait pas ce problème.

Ainsi, on pourrait prendre comme contraintes que:

- la température évolue continument,
- la variation (dérivée) de température évolue continument.

Aux points de mesure, on a deux tangentes, une vers la gauche, et une
autre vers la droite. On pourrait faire une moyenne pondérée pour
obtenir une seule tangente (si on a une mesure plus proche que l'autre,
on peut supposer que la courbe ira plus directement vers elle).

Donc on a maintenant le problème d'imaginer une courbe entre deux points
et se finissant avec deux tangentes données. Les courbes de Bezier
cubiques pourraient faire l'affaire.


P(τ)=P₀(1-τ)³+3P₁τ(1-τ)²+3P₂τ²(1-τ)+P₃τ³

avec: τ-1 = tᵢ-δtᵢ
τ = tᵢ

P₀ et P₃ sont les points de mesure.
P₁ et P₂ sont sur les tangentes, mais on peut choisir leur position (ça
donne une variation plus ou moins brusque, je les prendrais trés proche
des points de mesure, par exemple 1/10 de δtᵢ).


Reste à intégrer ces courbes parametriques cubiques (entre tᵢ-δtᵢ et
tᵢ), ie. effectuer le changement de variable de τ par t, et
l'intégration est alors toute simple (c'est un simple polynôme de degré
3).
--
__Pascal Bourguignon__ http://www.informatimago.com/
A bad day in () is better than a good day in {}.
Éric Lévénez
2012-05-20 09:14:23 UTC
Permalink
Post by Pascal J. Bourguignon
Le plus simple, c'est de calculer la surface.
[snip]
Je vais réfléchir à tout cela.

Merci.
--
Éric Lévénez -- <http://www.levenez.com/>
Unix is not only an OS, it's a way of life.
Rémi Moyen
2012-05-19 22:19:37 UTC
Permalink
Post by Éric Lévénez
Bonjour,
Ce que je veux faire est en théorie simple, c'est calculer la moyenne de
températures sur une période donnée.
Les données en entrée sont des couples date (en s) et température (en °C).
Le problème est que les intervalles entre les dates ne sont pas
identiques, sinon il suffirait de faire la somme des températures /
nombre de mesures.
Question bête, est-ce que faire la moyenne pondérée (par l'intervalle
entre les mesures, ou l'intervalle centré sur chaque mesure) ne
suffirait pas ?

Si la série est assez longue et pas trop irrégulière (i.e. tous les
intervalles sont du même ordre de grandeur), je pense que le résultat
doit être au pouillème près la même chose que ce que donnera une
interpolation plus complexe.

Sinon, quelles propriétés cherches-tu dans l'interpolation ? Simplicité
de l'algo ? Rapidité de calcul ? Précision du résultat (mais par rapport
à quel référence théorique) ? Continuité de la courbe/dérivée/dérivée
n-ième ? Similarité avec un processus physique (genre températures
journalières ou annuelles) ?

Je ne suis pas sûr de comprendre ce que tu veux dire par
"l'interpolation linéaire, c'est un peu trop rude"...
--
Rémi Moyen
Éric Lévénez
2012-05-20 08:40:35 UTC
Permalink
Post by Rémi Moyen
Si la série est assez longue et pas trop irrégulière (i.e. tous les
intervalles sont du même ordre de grandeur), je pense que le résultat
doit être au pouillème près la même chose que ce que donnera une
interpolation plus complexe.
Sinon, quelles propriétés cherches-tu dans l'interpolation ? Simplicité
de l'algo ? Rapidité de calcul ? Précision du résultat (mais par rapport
à quel référence théorique) ? Continuité de la courbe/dérivée/dérivée
n-ième ? Similarité avec un processus physique (genre températures
journalières ou annuelles) ?
Je ne suis pas sûr de comprendre ce que tu veux dire par
"l'interpolation linéaire, c'est un peu trop rude"...
C'est pour de la domotique. j'ai des capteurs de températures qui
remontent des infos par intervalle de 60 à 90 s, de façon irrégulière,
et parfois l'info n'est pas remontée (émission perturbée). Je voudrais
calculer la température moyenne par capteur.

En pratique, donc, mon problème n'a pas besoin d'une grande précision,
voire pas de précision du tout. Mais c'est plus pour la beauté de l'art
que pour autre chose que je voudrais faire ce calcul.

Pour la moyenne je voudrais calculer celle d'une journée entière, celle
de la nuit et celle du jour. Il me faudra calculer l'heure de lever et
coucher du soleil pour connaître les bornes temporelles.

En y réfléchissant, comme les sondes de température émettent entre 60 à
90 s, et parfois pas, si j'obtiens 140 s entre 2 mesures, je peux
supposer qu'une mesure manque et faire l'interpolation linéaire simple
pour la retrouver (la température ne change pas brutalement). Cela
devrait aller.

Je vais quand même regarder du côté d'une interpolation quadratique,
mais bon en Perl, ce n'est pas simple à coder...
--
Éric Lévénez -- <http://www.levenez.com/>
Unix is not only an OS, it's a way of life.
Tonton Th
2012-05-31 10:24:56 UTC
Permalink
Post by Éric Lévénez
Je vais quand même regarder du côté d'une interpolation quadratique,
mais bon en Perl, ce n'est pas simple à coder...
Si tu arrives à une solution sympa, j'aimerais bien
la voir...
--
Nous vivons dans un monde étrange/
http://foo.bar.quux.over-blog.com/
Michel Olagnon
2012-05-31 12:05:23 UTC
Permalink
Post by Tonton Th
Post by Éric Lévénez
Je vais quand même regarder du côté d'une interpolation quadratique,
mais bon en Perl, ce n'est pas simple à coder...
Si tu arrives à une solution sympa, j'aimerais bien
la voir...
La meilleure solution à mon avis est de se baser sur la formule de
Pascal, mais de ne pas interpoler :

Σ δtᵢ·Tᵢ
----------
Σ δtᵢ

(/ (sum i (* (delta-t i) (temp i)))
(sum i (delta-t i)))


delta-t i vaut
0.5 * [min (t_m, (t_{i}-t_{i-1})) + min (t_m, (t_{i+1}-t_{i}))]
où t_m est la durée maximale dont une mesure est représentative.
Cela revient à dire qu'une mesure est représentative de la durée depuis
le milieu de la période depuis la mesure précédente jusqu'au milieu de
celle jusqu'à la mesure suivante, avec un garde-fou au cas où ce serait
trop long. Quand on n'a pas de mesure, on ne change rien.
Si (sum i (delta-t i)), la durée dont la moyenne est représentative, est
trop courte par rapport au temps écoulé, on peut indiquer que la moyenne
est douteuse.

Interpoler n'est qu'une complication inutile, car on ne peut créer
d'information ex-nihilo.
Éric Lévénez
2012-05-31 17:59:14 UTC
Permalink
Post by Michel Olagnon
Post by Tonton Th
Post by Éric Lévénez
Je vais quand même regarder du côté d'une interpolation quadratique,
mais bon en Perl, ce n'est pas simple à coder...
Si tu arrives à une solution sympa, j'aimerais bien
la voir...
La meilleure solution à mon avis est de se baser sur la formule de
Σ δtᵢ·Tᵢ
----------
Σ δtᵢ
(/ (sum i (* (delta-t i) (temp i)))
(sum i (delta-t i)))
delta-t i vaut
0.5 * [min (t_m, (t_{i}-t_{i-1})) + min (t_m, (t_{i+1}-t_{i}))]
où t_m est la durée maximale dont une mesure est représentative.
Cela revient à dire qu'une mesure est représentative de la durée depuis
le milieu de la période depuis la mesure précédente jusqu'au milieu de
celle jusqu'à la mesure suivante, avec un garde-fou au cas où ce serait
trop long. Quand on n'a pas de mesure, on ne change rien.
Si (sum i (delta-t i)), la durée dont la moyenne est représentative, est
trop courte par rapport au temps écoulé, on peut indiquer que la moyenne
est douteuse.
Interpoler n'est qu'une complication inutile, car on ne peut créer
d'information ex-nihilo.
Je n'ai pas commencé à coder car c'est un projet que j'ai en tâche de
fond, alors ça peut prendre du temps. Mais je vais étudier toutes les
possibilités. Sans parler des complications annexes comme le calcul du
lever/coucher du soleil pour avoir une moyenne de température jour et
nuit, et le traitement du changement d'heure été/hivers (pour afficher
un graphique de statistique sur une journée, sur 23, 24 ou 25
heures...). Bref beaucoup de complications pour rien du tout, juste pour
le plaisir. Mais merci à tous pour les idées.
--
Éric Lévénez -- <http://www.levenez.com/>
Unix is not only an OS, it's a way of life.
Loading...