Fakultät Berechnen! Nck ...con Bernoulliketten
#1
geschrieben 08. April 2008 - 22:30
ich schreibe gerade an einem Script, welches mithilfe von Fakultät (n über k) die Pfade einer Bernoullikette berechnen soll.
Ich lasse mir per POST folgendes liefern:
n = Stufen -> hier 5
k = Erfolge -> hier 2
Jetzt möchte ich gerne die Pfade ausrechnen, die bei einem Baumdiagramm zu zeichnen wären.
Ich würde also im taschenrechner folgendes rechnen: 5C2 = 10 Pfade
Rechnung:
P(k Erfolge) (n über k)*p^k*(1-p)^(n-k)
P(2 Erfolge) (5 über 2)*2,5^2*(1-2,5)^(5-2)
oder ist das nun total falsch?
Mein Ziel soll sein, die Anzahl der Pfade zu bestimmen indem im die Werte n-Strufe und k-Erfolg angebe.
Wer kann mir dabei helfen?
Vielen Dank schonmal
Toasterfraktion
Anzeige
#2
geschrieben 08. April 2008 - 22:37
5!/2!(5-2)! = 10
wobei
5! = 1*2*3*4*5= 120
und
2! = 1*2 = 2
ist.
nur wie rechne ich denn
(5-2)! = ?
aus?
Wenn ich das erstmal kapiert habe, möchte ich das dann in eine Funktion einbetten, die mit Variablen arbeitet.
Dieser Beitrag wurde von Toasterfraktion bearbeitet: 08. April 2008 - 22:38
#3
geschrieben 08. April 2008 - 22:41
Gruß Slasher2k
#4
geschrieben 08. April 2008 - 22:45
#5
geschrieben 08. April 2008 - 22:56
Nun weiß ich nicht wie dein Script im Ganzen aufgebaut ist - als wie machst du die Eingaben, etc.
Wir können uns ja morgen nochmal damit befassen - will jetzt erstmal schlafen :-)
Gruß Slasher2k
#6
geschrieben 09. April 2008 - 11:29
also die Formeln sind im allgemeinen alle korrekt, außer
Toasterfraktion sagte:
da es natürlich keine Wahrscheinlichkeit mit dem Wert 2,5 gibt

Und wie bereits erwähnt wurde, (5-2)! = 3! = 6.
Ich hab' kurz mal Funktionen zur Berechnung der Fakultät und von Binomialkoeffizienten erstellt. Damit du Berechnungen mit großen Zahlen durchführen kannst (wie man sie in Tafelwerken findet), habe ich eine Methode mit BC-Math mit angegeben. Ich habe die Funktionen gleich im Quelltext kommentiert, damit ich hier nicht mehr viel dazu sagen muss. Wenn man PHP und die mathematischen Grundlagen einigermaßen kann, dann dürfte das alles leicht nachvollziehbar sein.
<?phpoder auch hier: http://pastebin.com/f5d049c07
/*
* Berechnung von Fakultät und Binomialkoeffizienten
*
* Autor: Stefan Diewald (php@diewie.net)
* Datum: 09. April 2008
*/
$fak = 150;
echo '<strong>'.$fak.'!</strong><br />';
echo fakultaet($fak);
echo '<br />';
echo '<strong>'.$fak.'! mit BC-Math</strong><br />';
echo bc_fakultaet($fak);
echo '<br /><br />';
echo '<strong>(2.5 über 2)</strong><br />';
echo binKoeff(2.5,2);
echo '<br />';
echo '<strong>(49 über 6)</strong><br />';
echo binKoeff(49,6);
echo '<br /><br />';
echo '<strong>(100 über 49)</strong><br />';
echo binKoeff(100,49);
echo '<br />';
echo '<strong>(100 über 49) mit BC-Math</strong><br />';
echo bc_binKoeff(100,49);
/*
* int binKoeff(int $n, int $k) - Berechnet den Binomialkoeffizient (n über k)
*/
function binKoeff($n, $k) {
if ($n < $k) return -1; // nicht definiert
if ($k == 0) return 1; // ist immer 1, Rechnung ersparen
if ($k < 0) return 0; // ist so definiert
if ($n == $k) return 1; // ist auch immer 1, Rechnung ersparen
$low = $n-$k+1; // in Fakultät-Schreibweise kann man im Zähler (n-k)! kürzen, daher geht Multiplikation nur bie n-k+1
for ($zaehler = $low; $n > $low; $zaehler *= $n--); // n*(n-1)*...*(n-k+1)
return $zaehler / fakultaet($k); // n*(n-1)*...*(n-k+1) / k!
}
/*
* string binKoeff(int/string $n, int/string $k) - Berechnet den Binomialkoeffizient (n über k) mit Hilfe von BC-Math
*/
function bc_binKoeff($n, $k) {
if ($n < $k) return '-1'; // nicht definiert
if ($k == 0) return '1'; // ist immer 1, Rechnung ersparen
if ($k < 0) return '0'; // ist so definiert
if ($n == $k) return '1'; // ist auch immer 1, Rechnung ersparen
$low = bcadd(bcsub($n,$k),1); // in Fakultät-Schreibweise kann man im Zähler (n-k)! kürzen, daher geht Multiplikation nur bie n-k+1
// n*(n-1)*...*(n-k+1)
for ($zaehler = $low; bccomp($n,$low) == 1;) {
$zaehler = bcmul($zaehler,$n);
$n = bcsub($n,'1');
}
return bcdiv($zaehler,bc_fakultaet($k)); // n*(n-1)*...*(n-k+1) / k!
}
/*
* int fakultaet(int $int) - Berechnet die Fakultät int!
*/
function fakultaet($int) {
if ($int < 0) return -1; // nicht definiert
if ($int < 2) return 1; // 0! = 1! = 1
for ($fak = 2; $int-1 > 1; $fak *= $int--); // n*(n-1)*...*2
return $fak;
};
/*
* string bc_fakultaet(int/string $int) - Berechnet die Fakultät int! mit Hilfe von BC-Math
*/
function bc_fakultaet($int) {
if ($int < 0) return '-1'; // nicht definiert
if ($int < 2) return '1'; // 0! = 1! = 1
// n*(n-1)*...*2
for ($fak = '2'; bccomp(bcsub($int,'1'),'1') == 1;) {
$fak = bcmul($fak,$int);
$int = bcsub($int,'1');
}
return $fak;
}
?>
Um die fehlerfreie Funtion zu überprüfen, kannst du hier einige Fakultäten nachprüfen: http://factorielle.f...r/index_en.html
Gleiches kannst du auf der Seite von Arndt Brünner auch für die Binomialkoeffizientenberechnung prüfen: http://www.arndt-bru...s/binkoeff1.htm
Die Implementierung des Bernoulli-Prozesses dürfte nun kein Problem mehr darstellen. Das einzige was beachtet werden muss, ist dass man für die BC-Math Variante wieder die BC-Funktionen verwendet, also auch bcpow() statt pow(), usw.
Ich hoffe damit kommst du weiter, ansonsten helfe ich gerne weiter.
Gruß,
Stefan
P.S. Keine Garantie, dass meine Funktionen in jedem Fall korrekt arbeiten.

Dieser Beitrag wurde von Diewie bearbeitet: 09. April 2008 - 11:40
#7
geschrieben 09. April 2008 - 18:40
Gruß Slasher2k
#8
geschrieben 09. April 2008 - 22:31
und damit nochmal vielen vielen Dank an Diewie!!!
Haste gut gemacht. :-)