PDA

View Full Version : [c++] integrazione numerica? come si fa?


vermaccio
14-03-2006, 09:41
sto implementando un sistema di controllo a controreazione con blocchetti integratori "1/s" in c++ (se non capite di che parlo è lo stesso: andate avanti a leggere):

c'è una funzione y=f(x) di cui NON conosco l'equazione MA conosco che valore (chiamiamolo y) assume ogni tempuscolo dt=64millisecondi.

quindi
t=0 ---> y1
t=64 -->y2
t=128 --y3

Non mi pare che in c++ esista una funzione per integrare (o sbaglio)?


Io devo trovare quanto vale l'integrale della funzione in quegli stessi tempuscoli (t=0, t=64,....) ma tenendo conto che va fatto in tempo reale.

Ad esempio se voglio l'integrale al tempuscolo t=128 io conosco

t1=0 e relativo y1=3
t2=64 e relativo y2=2
t3=128 e relativo y3=4

-------------|
-|-----------|
-|----|------|
-|----|------|
t1----t2----t3

come calcolo integrale(t1-->t3)????


mi è venuto in mente di farlo con le aree.

tra t1 e t2 prendo un area avente base 64 (il tempuscolo) e come altezza "la media tra y1 e y2" ovvero tra y1=3 e y2=2 cioè altezza 2.5

quindi area(t1-->t2)=64*2.5

Poi faccio la stessa cosa tra t2 e t3 dove l'area avrà altezza "la media tra y2 e y3" ovvero tra y2=2 e y3=4 cioè altezza 3

quindi area(t2-->t3)=64*3

quindi integrale(t1-->t3)=area(t1-->t2)+area(t2-->t3)=
=64*2.5+64*3


Posso fare in questo modo?
Oppure è un metodo spuntato, grezzo e c'è un altro modo migliore per farlo in c++?

shinya
14-03-2006, 10:38
Cerca "Numerical Recipes in C" su google. E' un libro distribuito gratuitamente, ed è la bibbia per quanto riguarda i metodi numerici. Mi pare di ricordare un capitolo sui metodi di integrazione (Simpson e via discorrendo se la memoria non mi fa cilecca).

sottovento
14-03-2006, 10:47
Cerca "Numerical Recipes in C" su google. E' un libro distribuito gratuitamente, ed è la bibbia per quanto riguarda i metodi numerici. Mi pare di ricordare un capitolo sui metodi di integrazione (Simpson e via discorrendo se la memoria non mi fa cilecca).
Posso sbagliarmi, ma non e' distribuito gratuitamente.
Ad ogni modo, e' un libro che non puo' mancare nella biblioteca di un informatico, a maggior ragione di un controllista.

Tornando al problema: sicuro che ti serva davvero? Il controllo che stai implementando e' praticamente un pid, l'integrazione proposta dovrebbe essere piu' che sufficiente. A meno che questo sia parte di un controllo piu' ampio...


High Flying
Sottovento

vermaccio
14-03-2006, 11:05
io ho fatto una cosa del genere
//INTEGRAZIONE GRAFICA AD AREE

//faccio integrale di dotx (=x) e sommare a x precedente per avere nuovo x
//1)calcolo l'areola tra questa interazione e la precedente
integrale_dotx=MILLISECONDI*((dotx-dotx_precedente)/2);
//2)poi devo sommare a tute le areole precedenti già oltrepassate per avere integrale totale
x=x+integrale_dotx;

cionci
14-03-2006, 11:28
Con i trapezi ?

http://it.wikipedia.org/wiki/Regola_del_trapezio

vermaccio
14-03-2006, 12:17
si. è quella che ho usato io. la regola dei trapezi. non me ne ricordavo il nome e l'ho chiamata "metodo delle aree" hehehe

crick_pitomba
14-03-2006, 12:31
da quello che ricordo dall'esame di analisi numerica, i metodi di integrazione ti consentono di calcolare una stima di un integrale definito a partire da una funzione.

nel tuo caso non hai una funzione da integrare quindi hai due strade

1)interpoli i dati in una funzione e calcoli l'integrale della funzione ottenuta con i metodi dell'analisi numerica

2)calcoli, come hai giustamente pensato, di fare l'integrale come somme di aree. imho quesa è la soluzione che fornisce risultati più accurati. ovviamente se puoi diminuire ulteriormente il valore dell'intervallo ottieni risultati sempre più accurati

Del resto il processo di integrazione secondo riemann è proprio un calcolo di rettangoloidi facendo tendere la base a zero...

cionci
14-03-2006, 12:37
1)interpoli i dati in una funzione e calcoli l'integrale della funzione ottenuta con i metodi dell'analisi numerica
Infatti il metodo dei trapezi fa un'interpolazione unendo due punti in cui è definita la funzione con una retta...