regulateur

regulateur - Java - Programmation

Marsh Posté le 07-11-2005 à 23:46:04    

Bonjour  
Je cherche à programmer un regulateur de flux de données (par un PID).
J'ai des données qui arrivent d'un coté (de maniere plus ou moins reguliere),
 je les ressort de l'autre. La sortie doit être reguliere , ne doit pas presenté d'acoup,  
il faut eviter les petites fluctuations, elle doit rattrape un retour s'il y a.
L'objectif est d'avoir le sortie la plus fluide possible.
Merci d'avance
 :o  


---------------
"Placez votre main sur un poele une minute et ça vous semble durer une heure. Asseyez vous aupres d'une jolie fille une heure et ça vous semble durer une minute. C'est ça la relativite." (Albert Einstein / 1879-1955)
Reply

Marsh Posté le 07-11-2005 à 23:46:04   

Reply

Marsh Posté le 07-11-2005 à 23:47:09    

Et donc, quelles idées as tu pour le moment?


---------------
I mean, true, a cancer will probably destroy its host organism. But what about the cells whose mutations allow them to think outside the box by throwing away the limits imposed by overbearing genetic regulations? Isn't that a good thing?
Reply

Marsh Posté le 08-11-2005 à 07:54:48    

J'ai fait un rattrapage et regulation lineaire, par palier, mais ca saccade


---------------
"Placez votre main sur un poele une minute et ça vous semble durer une heure. Asseyez vous aupres d'une jolie fille une heure et ça vous semble durer une minute. C'est ça la relativite." (Albert Einstein / 1879-1955)
Reply

Marsh Posté le 08-11-2005 à 11:33:45    

et pour le retard, tu comptes faire quoi ? ton système ne sera pas temps réel, si rien ne t'oblige à faire du périodique en contrôle de processus, c'est pas mal d'avoir un retard borné quand même.
 
plus sérieusement, tu fais un accumulateur pour l'intégrateur (à 2 compteurs, comme expliqué par Kahan), tu notes la dernière valeur pour la dérivée, tu notes la date à laquelle tu as pris la dernière valeur, et en voiture Simone, out=p+i+d.


---------------
trainoo.com, c'est fini
Reply

Marsh Posté le 08-11-2005 à 14:19:28    

Ou est ce que je peux trouver la formule de Kahan ( algorithme si possible en java).
merci d'avance


---------------
"Placez votre main sur un poele une minute et ça vous semble durer une heure. Asseyez vous aupres d'une jolie fille une heure et ça vous semble durer une minute. C'est ça la relativite." (Albert Einstein / 1879-1955)
Reply

Marsh Posté le 08-11-2005 à 14:27:10    

Reply

Marsh Posté le 08-11-2005 à 14:56:56    

oué, je vais lui filer direct [:roane]
 
tu as ton accumulateur s qui sera l'intégrale du signal de 0 à maintenant, et es, l'erreur lors du dernier calcul de s. s et es sont conservées d'un tour à l'autre.
in c'est la nouvelle valeur de l'entrée, t le temps écoulé depuis la dernière mesure :
 

Code :
  1. float tin = t*in;
  2. float temp = tin - es;
  3. float sPrec = s; // somme au coup précédent
  4. s += temp; // nouvelle somme corrgiée de toutes les erreur précédentes.
  5. es = (s - sPrec ) - temp; // nouvelle erreur


 
s et es auront comme valeur initiale zéro.
 
pour expliquer : quand la somme devient grande, on a la valeur d'entrée qui devient très inférieure à la somme, l'addition perd donc une tonne de bits, si on additionne direct l'ancienne somme avec la nouvelle valeur.
 
on a une estimation de l'erreur au coup précédent, on soustrait cette erreur non pas à la somme (l'erreur est plutôt petite) mais à la valeur d'entrée (qui a une taille plus comparable à l'erreur), puis on ajoute cette valeur "corrigée" à la somme. Ensuite, on calcule l'erreur qu'on a faite lors de cette dernière opération. s - sPrec représente la valeur d'entrée accompagné de l'erreur qu'on a faite lors de in+s (parce que si s>> temp, on a s~sPrec, donc cette soustraction est juste) on soustrait l'erreur précédente (déjà corrigée) et la valeur d'entrée pour retrouver l'erreur faite au dernier coup.
 
voiloù, c'est plus complexe que la simple addition, mais c'est très important, un intégrateur dérive très vite en pratique.


---------------
trainoo.com, c'est fini
Reply

Marsh Posté le 08-11-2005 à 16:56:35    

quand je regarde es il vaut toujours 0 ce qui est logique au vue du code
 
Voila un exemple de mon probleme :
tour 1 : 200 valeurs en stock j'en consomme x1 en t1 (X1 <200)
tour 2 : 250 valeurs en stock j'en consomme x2 en t2 (X2 <250) le stock a augmenté car j'ai eu plus d'apport que de consommé
tour 3 : 220 valeurs en stock j'en consomme x3 en t3 (x3 <220) le stock a diminue car j'ai eu moins d'apport que de consommé
tour 4 : 180 valeurs en stock j'en consomme x4 en t4
tour 5 : 210 valeurs en stock j'en consomme x5 en t5
tour 6 : 210 valeurs en stock j'en consomme x6 en t6
......
 
ce que je cherche c'est à reguler les x consommés pour que mon stock soit quasi nul, et que les x que je consomme ne varie pas trop rapidement car ma sortie (x ) doit etre fluide.
 
J'espere que j'ai reussi à vous presenter mon probleme.
Cordialement.
 
 
 
 


---------------
"Placez votre main sur un poele une minute et ça vous semble durer une heure. Asseyez vous aupres d'une jolie fille une heure et ça vous semble durer une minute. C'est ça la relativite." (Albert Einstein / 1879-1955)
Reply

Marsh Posté le 08-11-2005 à 17:03:08    

heu, tu as utilisé des entiers ???


---------------
trainoo.com, c'est fini
Reply

Marsh Posté le 08-11-2005 à 17:12:29    

non
mais :  
es = (s - sPrec ) - temp;  
avec s = SPrec+temp
on a bien es =0;
 
Une petite question est ce que mon exemple est clair ?
 


---------------
"Placez votre main sur un poele une minute et ça vous semble durer une heure. Asseyez vous aupres d'une jolie fille une heure et ça vous semble durer une minute. C'est ça la relativite." (Albert Einstein / 1879-1955)
Reply

Marsh Posté le 08-11-2005 à 17:12:29   

Reply

Marsh Posté le 08-11-2005 à 17:27:43    

oui, mais là on est dans le monde de la précision limitée, comme sPrec >> in (car l'intégrale est très suppérieure à la valeur) on a une grosse perte de précision dans l'addition. Donc toutes les égalitées n'en sont pas.
 
C'est par exemple à cause d'un truc comme ça (enfin, approchant) qu'un partriot a raté un scud irakien.


---------------
trainoo.com, c'est fini
Reply

Marsh Posté le 08-11-2005 à 17:32:28    

http://forum.hardware.fr/hardwaref [...] tm#t563814
un exemple de perte de précision.


---------------
trainoo.com, c'est fini
Reply

Marsh Posté le 08-11-2005 à 17:46:24    

en fait, si j'insiste sur cette formulation de l'intégrale, c'est pas pour pinailler.
 
Le coefficient intégral de la correction sert à corriger les très petites erreurs de position dans le système (souvent des frottements et jeux). Il ne s'agit donc pas d'avoir une intégrale fausse, vu qu'elle est justement destinée à corriger de petites variations.


Message édité par nraynaud le 08-11-2005 à 17:46:51

---------------
trainoo.com, c'est fini
Reply

Marsh Posté le 09-11-2005 à 00:50:44    

dans :  
 
float tin = t*in;  
float temp = tin - es;  
float sPrec = s; // somme au coup précédent  
s += temp; // nouvelle somme corrgiée de toutes les erreur précédentes.  
es = (s - sPrec ) - temp; // nouvelle erreur
 
 
Je ne vois pas l'intégrale ?
Est ce que je peux te telephoner mercredi dans la matinée ??
merci
 
 
 
 

Reply

Marsh Posté le 09-11-2005 à 01:19:17    

[:rofl]


---------------
Hey toi, tu veux acheter des minifigurines Lego, non ?
Reply

Marsh Posté le 09-11-2005 à 07:54:58    

l'integrale c'est le s ??


---------------
"Placez votre main sur un poele une minute et ça vous semble durer une heure. Asseyez vous aupres d'une jolie fille une heure et ça vous semble durer une minute. C'est ça la relativite." (Albert Einstein / 1879-1955)
Reply

Marsh Posté le 09-11-2005 à 10:45:17    

[:rofl]
 
oui, l'intégrale de 0 à maintenant de l'entrée c'est le s.


Message édité par nraynaud le 09-11-2005 à 10:46:24

---------------
trainoo.com, c'est fini
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed