PDA

View Full Version : C++: calcolo numerico e funzioni statistiche


KRYHAWOK
18-10-2002, 02:06
Ciao gente!
Qualche tempo fa vi avevo chiesto una mano per il calcolo dell'area sottesa dalla distribuzione normale standardizzata di probabilità, qui:

http://forum.hwupgrade.it/showthread.php?s=&threadid=328371


Risolto quel problema, se ne presentano altri più incasinati, ma simili: sevo sempre trovare una formula di approssimazione per le probabilità delle distribuzioni t-Student, F-Fischer, Chi-quadro... il problema è che ognuna è una FAMIGLIA di distribuzioni che dipende da 1 o da 2 parametri (i gradi di libertà)... e il guaio è proprio trovare un sistema (magari analogo a quello che ho usato nel thread di sopra) per coprire la più ampia casistica possibile col minor numero di righe di codice (ossia senza costringermi a ricopiare le matrici coi valori numerici già calcolati......)

Grazie!!!!

cionci
18-10-2002, 10:02
Se devi trovare l'area sottesa (l'integrale del modulo) da quelle formule ci sono tanti modi...
Sicuramente esistono metodi di integrazione numerica che permettono di calcolare il risultato...

E' questo che ti serve...fammi sapere che ti spiego 3 metodi....

KRYHAWOK
18-10-2002, 15:45
Per il calcolo dell'ERF standardizzata ho utilizzato il teorema di integrazione per serie applicato all'equazione della gaussiana, che è un'esponenziale. Ma l'espressione delle distribuzioni che ho citato prima dovrebbero richiedere la conoscenza delle trasformate, che in analisi B non ho fatto.
Se aggiungi il "dettaglio" che non ho l'esame di calcolo numerico, l'unico metodo di approssimazione che conosco (x gli integrali definiti) è proprio l'integrazione per serie.

Ti sarei grato se mi dicessi almeno qualche altra strategia d'integrazione numerica implementabile in C++.

tnx

cionci
18-10-2002, 17:02
Si basano tutti e 3 sullo stesso principio...
Ciò partizionare una porzione dell'asse X in N parti...

Supponiamo di voler calcolare l'integrale fra 10 e -15 di una gaussiana centrata in 0 (che d'ora in poi chiamerò f)...

I tre metodi che conosco (più probabile dire che mi ricordo) danno 3 approssimazioni sempre migliori...

- metodo dei rettangoli
- metodo dei trapezi
- metodo delle parabole

Metodo dei rettangoli

s = -15
Suddividi l'asse X in parti di ampiezza a = (10+15)/N...

Somma per i che va da 0 a N-1 di (f(s + i*a)*a)...

Immaginati di congiungere di tracciare una parallela all'asse Y in ogni punto della suddivisione dell'asse X... Quando incontri la curva tracci un segmento di retta fino a quando non raggiungi la parallela successiva...
Ecco...in pratica non si fa altro che calcolarsi l'area dei rettangoli che ottieni in qesto modo...

E' un'approssimazione grossolana, ma per N che tende ad infinito tende all'integrale...

Metodo dei trapezi

Come prima, ma traccia una retta fra il punto di incorntro di una parallela con la retta ed il punto di incontro con la retta della parallela successiva...
In pratica ottieni dei trapezi...

Somma per i che va da 0 a N-1 di ((f(s + i*a) + f(s + (i+1)*a))*a/2)...che è la sommatoria dell'area di quei trapezi...

Metodo delle parabole

Questo me lo ricordo meno, ma si tratta di calcolare l'aria sottesa dalla parabola che passa per tre punti di incontro successivi di parallele e curva...
C'è una formula ben precisa per trovarsi la parabola che passa per tre punti, ma non me la ricordo...stessa cosa per l'area sottesa da una parabola...

Ovviamente il più preciso è il emtodo delle parabole...ma se N è abbastanza grande allora sono pressochè equivalenti...

KRYHAWOK
18-10-2002, 18:26
Ok, provo a fare qualche tentativo in questa direzione.

Nel frattempo, più semplicemente, non sai se posso trovare su qualche sito una libreria apposita (C++) con le funzioni di probabilità già implementate (finora non ho trovato nulla del genere)?

/\/\@®¢Ø
18-10-2002, 21:38
Purtroppo non sono piu' riuscito a trovare il libro di cui parlavo nell'altro thread (ma porc... :mad: ), comunque cionci ti ha dato le stesse indicazioni.
Se non hai trovato niente e' perche' sei pigro :D :p.
Prova a cercare numerical integration c++ library con google... ;).

Io ho trovato "Numerical Recipes", c'e' anche una versione on-line
(http://www.ulib.org/webRoot/Books/Numerical_Recipes/bookcpdf.html)
il quarto capitolo (scaricabile in pdf) e' quello che riguarda l'integrazione.
Se non sbaglio e' possibile scaricare anche del codice gia' pronto
( in C pero', la versione C++ la puoi solo comperare :( )

verloc
01-11-2002, 05:59
Qui c'è esattamente quello che cerchi,ma non so quanto il tutto sia compatibile con il tuo compilatore.

http://netlib.org/cephes/

Un saluto a Cionci e Marco :)

KRYHAWOK
02-11-2002, 13:51
Grazie a tutti per l'aiuto. Ora devo dare la precedenza a qualche altro esame... appena ho tempo per rimettermi sotto con quel programma di statistica ci risentiamo!

bye