Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
Username: Password: oppure
C# / VB.NET - c# statistica - distribuzione normale
Forum - C# / VB.NET - c# statistica - distribuzione normale

Avatar
systemgvp (Normal User)
Expert


Messaggi: 296
Iscritto: 14/04/2008

Segnala al moderatore
Postato alle 23:20
Mercoledì, 11/08/2010
salve,

vorrei sapere se esiste in C# (.net 4) la funzione statistica di distribuzione normale che in Excel viene usata come:

DISTRIB.NORM(x;media;deviazione;cumulativo)
DISTRIB.NORM(10;15;4;1)=0,11

e anche l'inversa

INV.NORM(probabilità;media;deviazione)
INV.NORM(0,2;15;4)=12

PM Quote
Avatar
Il Totem (Admin)
Guru^2


Messaggi: 3635
Iscritto: 24/01/2006

Segnala al moderatore
Postato alle 9:53
Giovedì, 12/08/2010
No. Devi scrivertela tu:
Codice sorgente - presumibilmente C# / VB.NET

  1. Dim DistribNorm = Function(x, m, d) Math.E ^ ((x - m)^2 / (-2d^2)) / (Math.Sqrt(2 * Math.PI) * d)


PM Quote
Avatar
systemgvp (Normal User)
Expert


Messaggi: 296
Iscritto: 14/04/2008

Segnala al moderatore
Postato alle 16:04
Giovedì, 12/08/2010
la formulazione che hai scritto non va bene perchè fornisce il valore esatto solo nel caso in cui il cumulativo vale false, mentre se vale true , che è quello che serve a me, rappresenta l'integrale di questa funzione da meno infinito a "X".

Come posso fare quindi un'integrale?

PM Quote
Avatar
systemgvp (Normal User)
Expert


Messaggi: 296
Iscritto: 14/04/2008

Segnala al moderatore
Postato alle 22:54
Giovedì, 12/08/2010
pre la distribuzione normale ho risolto con:

class Integrale
{
    public delegate double Function(double x);
    //declare a delegate that takes and returns double
    public static double integral(Function f, double a, double b, int step_number)
    {
        double sum = 0;
        double step_size = (b - a) / step_number;
        for (int i = 0; i < step_number; i = i + 2)
        {   //Simpson algorithm samples the integrand in several point which significantly improves //precision.
            sum = sum + (f(a + i * step_size) + 4 * f(a + (i + 1) * step_size) + f(a + (i + 2) * step_size)) * step_size / 3;
            //divide the area under f(x)     //into step_number rectangles and sum their areas
        }
        return sum;
    }
}

//....................

public static double funzione(double x)
{
   double d = 4;
   double m = 15;
   return Math.Exp(-1*Math.Pow(x-m,2)/(2*d*d))/Math.Sqrt(2*Math.PI*d*d);

}

e sull'evento:

Console.WriteLine(Integrale.integral(new Integrale.Function(funzione), 0, 10, 200));


Mentre per l'inversa normale non riesco nemmeno a trovare la formulazione!

PM Quote