Brauche Hilfe bei C-Programm



  • Hallo,

    ich habe ein Projekt in dem ich eine Poissonverteilung grafisch darstellen soll.

    Mein Programm an sich funktioniert Problemlos und bei kleinen Erwartungswerten wird die Verteilung auch richtig dargestellt.
    Sobald ich aber eine höheren Erwartungswert eingebe, erhalte ich erstmal eine richtige Verteilung aber wenn der Wert wieder 0 werden sollte, habe ich große Ausschläge (siehe Bilder).

    Meinen Fehler finde ich selbst leider nicht und ich habe auch keine Ahnung an was es liegen könnte.
    Die Funktion führe ich unten auf, die Ergebnisse lege ich in eine Struktur ab und um die Funktion zu zeichnen ( oder um die Tabelle zu erstellen) wird die Struktur wieder ausgelesen.

    Ich hoffe ihr könnt mir irgendwie helfen.
    Mfg Frank

    hier noch ein Link über die Verteilung:
    http://www.poissonverteilung.de/poissonverteilung.html

    Diagramm:
    http://s14.directupload.net/file/d/3082/ssufdnzl_jpg.htm

    Tabelle:
    http://s14.directupload.net/file/d/3082/8uc4vdqi_jpg.htm

    //Fakultät
    int fakult(int i)										//rekursiver Aufruf der Fakultät
    {
    	int x;
    
    	if(i>1)
    	{
    		x=i*fakult(i-1);
    		return x;
    	}
    
    	else return 1.0;
    }
    
    //Berechnung der Verteilungsfunktion
    double verteilungsfunktion (double m, int n)
    {
    	int x;
    	double e1, e2, e3, erg;
    
    	for(x=0; x<=n ; x++)
    	{
    		e1=fakult(x);									//aufrufen der Fakultätsfunktion
    		e2=pow(m,x);									//aufrufen der Potenzfunktion (in math.h abgelegt)
    		e3=exp(-m);										//aufrufen der Exponentialfunktion (in math.h abgelegt)
    
    		erg=(e2 / e1) * (e3);
    
    		tbb[x].x = x;
    		tbb[x].erg = erg;
    	}
    
    	return erg;
    }
    


  • Überleg mal welchem Wertebereich ein int hat.
    Meist sind das z.Zt. 32-bit, also geht das von - 231 bis 231-1
    Dann überleg mal welche Wert 12!, 13! oder auch 14! haben.



  • - globale Variablen -> Schrott

    for(x=0; x<=n ; x++)
    {
      ... 
      tbb[x].x = x;
      tbb[x].erg = erg;
    }
    

    sieht schon mal sehr fragil aus, bist du sicher, tbb ausreichend dimensioniert zu haben? Für tbb müssen hierbei mind. n**+1** Elemente definiert sein.



  • frank_90 schrieb:

    Sobald ich aber eine höheren Erwartungswert eingebe, erhalte ich erstmal eine richtige Verteilung aber wenn der Wert wieder 0 werden sollte, habe ich große Ausschläge (siehe Bilder).

    Das liegt wahrscheinlich daran, dass die Fakultät in Integer berechnet und zurückgegeben wird. Das gibt einen Überlauf. Versuchs mal mit Double:

    //Fakultät
    double fakult(double i)                                       //rekursiver Aufruf der Fakultät
    {
        double x;
    
        if(i>1)
        {
            x=i*fakult(i-1);
            return x;
        }
    
        else return 1.0;
    }
    

    Und der Aufruf:

    e1=fakult((double)x);
    

    Das war jetzt erst mal ein Quickhack ... das geht auch schöner 😉

    viele grüße
    ralph



  • Genau lag am Integer. Oh mann da hätte ich auch selbst drauf kommen können. Danke


Anmelden zum Antworten