WinFuture-Forum.de: Fakultät Berechnen! Nck - WinFuture-Forum.de

Zum Inhalt wechseln

Nachrichten zum Thema: Entwicklung
Seite 1 von 1

Fakultät Berechnen! Nck ...con Bernoulliketten


#1 Mitglied ist offline   ps915 

  • Gruppe: aktive Mitglieder
  • Beiträge: 1.119
  • Beigetreten: 17. Mai 07
  • Reputation: 0
  • Geschlecht:Männlich

geschrieben 08. April 2008 - 22:30

Hallo,
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
0

Anzeige



#2 Mitglied ist offline   ps915 

  • Gruppe: aktive Mitglieder
  • Beiträge: 1.119
  • Beigetreten: 17. Mai 07
  • Reputation: 0
  • Geschlecht:Männlich

geschrieben 08. April 2008 - 22:37

edit: habe nun dieses hier geprüft:

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

0

#3 Mitglied ist offline   Slasher2k 

  • Gruppe: aktive Mitglieder
  • Beiträge: 442
  • Beigetreten: 07. Januar 02
  • Reputation: 0
  • Geschlecht:Männlich
  • Wohnort:Sachsen

geschrieben 08. April 2008 - 22:41

Also ich bin schon länger aus der Schule aber ich würde erst die Klammer ausrechnen - also 3 und daraus die Fak. berechnen

Gruß Slasher2k
0

#4 Mitglied ist offline   ps915 

  • Gruppe: aktive Mitglieder
  • Beiträge: 1.119
  • Beigetreten: 17. Mai 07
  • Reputation: 0
  • Geschlecht:Männlich

geschrieben 08. April 2008 - 22:45

Okay da hast du recht, hätte ich auch selber drauf kommen können^^... nur wie bekomme ich das nun in eine Funktion hinein?
0

#5 Mitglied ist offline   Slasher2k 

  • Gruppe: aktive Mitglieder
  • Beiträge: 442
  • Beigetreten: 07. Januar 02
  • Reputation: 0
  • Geschlecht:Männlich
  • Wohnort:Sachsen

geschrieben 08. April 2008 - 22:56

Also wenn PHP nicht selber so schlau ist und die Klammer berücksichtigt wirst du - wenn ich mir das jetzt mal groß überlege - wohl den String analysieren müssen. Sprich: strstr, str_replace

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
0

#6 Mitglied ist offline   Diewie 

  • Gruppe: aktive Mitglieder
  • Beiträge: 409
  • Beigetreten: 18. Juni 06
  • Reputation: 0
  • Geschlecht:Männlich
  • Wohnort:Geisenhausen / München

geschrieben 09. April 2008 - 11:29

Hi,

also die Formeln sind im allgemeinen alle korrekt, außer

Toasterfraktion sagte:

P(2 Erfolge) (5 über 2)*2,5^2*(1-2,5)^(5-2)

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.

<?php

/*
 * 	Berechnung von Fakultät und Binomialkoeffizienten
 * 
 *		Autor: Stefan Diewald ([email protected])
 *		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;
}

?>
oder auch hier: http://pastebin.com/f5d049c07

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

0

#7 Mitglied ist offline   Slasher2k 

  • Gruppe: aktive Mitglieder
  • Beiträge: 442
  • Beigetreten: 07. Januar 02
  • Reputation: 0
  • Geschlecht:Männlich
  • Wohnort:Sachsen

geschrieben 09. April 2008 - 18:40

Also so gern wie ich dir helfen würde, aber diese Mathematik ist mir dann doch zu heftig. Da fällt mir wieder ein warum ich damals meine Prüfungen in der Vektorrechnung gemacht habe. Also wenn du dein eigenes Script verstehst hast du meine tiefste Anerkennung :-)

Gruß Slasher2k
0

#8 Mitglied ist offline   ps915 

  • Gruppe: aktive Mitglieder
  • Beiträge: 1.119
  • Beigetreten: 17. Mai 07
  • Reputation: 0
  • Geschlecht:Männlich

geschrieben 09. April 2008 - 22:31

Ich verstehs :-P

und damit nochmal vielen vielen Dank an Diewie!!!

Haste gut gemacht. :-)
0

Thema verteilen:


Seite 1 von 1

1 Besucher lesen dieses Thema
Mitglieder: 0, Gäste: 1, unsichtbare Mitglieder: 0