iterative Berechnung
Naps
- php
Hi,
ich hab da ein kleines Problem, und zwar möchte ich ein Programm welches ich in Excel habe in PHP umsetzen...
In Excel kann man unter den eigenschaften die "iterative berechnung" aktivieren.
Die Berechnung schaut so aus:
FELD1 = FELD3
FELD2 = -2*log*((2.51/(188077*FELD1^(1/2)))+(1/3.71)*(0.0004/0.15));
FELD3 = (1/FELD2)^2
um das ganze zu berechnen geb ich in Excel in das FELD1 z.B. 0.002 ein. Excel berechnet mir dann FELD2 und FELD3.
Dann kann ich im FELD1 eingeben dass es gleich dem FELD3 ist, und Excel rechnet solange bis sie übereinstimmen.
Nur wie kann ich das ganze jetzt in PHP umsetzen? Ich wär schon über ein paar Ansätze sehr dankbar.
LG Naps
Nur wie kann ich das ganze jetzt in PHP umsetzen? Ich wär schon über ein paar Ansätze sehr dankbar.
Nebst Exponenten (die du in PHP mit bcpow() umsetzt) und Logarithmen (log() in PHP) und ein paar Platzhaltern sehe ich das jetzt nix kompliziertes
Deine Felder sind Variablen - nur darfst du sie natürlich nicht so verknüfen, weil du sonst eine endlosschleife erhälst.
Du musst einfach prüfen welches deiner Eingabe Felder leer (mit einer Verzweigung) und dann die nötigen Formel (funktionen) durchackern).
Tach!
Nur wie kann ich das ganze jetzt in PHP umsetzen? Ich wär schon über ein paar Ansätze sehr dankbar.
Nebst Exponenten (die du in PHP mit bcpow() umsetzt) und Logarithmen (log() in PHP) und ein paar Platzhaltern sehe ich das jetzt nix kompliziertes
Wenn bcpow(), dann doch besser generell BC Math, also wenn man die hohe Genauigkeit benötigt. Ansonsten gibts auch pow().
dedlfix.
Nur wie kann ich das ganze jetzt in PHP umsetzen? Ich wär schon über ein paar Ansätze sehr dankbar.
Nebst Exponenten (die du in PHP mit bcpow() umsetzt) und Logarithmen (log() in PHP) und ein paar Platzhaltern sehe ich das jetzt nix kompliziertes
Von dem her habe ich keine Probleme
Deine Felder sind Variablen - nur darfst du sie natürlich nicht so verknüfen, weil du sonst eine endlosschleife erhälst.
Du musst einfach prüfen welches deiner Eingabe Felder leer (mit einer Verzweigung) und dann die nötigen Formel (funktionen) durchackern).
Ich hab eher das Problem bei der schleife....
Ich hätte es so gemacht:
while($Lmbda1 !== pow((1/$Lmbda2),2)) {
if(empty($Lmbda2)) { $Lmbda2 = 0.02; }
$Lmbda2 = -2*log((2.51/(188077*pow($Lmbda1,0.5)))+(1/3.71)*(0.0004/0.15));
}
MfG
Naps
Hallo Naps,
while($Lmbda1 !== pow((1/$Lmbda2),2)) {
ich vermute mal, dass du so eine Endlosschleife hast.
Bei Iterationen gibt man sich normalerweise eine maximale Abweichung vor, und wenn die Abweichung des aktuellen Wertes von Endwert kleiner als die maximale Abweichung ist, ist man fertig.
Leider ist der Endwert meistens nicht bekannt, daher behilft man sich damit, dass man nur die Änderung vom i-ten zum (i+1)-ten Wert mit der der maximalen Abweichung vergleicht und so ein Abbruchkriterium hat.
Dass das recht gut funktioniert, zeigt das Iterieren der Summe über 1/(n^2). Dagegen versagt das Verfahren kläglich bei der Summe über 1/n
Gruß, Jürgen
Hi,
also ich bin jetzt so weit dass alles funktioniert und es hört auch an der richtigen Stelle auf nur sind da ein paar Sachen die ich nicht verstehe:
$wert = 0.000001;
$Lmbda1 = 0.02;
$Lmbda3 = 0.021;
while(round($Lmbda1, 4) !== round($Lmbda3, 4)) {
$Lmbda2 = -2*log10((2.51/(189253*pow($Lmbda1,0.5)))+(1/3.71)*(0.0004/0.15));
$Lmbda3 = pow((1/$Lmbda2),2);
$Lmbda1 = $Lmbda1+$wert;
}
Wenn ich so lange rechnen würde bis $Lmbda1 und $Lmbda3 identisch sind würde es ewig dauern, also hab ich sie aufgerundet auf 4 Kommastellen:
while(round($Lmbda1, 4) !== round($Lmbda3, 4))
Ich habe das ganze mit mehren Kommastellen versucht und irgendwie ist das Ergebnis nur richtig wenn ich es mit 4 Kommastellen mache, aber wieso?
Sollte es nicht immer genauer werden?
Danke,
MfG
Naps