So, das ganze scheint nun zu funktionieren! Danke dir!
[quote=„hoffmann“]x_1 und x_m geben somit eine Richtung vor, in der die Nullstellen liegen wird.
Also, sofern es x_2 gibt entweder x_1 <= x_m <= x_2 oder .x_1 >= x_m >= x_2.[/quote]
Ok, das habe ich verstanden, in dem Fall war mir nur deine Formulierung nicht ganz klar…
[quote=„hoffmann“]Da dich die Funktion für x < 0 nicht interessiert, beziehungsweise die Funktion pow dort für die
meisten Werte von z auch problematisch ist, solltest du also bei deinem Programm vorsorgen,
daß der Newton nicht versehentlich bei pow einen Wert kleiner als 0 einsetzt, also etwa
eine Fallunterscheidung machen, die für x < 0 immer f(0) und f’(0) zurückgibt statt pow zu
berechnen.[/quote]
Das habe ich zuerst nicht verstanden, da ich es seltsam fand, einfach die Iterations-Werte zu verändern. Nachdem aber meine Funktion ohne Negativ-Filter Fehler geliefert hat, habe ich nochmals darüber nachgedacht. Nun ist mir aber klar geworden, dass jeder Iterationsschritt eigentlich für sich alleine steht (unabhängig ist davon, der wievielte Schritt dass es ist) und somit der Eingabe-Wert auch verändert werden kann. Da keine negativen Werte benötigt werden, ist es somit auch nicht sinnvoll, die Iteration dort laufen zu lassen. Seitdem ich negative Werte durch 0 ersetze, funktioniert die Iteration.
Ich nehme an, das hast du auf den Bereich zwischen 0 und 1 bezogen, oder?
Ich verwende jetzt den Startwert x_m/2 für Werte <1 und x_m+($xm - 1) für Werte >1.
Natürlich hast du recht, danke. Ich habe die Funktion noch nicht getestet gehabt.
Falls du noch andere, gröbere Verbesserungen siehst; ich bin immer froh um Feedback 
[quote=„hoffmann“]Für sowas bekommt man einen Batschelör? ;o)
Da hätte ich das ja auch noch nebenbei studieren können ;o)[/quote]
Jaja, heute bekommt man für alles einen Bachelor 
Das mit nebenbei studieren bezweifle ich allerdings ein bisschen; nicht wegen der benötigten Fähigkeiten, sondern wegen dem Zeitaufwand. Die Aufgaben und Arbeiten fressen leider ziemlich viel Zeit 
Dachte ich mir doch, dass du im mathematisch/naturwissenschaftlichen Bereich tätig bist. So problemlos und präzis, wie du deine Antworten aus dem Ärmel schüttelst 
Klingt interessant was du da machst!
Ja natürlich ist das eine gute Frage. Vor allem auch bezüglich der Sättigung. Aber wie du bereits gesagt hast, ist es ein Modell. Wie ich das auf die Realität anwenden kann, bin ich noch am herausfinden. Meine Idee war es, jeweils Zeitabschnitte zu untersuchen und dort jeweils zu schauen, ob sich das Video in dieser Zeit viral verbreitet hat. Allerdings bin ich gerade etwas irritiert. Ich berechne zurzeit für jeden Tag X (bzw. je nach Datenmenge ist die Zeitspanne auch mehr als ein Tag) zwei Werte:
[ul]
[li] K daily: Aus der Anzahl Total-Views vom Tag X und dem Vortag X-1[/li]
[li] K total: Aus der Anzahl Total-Views vom Tag X und dem allerersten Tag, der Views erhalten hat[/li][/ul]
An einem Beispiel veranschaulicht:
http://deifnet.ch/viper/youtubestats.php?v=UGW_CFvB51k
Was mich jetzt irritiert ist, dass K daily und K total so unterschiedliche Aussagen machen.
Schaut man sich K daily an, würde man sagen, das Video hat sich nicht sonderlich gut verbreitet. K total bewegt sich jedoch immer relativ nahe an 1, was für eine gute Verbreitung sprechen würde. Hast du vielleicht eine Idee, wie sich diese beiden Aussagen vereinen lassen?
Die Funktionen sehen inzwischen folgendermassen aus (gemäss vorherigem Floatchart erstellt):
[code]<?php
[…]
if ($key > 1) // Calculate Viral K only for 2nd date and following
{
$viral_k_day = format_viral_k(calc_viral_k($view_perc_arr[$key-1][‚views_tot‘], $view_perc_arr[$key][‚views_tot‘], $time_diff_days));
$viral_k_tot = format_viral_k(calc_viral_k($view_perc_arr[1][‚views_tot‘], $view_perc_arr[$key][‚views_tot‘], ($time_diff_days*($key-1))));
}
[…]
function calc_viral_k($cust0, $custT, $t, $round_dec=4) // Calculate the viral coefficient K as good as possible (with help of Newton’s method)
{
global $viral_cycletime;
$a = $cust0;
$e = $custT;
$z = $t / $viral_cycletime;
// f(x) = ax^(z+1)-ex +(e-a) = 0
// f'(x) = a(z+1)x^z - e
if ($a == $e) // No new Views => K=0
{ return 0; }
if ($a*($z+1) - $e == 0) // There is only one zero (=1) because f(x) has only one extremum
{ return 1; }
if ($a*($z+1) == 0) // There is only one zero (=1) because f'(x) is linear
{ return 1; }
$xm = pow($e / ($a*($z+1)), (1/$z)); // Calculate X-value of extremum of f(x)
if (!($xm>0 and $xm<1)) // There is no extremum between 0 and 1, which means that there is no zero between 0 and 1, but >1
{
$x0 = $xm + ($xm - 1); // Create start value for iterations. Assume that extremum is in center between two zeroes
$nfx = newton($a, $e, $z, $x0, $round_dec); // Calculate zero with Netwon's method for $x > 1
if ($nfx !== false) // Newton returned value
{ return $nfx; }
else // Error in Newton
{ return 'Error'; }
}
else // There is an extremum between 0 and 1, which means that there is a zero between 0 and 1
{
$fxm = $a*pow($xm, $z+1) - $e*$xm + ($e-$a); // Calculate Y-value for $xm in f(x)
$f0 = $e-$a; // Calculate Y-value for x=0 in f(x)
if ($fxm*$f0 < 0) // Does f(x) has a change of sign between 0 and $xm (there is a zero between $xm and 0)?
{
$x0 = $xm / 2; // Create start value for iterations. Assume that extremum is in center between two zeroes
$nfx = newton($a, $e, $z, $x0, $round_dec); // Calculate zero with Netwon's method for $x < 1
if ($nfx !== false) // Newton returned value
{ return $nfx; }
else // Error in Newton
{ return 'Error'; }
}
else // There is no other zero >0, only x=1
{ return 1; }
}
}
function newton($a, $e, $z, $x0, $round_dec=4) // Find zeroes with Newton’s method
{
$x0_prev = 0;
for ($i = 0; $i<=20; $i++) // Make 20 iterations max.
{
// Xn+1 = Xn - f(x)/f'(x) => Xn+1 = Xn - (ax^(z+1)-ex +(e-a))/(a(z+1)x^z - e)
$x0 = $x0 - ( ($a*pow($x0, $z+1) - $e*$x0 + ($e-$a)) / ($a*($z+1)*pow($x0, $z) - $e) );
if (round($x0, $round_dec) == $x0_prev) // Run until precision in round_dec reached
{ break; }
else
{
$x0_prev = round($x0, $round_dec);
if ($i == 20) { return false; } // Failed after 20 iterations
}
if ($x0 < 0) { $x0 = 0; } // Filter negative values for $x0 (set to 0). Negative values are no possible solutions and cause issues with pow()
}
return round($x0, $round_dec);
}
?>[/code]
Falls du noch Verbesserungen siehst, immer her damit 
Wie immer danke ich dir schon mal herzlich im Voraus, du bist mir eine grosse Hilfe 