Nullstelle einer math. Funktion berechnen

Hallo liebe Leute
Ich habe ein kleines Problem… Und zwar habe ich folgende, mathematische Funktion:

Nun würde ich gerne mit PHP die Nullstellen dieser Funktion berechnen.
Für y=2 ist es eine quadratische Funktion, das ist kein Problem.
Aber für alle anderen y?

a, b, c sind bekannt
y ist bekannt und eine beliebige Zahl >0
x ist zu bestimmen (2 Nachkommastellen)

Hat jemand eine Idee, wie das zu bewerkstelligen ist, ohne sich in einer unendlichen Schleife an den Wert heran zu tasten?

Ist leider ziemlich wichtig; geht um meine Bachelor-Arbeit… :neutral_face:
Vielen Dank im Voraus!

Wenn du das als Bätscheler-Arbeit schreiben sollst, solltest du an der Uni doch eigentlich Kurse
besucht haben, wo man sich damit beschäftigt hat, wie man sowas grob macht.

Für einige Funktionen gibt es analytische Formeln.
Ansonsten macht man das numerisch, da kann man einfach mal einen Blick bei wikipedia
riskieren, wenn man sonst keine Ahnung hat (gibt natürlich bessere Quellen, falls man Ahnung hat ;o):
de.wikipedia.org/wiki/Nullstelle … ullstellen
Ganz einfach wäre etwa die Regula falsi oder das Newton-Verfahren oder ein Intervallschachtelungsverfahren.
Es kann auch nützlich sein, sich die Funktion hinzumalen, um zu gucken, welches Verfahren
sich am besten eignet oder um sich einen Bereich oder Startwerte für das Verfahren
auszugucken, wo es sich lohnt, solch ein Miniprogramm drauf loszulassen, welches das
numerisch löst.
Unter Umständen, wenn es mehrere Nullstellen gibt, kann es auch notwendig sein, Verfahren
zu kombinieren, bei der Intervallschachtelung etwa eine hinreichend feine Unterteilung in
Anfangsintervalle hernehmen, so daß in jedem maximal eine Nullstelle zu finden ist. Dann
untersucht man jedes Intervall einzeln.
Ähnliches muß man immer bedenken, wenn bei dem Verfahren steht, daß es voraussetzt, daß
es nur eine Nullstelle gibt.
Man sollte sich bei numerischen Verfahren genau angucken, wie es um die Konvergenz
bestellt ist und ob die zu untersuchende Funktion da eventuell dafür sorgen könnte, daß das
Verfahren nicht konvergiert.

Für eine Bätschelor-Arbeit solltest du vielleicht eine graphische Ausgabe mit PHP+SVG
zusammenbasteln und dann eine Auswahl, mit welchem Verfahren und welchen Startwerten
man da loslegen möchte. Zur Kontrolle könnte man dann wieder mit PHP+SVG eine
Vergrößerung der gefundenen Stelle darstellen.

Braucht man die Numerik hingegen blind irgendwo als Unterprogramm automatisch
funktionierend, muß man natürlich etwas improvisieren und analysieren, um zu gucken, daß
das Programm auch alle Nullstellen findet und sich nicht aufhängt - oder zumindest erstmal
eine Warnung ausgibt, wenn aus irgendwelchen Gründen keine Lösung gefunden wurde oder
zuviele Schritte zu keinem Ergebnis geführt haben.

Hallo hoffman
Vielen Dank erst mal für deine Antwort!

Nur um das von vornherein klar zu stellen: Ich studiere weder Mathemathik noch Informatik oder dergleichen. :wink:

Mein Mathe-Wissen stammt noch aus dem Gymnasium und PHP ist ein Hobby von mir, deshalb ist mein Wissen auf beiden Gebieten begrenzt.

Genau so sieht das bei mir aus. Die oben erwähnte Formel kommt in einer Tabelle (mit bis zu 100 Werten) zum Einsatz und soll jeweils für zwei Werte (a und b, c=b-a) das dazugehörige x bestimmen. Deshalb wäre wohl eine möglichst rechenkapazität-schonende Herangehensweise ideal… So wie ich es beim kurz Durchschauen gesehen habe, beruhen aber alle deine Vorschläge auf ein Sich-Herantasten (=u.U. viele Rechenzyklen), oder?
Eigentlich hatte ich so die leise Hoffnung, dass es da etwas einfacheres gibt…

Welche der vorgeschlagenen Rechen-Methoden würdest du anwenden, um eine Funktion im Stil von

zu programmieren? (Wobei die Funktion immer dieselbe ist und von dem her eigentlich nicht mitgegeben werden muss)

Da y offenbar keine natürliche Zahl sein muß (beliebig = reell?) kommen da offenbar die speziellen
Verfahren für Polynome nicht allgemein in Frage.
Für einige y gibt es analytische Lösungen, für andere muß man zwangsläufig irgendein
Näherungsverfahren wählen.

So müßte man dann nochmal angucken, ob eventuell nur Nullstellen auf einem bestimmten Bereich
eine Bedeutung haben oder ob man wirklich alle braucht und ob sich das Problem bei den
Parametern a, b und c weiter einschränken läßt - solche zusätzlichen Informationen helfen ja
immerhin festzulegen, wo man überhaupt gucken will.
Auch wenn die Funktion eine inhaltliche Bedeutung hat oder das x in der Formel, kann man auch
besser abschätzen, wo es sich lohnt zu gucken.

Rein mathematisch und allgemein formuliert bleibt einem da aber nur etwas auszuprobieren.
Solch eine Intervallschachtelung ist etwa recht simpel zu machen, braucht aber viele
Iterationsschritte, weswegen eines der anderen Verfahren mit weniger Iterationsschritten
auskommt, so oder so wird man je nach Funktion und gewünschter Genauigkeit sicher mit
5 bis 20 Schritten rechnen müssen.
In den wikipedia-Artikeln steht ja bei den einzelnen Verfahren drin, wo welche Probleme
auftreten können. Je nachdem, wie die Funktion aussieht, wählt man eines der Verfahren.
Die Formel sieht ja relativ einfach aus, kann also sein, daß die ohnehin immer konvex oder
konkav ist, dann wird man mit jedem der Verfahren schnell zum Ziel kommen.
Bei so einer Arbeit würde ich dazu raten, verschiedene Verfahren auszuprobieren und zu
vergleichen - da kann man dann ja auch in der Arbeit anhand der Ergebnisse etwas dazu
schreiben, warum sich dieses oder jenes Verfahren für das Problem besser eignet als ein
anderes.

Verschiedene Verfahren verschiedener Qualität gibt es zum einen aus historischen Gründen,
aber auch, weil die schnellen Verfahren oft auch anfälliger für Probleme sind, also nur unter
besonderen Umständen gut funktionieren. Andere funktionieren fast immer, sind dafür aber
recht langsam.

Obgleich PHP ja nun nicht wahnsinnig schnell ist, sollte das wohl ausreichen, um solch ein
einfaches Problem zügig zu lösen, von der Rechenleistung her sollte das keine nennenswerten
Probleme geben - und wenn es mit der einen Methode nun 1 Millisekunde dauert und mit dem
anderen 3, so ist der Unterschied ja nicht zwangsläufig relevant, wenn die Datenübertragung
zwischen server und browser und der Seitenaufbau im browser schon längern dauern ;o)

Wenn du wie vorschlagen mit einer graphischen Darstellung das Problem auf ein konvexes
oder konkaves Intervall eingrenzen kannst, nimmst du eben etwa den Newton oder die regula
falsi - wird dann schon hinhauen.
Ein allgemein und schnell funktionierendes Verfahren ohne manuelle Vorauswahl hingegen wirst
du kaum hinbekommen, wenn du dich nicht selbst in die Thematik einliest.

Wenn du an der Uni keine Grundkurse in Mathematik hast, in was machst du denn deinen
Bätscheler - Philosophie? Sport? Sprachen? Und wozu dann solche Probleme lösen?

Der Nutzer hoffmann hat eigentlich schon alles gesagt und mit dem ganzen Zaun gewedelt. Du bringst du besten Antworten im Forum. Aber vielleicht kann ich einen kleinen Denkanstoß geben, da du ja wahrscheinlich beide Lösungen für x suchst.
Zunächst würde ich nach dem Minimum / Maximum suchen (je nachdem, ob die Kurve mit den ersten beiden Werten fallend oder steigend ist) und dann vom Minimum (soforn Minimum < 0; bei Maximum umgekehrt) in beide Richtungen mit dem Newton-Verfahren (meines Wissens nach das leichteste Verfahren) die Nullstellen suchen. Das ginge auch verdammt schnell, denn bei beiden hast du logarithmische Laufzeit (sehr schnell für viele Werte).

Hallo zusammen

Vielen Dank erst mal für eure Hilfe so weit, ich bin nun doch schon ein Stück weiter.

[quote=„hoffmann“]Wenn du an der Uni keine Grundkurse in Mathematik hast, in was machst du denn deinen
Bätscheler - Philosophie? Sport? Sprachen? Und wozu dann solche Probleme lösen?[/quote]
Nun ja, ich hatte gehofft, ich könne euch mit Details verschonen, aber da du scheinbar neugierig bist… :p
Ich mache den Bachelor in Multimedia Arts (Digital Film & Animation) und befasse mich dabei mit der viralen Verbreitung Videos im Internet.
Mein konkretes Problem dabei ist: Ich weiss wieviele Views ein Video am Tag X und am Tag Y hatte. Ich weiss auch, wie viele Tage zwischen X und Y waren (im Idealfall 1, ansonsten wird das ganze noch ungenauer). Ich nehme an, dass pro Tag 1 Verbreitungszyklus durchlaufen wird. Nun will ich wissen, wie gross der „virale Koeffizient“ ist (>1 wäre dann eine virale Verbreitung).

Ich habe mich entschieden, nach diesem Vorgehen zu arbeiten:
http://www.forentrepreneurs.com/lessons-learnt-viral-marketing
Konkret geht es um diese Formel:
http://html.slidesharecdn.com/viralmarketingforinboundmktgsummit-novideos-110915154506-phpapp01/output018.png?1316222030

Wobei jetzt in meinem Fall beduetet:
Custs (0) = Views am Tag X
Custs(t) = Views am Tag Y
K = Koeffizient = gesucht
t = Anzahl Tage zwischen X und Y
ct = Cycle Time, also wie viele Tage ein Verbreitungszyklus benötigt (Von mir angenommen: 1)

Die obige Formel habe ich nun also umgebaut zu:

oder vereinfacht:

Da mich nur Nullstellen >= 0 interessieren (es gibt keine negativen Views), heisst das für die Werte:
a (= Custs(0)) >= 0
b (= Custs(t)) >= a -> b >= 0
c (= Custs(t)-Custs(0)) >= 0
y > 1 (und ja, beliebig = reell, sorry für die Ungenauigkeit)
x >= 0

Ich habe nochmal genau drüber geschaut, in Excel mit Newton herumgespielt und habe bezüglich Nullstellen >= 0 herausgefunden:
[ul]
[li]Entweder habe ich zwei Nullstellen, eine davon ist x=1, die andere ist die gesuchte[/li]
[li]Oder dann fallen die beiden Nullstellen zusammen und ich habe nur x=1[/li][/ul]

Deshalb habe ich mir folgendes Vorgehen überlegt:
Ich führe den Newton 2x durch,
[ul]
[li]einmal mit Startwert 0.5, für alle Nullstellen zwischen 0 und 1[/li]
[li]einmal mit Startwert 5 (z.B.), für alle Nullstllen grösser als 1[/li][/ul]
Erhalte ich bei beiden Durchgängen dasselbe Resultat (also wahrscheinlich 1), ist dies die einzige Nullstelle
Erhalte ich bei einem der Durchgänge etwas anderes als 1, ist dies die gesuchte Nullstelle.

Klingt dieses Vorgehen für euch mehr oder weniger plausibel? Oder seht ihr irgendwelche Schwierigkeiten?

Danke im Voraus!

// Edit:
Habe mal eine Funktion gebastelt. Denkt ihr das geht so?

[code]function newton($p, $q, $y, $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 - (X^y - p*x + q)/(y*X^(y-1)-p)
	$x0 = $x0 - ( (pow($x0, $y) - $p*$x0 + $q) / ($y*pow($x0, $y-1) - $p) );
	
	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
	}
}

return $x0;

}[/code]

Also so auf die Schnelle:

Erstmal vereinfacht sich deine Formel zu
a x^y + bx - (b+a) = 0
oder aber mit anderen Parametern

f(x) = ax^(z+1)-ex +(e-a) =0

mit a, e, z größer gleich 0.

Das ist schonmal ein Parameter weniger und eine wesentliche Einschränkung.
Da braucht man dann kein Excel etc, um herauszufinden, daß x=1 eine Nullstelle ist ;o)
Bei einem Polynom würde man da jetzt eine Polynomzerlegung beginnen und das
Restpolynom untersuchen - auf die Schnelle habe ich jetzt nicht gesehen, daß
man (x-1) aus der Funktion als Faktor herausziehen kann, wäre nützlich, wenn
das ginge, wenn nicht, muß man so weitermachen.

Dann also erstmal genauer gucken und auch die Steigung oder Ableitung beachten,
bevor man da in die Numerik einsteigt.
Die Ableitung ist a(z+1)x^z -e

Insbesondere liegt bei x=1 eine mehrfache Nullstelle vor, falls
a(z+1)-e=0, sonst nicht.

Falls nicht:
Ist a(z+1)=0, so gibt es keine weitere Nullstelle.
Falls nicht:
Nun kann man versuchen herauszufinden, ob die Ableitung das Vorzeichen wechselt
(von 1 aus gesehen gibt es vorher keine Nullstelle), das passiert gegebenenfalls bei
a(z+1)x^z -e =0
oder x^z = e/(a(z+1))
Da e, a, z größer gleich 0 sind, kann man die Wurzel ziehen:
also x_m=(e/(a(z+1)))^(1/z).

Berechne f(x_m) = ax_m^(z+1)-ex_m +(e-a)

Ist 0 < x_m < 1, so
rechnet man aus f(0) = e-a.
Ist (e-a)*f(x_m) kleiner als 0, so
gibt es also im Intervall 0 bis x_m eine Nullstelle, Startwert für
die Iteration wäre dann also in dem Intervall.
Sonst wird die Nullstelle erst für einen negativen x-Wert auftreten und
man braucht nicht danach zu suchen.

Bleibt dann noch die Möglichkeit 1 < x_m
Und da denke ich, kann man das numerische Verfahren laufenlassen,
solange es jenseits von x_m sucht.
Also auch den Startwert für die Iteration jenseits von x_m wählen.

Hallo Hoffmann
Wow, vielen Dank! Für das, dass du deinen Post mit den Worten „Also so auf die schnelle“ begonnen hast, ist er doch ziemlich ausführlich geworden :wink:

Nun ja, als ich dann von Excel die ganze Zeit x=1 als Lösung bekam und dem auf den Grund gehen wollte, sah ich dann auch, dass ich das wohl schon früher hätte bemerken können räusper :unamused:

Ich glaube, ich habe fast alles verstanden, von dem was du geschrieben hast (zum Glück war ich im Gymnasium nicht allzu schlecht in Mathe… :p ). Nur etwas habe ich nicht ganz verstanden, was du mit dem hier in der Klammer sagen willst:

[quote=„hoffmann“]
Nun kann man versuchen herauszufinden, ob die Ableitung das Vorzeichen wechselt
(von 1 aus gesehen gibt es vorher keine Nullstelle)[/quote]

Aus deiner Anleitung habe ich mir mal ein Flussdiagramm gebastelt, zum besseren Verständnis (s. Anhang). Dort bin ich auch nochmals auf eine kleine Unsicherheit gestossen (in rot eingezeichnet):
Was heisst das für mich konkret, wenn f(0)*f(x) nicht negativ ist? Heisst das, es gibt wieder nur eine für mich relevante Lösung >=0, nämlich x=1?

Danke nochmals, du hast mir wirklich sehr geholfen :wink:

ps: was bist du eigentlich von Beruf, dass du das alles (noch) so gut im Kopf hast?

Zu ‘(von 1 aus gesehen gibt es vorher keine Nullstelle)’:
Man weiß ja, daß zum einem x_1=1 eine Nullstelle ist, zum anderen die Funktion für x>0 stetig
differenzierbar (und im nicht trivialen Falle nicht überall 0). Ist nun x_2 eine von x_1 verschiedene
Nullstelle, so weiß man, daß dazwischen ein Extremum liegen muß, also die Ableitung eine
Nullstelle hat. Wie sich zeigt, hat die Ableitung nur maximal eine Nullstelle, nennen wie die x_m.
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.

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.

Zu dem roten Bereich: Weil x < 0 nicht interessiert, reicht es also zu gucken, ob zwischen
x_1 und 0 eine Nullstelle ist, das bekommt man mit f(0)*f(x_m) heraus - ist das Produkt
positiv, liegen beide auf der gleichen Seite der x-Achse, wegen Stetigkeit und weil es nur noch
maximal eine weitere Nullstelle gibt, gibt es dazwischen also keinen x-Wert, wo die Achse
geschnitten wird, also keine Nullstelle (bei mehreren Extrema müßte man etwas anders vorgehen).
Für den Bereich kann man dann etwa x_m/2 als Startwert nehmen.

Bei deiner Funktion weiter oben sollte es wohl $i<=20 heißen, sonst läuft die Schleife nicht
durch …
Einige andere Sachen hätte ich da auch anders formuliert, aber das ist Geschmacksache.
In einer müßigen Viertelstunde habe ich mal testweise ein PHP-Skript (ohne Flußdiagramm und
ohne die Funktion graphisch anzugucken) gebastelt - und das funktioniert mit Newton gut,
meist nur ein paar Iterationsschritte.
Für sowas bekommt man einen Batschelör? ;o)
Da hätte ich das ja auch noch nebenbei studieren können ;o)

Beruf - ich bin Experimentalphysiker, Stoßphysik, Atom- und Molekülphysik.
Solche Rechnereien sind also eigentlich nicht das, womit ich mich täglich herumschlage.
Ich schreibe aber natürlich auch Programme oder Skripte, um meine Experimente zu simulieren
und um theoretische Ergebnisse (von anderen) mit meinen experimentellen Ergebnissen zu
vergleichen. Dagegen ist dies Problem schon noch so überschaubar, daß man das mit ein paar
Schmierzetteln nebenbei gelöst bekommt.
Bei meinen Programmen geht es also eher um das Auswerten von Zählstatistiken, das Fitten
von Daten, also unter anderem auch um das Finden des Minimums einer mehrdimensionalen
Funktion (die nur also Datensatz vorliegt, wo man leider analytisch gar nichts machen kann.
Da rumpeln Rechner mit mehreren Prozessoren dann oft wochenlang herum, bis etwas
Glaubwürdiges herauskommt - zum Glück haben die im Rechenzentrum reichlich Rechner
zur Verfügung, die man mit solchen Problemen füttern kann). Inhaltich geht es dabei darum,
Atom-Atom-Potentiale für angeregte Zustände zu untersuchen und dann schließlich per
Fit zu verbessern, was andere Leute so mit ihren Programmen bloß berechnet haben, was
ohne Hilfe von Experimenten nicht besonders gut stimmt (sind die Grundlagen der Chemie,
also alles nicht so genau, was da mit Rechnern geschätzt und genähert berechnet wird).

Ansonsten könntest du dir für deine Arbeit die Frage stellen, ob die Funktion selbst
überhaupt plausibel ist. Wenn ich das Problem richtig verstanden habe, ist es doch möglich,
für C(t) viele Werte zu bekommen, wenn man länger beobachtet.
Es wäre also naheliegend, C(t) zu fitten, um zu prüfen, wie plausibel die Modellfunktion ist
(man muß ja nicht alles glauben, was andere einem für Formeln vor die Nase setzen ;o)
Selbst wenn man bei der Modellfunktion bleibt, sollte ein fit mit vielen Wertepaaren C(t) ein
besseres Ergebnis liefern als eine Anpassung an nur C(0) und ein C(t).

Realistische Wachstumsfunktionen sollten ja irgendwann in eine Sättigung gehen oder aber
mehr oder weniger regelmäßig oszillieren, weil die Ressourcen begrenzt sind.
Solch einfache Funktionen ergeben da oft nur einen Sinn für die Anfangszeiten, wo die
Ressourcenbegrenzung keine Rolle spielt.

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 :wink:

[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 :p
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 :neutral_face:

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 :wink:
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 :wink:

Wie immer danke ich dir schon mal herzlich im Voraus, du bist mir eine grosse Hilfe :slight_smile:

Du solltest bei solchen Diskussionen nicht mittendrin die Bezeichnungen und Notationen
ändern. Vor allem solltest du nicht vermuten, daß ich im Detail das Problem selbst verstehe.
Eine Fehlinterpretation meinerseits kann da also leicht dazuführen, daß ich inhaltlich Dinge
vermute, die nicht deinem Kenntnisstand entsprechen.
Von daher ist es natürlich viel einfacher, ein mathematisch formuliertes Problem praktisch zu lösen,
statt erstmal ein Problem sauber mathematisch zu formulieren ;o)

Daher frage ich nochmal nach:
C(t) entspricht dem ‘New views’?
Und ‘Total views’ ist die Summe der früheren ‘New views’?
Ist ‘daily views’ das Gleiche wie ‘New views’?

Diese ‘views’ sind offenbar immer nicht negative ganze Zahlen, also diskrete Ereignisse, die
erstmal für die Zählung als unabhängig voneinander anzusehen sind? Beziehungsweise das
K (beziehungsweise in der mathematische Formel das x) soll eine Korrelation der Ereignisse
beschreiben?

Wenn das so ist, scheint mir deine Strategie mit der Nullstellensuche nicht sonderlich geeignet
zu sein, um solche Datensätze statistisch zu bekandeln und da Informationen herauszuziehen.
Bei deiner Nullstellensuche verwendest du nur zwei Meßdaten C(0) und ein C(t), hast aber
um die hundert Meßdaten. Soll die Funktion nun für alle Meßdaten gelten und nur für einen
Teil davon? Wenn es für alle gelten soll, sollten doch auch alle Daten dazu beitragen, die
Parameter der Modellfunktion festzulegen und nicht zu zwei willkürlich ausgewählte.
Ist nur ein Teil der Daten relevant, braucht man die anderen ja nicht betrachten, da muß der
ermittelte Parametersatz der Modellfunktion ja auch gar nicht passen.

Strategievorschlag, um sich zu veranschaulichen, ob die Modellfunktion was mit den Daten
zu tun hat oder ob man aus den Daten überhaupt relevante Aussagen mit der Modellfunktion
treffen kann:
Beim Zählen von Ereignissen gilt eine sogenannte Zählstatistik, ähnelt meinem Experiment, wo
ich auch Ereignisse zähle, bei mir eben das Eintreffen von einzelnen Atomen in einem Detektor.
Hat man jedenfalls C Ereignisse gezählt, gilt näherungsweise eine Unsicherheit von C^(1/2) als
Unsicherheit einer solche Zählung (bleibt ein C(t) nach der Zählung zufällig 0, kann man als
Unsicherheit vereinfachend 1 annehmen). Damit bekommt man jedenfalls für jeden Meßpunkt
C(t) einen Fehlerbalken.
Bei der Zählerei kann es extreme Ausrutscher geben - in deinem Falle könnte einen Dozent
am Tag A seine Zuhörer gebeten haben, auf die fragliche Seite zu gucken, die Auswirkungen
können für den Tag dramatisch sein und müssen nicht repräsentativ für den typischen
Verlauf der Daten sein. Solche Ausreißer eignen sich dann nicht, für die statistische Betrachtung
des ‘normalen’ Verlaufs.

Soll nun eine Modellfunktion f diese Messung repräsentieren, so kann man erstmal gucken,
ob diese Funktion so verläuft, daß sie bei etwa Zweidrittel der Meßpunkte innerhalb der
Fehlerbalken verläuft und bei etwa einem Drittel außerhalb liegt.
Dann ist die Lage schon mal ganz gut und Modellfunktion, Meßpunkte und Fehlerbalken
könnten zusammenpassen. Liegt nicht etwa ein Drittel außerhalb, so sind die Fehlerbalken
zu groß, was darauf hinweisen kann, daß die einzelnen Meßwerte stark korreliert sind, obige
Abschätzung mit der Wurzel also nicht paßt. Liegt die Kurve allerdings bei deutlich mehr als
einem Drittel der Meßpunkte außerhalb der Fehlerbalken, sollte man die Modellfunktion in
Zweifel ziehen, die taugt vermutlich nichts.
Hat man nun einzelne Meßpunkte, die weitab der Ausdehnung benachbarter Fehlerbalken
liegen, man hat aber gute Anhaltspunkte, daß das betrachtete Phänomen keine solch
dramatischen singulären Punkte hat, kann man eventuell einen Ausreißer vermuten und den
testweise oder unter Vorbehalt für die Bewertung oder folgendes Verfahren ausschließen.

Paßt innerhalb der Fehlergrenzen nichts zusammen, kann man das Gebiet der hohen Kunst
des Fittens betreten - erstmal sucht man sich eine andere plausible Modellfunktion mit möglichst
nicht zu vielen Parametern, die man anpassen muß. Dann bastelt man sich ein kleines
Programm, was den Fit macht, wobei man als Gewichtungsfaktoren für jeden Meßpunkt das
Quadrat des Fehlers nimmt.
Den Gewichtungsfaktorgeteilt durch die Summe aller Gewichte muß man dann bei der Methode
der kleinsten Quadrate zum jeweiligen Summanden hinzumultiplizieren, um die Größe des
Fehlerbalkens richtig zu berücksichtigen. So kann man mit der so modifizierten Methode der
kleinsten Quadrate versuchen, eine optimale Parameterkombination zu finden.
Das ist dann ein Minimierungsproblem, bei dem man versucht, das absolute Minimum einer
Funktion zu finden.
Zumindest bei einem nichtlinearen Fit passiert es häufig, daß mehrere Minima vorhanden sind,
daher ist es nicht einfach, das absolute Minimum zu finden.
Daher gibt es da wieder zahlreiche Verfahren, unter denen man je nach Problemstellung wählen
kann. Automatisch läuft solch ein komplexer Fit meist nicht mehr, sondern man guckt immer,
ob ein gefundenes Minimum jetzt wirklich plausibel ist oder ob es noch ein kleineres Minimum
geben kann. Dies ‘Gucken’ ist allerdings bei einigen Verfahren auch weitgehend automatisierbar,
etwa bei genetischen Algorithmen.

Zusammenfassend für dich:
Erstmal Fehlerbalken und die Funktion als Ergebnis deiner Nullstellensuche einmalen und
gucken, was mit deinem Datensatz los ist, das vorzeigen und dann kann man weiterdiskutieren,
was man am besten macht.
Das hängt ja auch von der Fragestellung deiner Arbeit ab, sollst du untersuchen, ob die
Modellfunktion einen Sinn ergibt oder sollst du allgemein untersuchen, ob es plausible
Modelle gibt, die das Phänomen plausibel beschreiben oder soll auch herausgefunden werden,
unter welchen Umständen solch eine einfache Modellfunktion das Problem brauchbar beschreibt?
Um weiterzukommen, ist es jedenfalls sinnvoll, wenn du die nächste Teilaufgabe präzise
formulierst, die du lösen willst, gilt natürlich auch für die Gesamtaufgabe, sofern das nicht
bereits passiert ist - im Laufe solch einer Arbeit kann es natürlich auch passieren, daß man
die Aufgabenstellung variieren muß, falls sich die ursprüngliche nicht als hilfreich oder relevant
herausstellt - man sollte dann gegebenenfalls auch überzeugendes Datenmaterial vorzeigen,
um diese Standpunkt vertreten zu können.

Könnte auch sein, daß deine Daten zu stark rauschen (zu kleine Zählraten), als daß man daraus
dramatische Erkenntnisse gewinnen kann, außer daß die Daten stark rauschen ;o)
Wenn du Datensätze hast, wo deutlich mehr Ereignisse drinstehen, könnte du vielleicht erstmal
die einfachsten mit den meisten Ereignissen vorziehen, um zu sehen, ob die sich gemäß deiner
Vermutungen verhalten.
Da es ja deine Arbeit ist, dachte ich mir, ich fange jetzt nicht an, das selber durchzunudeln und
zu gucken, was da los ist - aber ich gucke es mir natürlich gerne an, wenn du Graphiken hast,
wo man solche Sachen vergleichen/beurteilen kann.

Wow, ich bin immer wieder überrascht (und natürlich dankbar), wie viel Aufwand du dir beim Beantworten meiner Fragen machst :wink:

Ok sorry, das war vielleicht nicht ganz klar ausgedrückt. Da die Resultate, die mein php ausspuckt, auch für Nicht-Mathematiker verständlich sein sollen, und es in meiner Arbeit eigentlich auch nicht um Mathe geht (dazu später), habe ich das dort ein bisschen anders formuliert. Da haben wir also
[ul]
[li] % on Chart: Am besten ignorieren. Das sind die eigentlichen Daten, die ich bekomme, und die ich nachher in Views umrechne.[/li]
[li] Total Views: Entspricht der totalen Zahl an Views bis zum angegebenen Zeitpunkt, also c(t)[/li]
[li] New Views: Entspricht der Anzahl Views, die seit dem letzten Datenpunkt hinzugekommen sind, also c(t)-c(t-1). Wird eigentlich zum Rechnen nicht benötigt, einfach nur als Info.[/li]
[li] K daily: Ist der Koeffizient K, auf Basis des vorhergehenden Datenpunktes c(t-1) und des jetzigen Datenpunktes c(t). Also K mit c(0) = c(t-1)[/li]
[li] K total: Ist der Koeffizient K, auf Basis des ersten überhaupt verfügbaren Datenpunktes c(0) und des jetzigen Datenpunktes c(t). Hierbei wird also das eigentliche c(0) am Zeitpunkt 0 verwendet.[/li][/ul]

Ich hoffe, das ist jetzt so klar geworden. Wieso das für mich so Sinn macht, dann noch später. Aja, und “daily” und “new” ist somit dasselbe, das stimmt.

[quote=“hoffmann”]Diese ‘views’ sind offenbar immer nicht negative ganze Zahlen, also diskrete Ereignisse, die
erstmal für die Zählung als unabhängig voneinander anzusehen sind? Beziehungsweise das
K (beziehungsweise in der mathematische Formel das x) soll eine Korrelation der Ereignisse
beschreiben?[/quote]
Ja genau. Deshalb habe ich gesagt, a und e (bzw. c(0) und c(t)) sind immer positiv.
Ja, eigentlich sind das alles einzelne Ereignisse, die nur insofern zusammenhängen, als das eine Person das Video sieht (=1 View) und an seine Freunde (=K*1 neue Views?) weiterleitet. Und hier kommt eben K ins Spiel, das beschreiben soll, wieviele neue Views aus einem View hervorgegangen sind.

[quote=“hoffmann”]Soll die Funktion nun für alle Meßdaten gelten und nur für einen
Teil davon?[/quote]
Genau das ist mein Problem. In der Realität kann sich ein Video ja folgendermassen Verbreiten:
[ul]
[li] Tag 0-10: Praktisch keine Views[/li]
[li] Tag 10-20: Virale (exponentielle) Verbreitung[/li]
[li] Tag 20-30: Praktisch keine zusätzlichen Views, ev. Sättigung[/li][/ul]

Da das aber (für mich) zu kompliziert wäre, um in eine einzige Formel zu bringen, will ich nur folgendes wissen:
[ul]
[li] Tag 0-10: Nich viral (z.B. K = 0.01)[/li]
[li] Tag 10-20: Viral (z.B. K = 1.1)[/li]
[li] Tag 20-30: Nicht viral (z.B. K = 0.2)[/li][/ul]

Am Ende will ich also über ein Video eine der folgende Aussagen machen können:
[ul]
[li] Das Video hat sich zu keinem Zeitpunkt viral verbreitet[/li]
[li] Das Video hat sich zwischen Tag X und Tag Y viral verbreitet mit K = …[/li]
[li] Das Video hat sich durchgehen viral verbreitet mit K = …[/li][/ul]

Aus diesem Grund habe ich mein Script so gebaut, dass es mir immer das jeweilige K zwischen den Datenpunkten ausspuckt. Das K total macht eigentlich für Videos, die sich nicht durchgehend viral verbreitet haben, nicht so viel Sinn. Dennoch haben mich die Resultate erstaunt: Meine Erwartung war, dass z.B. bei einem Video mit dem obigen Verhalten ein K-total-Wert von weit weniger als 1 herauskommt. Schliesslich läuft ja an 20 von 30 Tagen nicht viel. Bei dem Beispiel aus meinem letzten Post war jedoch das Gegenteil der Fall: Die K-daily-Werte waren meist relativ tief, aber dennoch ergab sich über die ganze Zeit gesehen ein relativ hoher K-total-Wert, was eben nicht meiner Erwartung entsprach, und wofür ich hoffte, dass du eine Erklärung hast…
Kurz gesagt, meine Erwartung war:

  • grösstenteils kleine K-daily-Werte = kleiner K-total-Wert
  • viele hohe K-daily-Werte = hoher K-total-Wert
    Aber vielleich mache ich da einen Denkfehler…

Was ich im Script vielleicht noch einbauen werde, ist, dass es mir die Einteilung in Zeitabschnitte automatisch macht. Also z.B. wird ein neuer Abschnitt begonnen, wenn sich K_daily(t) um 0.2 von K_daily(t-1) unterscheidet.

Wie du siehst, ist dein Ansatz zwar sehr interessant, geht aber viel zu weit :wink:

Die Fragestellung meiner Arbeit hat auch fast nichts mit Mathe zu tun: Ich will in der Arbeit herausfinden, welche Bedingungen (inhaltliche Elemente, Verbreitungs-Taktiken, etc.) für ein virales Video erfüllt sein müssen, und ob ich so eine Verbreitung für ein Video auch ohne Budget schaffe. Dafür muss ich natürlich als erstes bereits existierende, virale Videos untersuchen. Und hier kommt das Script ins Spiel: Es soll mir sagen, ob und wie viral sich ein Video auf Youtube verhalten hat. Es ist nämlich lange nicht alles, was im Volksmund als “viral” bezeichnet wird, auch aus mathematischer Sicht wirklich “viral”. Deshalb reichen mir auch die oben genannten, relativ einfachen Aussagen aus.

Vielen Dank, aber wie du siehst, wäre das vergebliche Leibesmüh gewesen :wink:

Wie schon gesagt, du müßtest dir zu den Daten die zugehörigen Funktionen mit dem
entsprechenden K einmalen, dann kannst du etwa sehen, ob oder wo die die Daten gut
beschreiben.

Ohne solche Visualisierungen fällt es eben schwer zu erkennen, ob da irgendwelche
Werte oder Funktionen plausibel sind oder nicht - oder ob irgendwo noch ein Fehler ist.

Wenn man sich ‘Daily views’ anguckt, könnte man da ja auch mindestens zwei unabhängige
Vorgänge vermuten, also sozusagen einen Erstentdecker mit seinen Gläubigen Nachfolgern
und dann einen Zweitendecker, unabhängig von der ersten Gruppe, welcher das Video neu
entdeckt hat und Anhänger nach sich zieht. Um das Verhalten für beides zusammen zu
beschreiben, könnte man also die Summe von zwei Funktionen mit unterschiedlichen K’s
annehmen, weil die Kontakte in der zweiten Gruppe anders aussehen als in der ersten oder
weil da aufgrund anderer ‘aufregender’ Videos eine andere Konkurrenzsituation herrscht.
Da andererseits das Video offenbar bei der ersten Gruppe bereits nahezu totgeritten ist, als
die Zweitentdeckung folgt, kann man das zweite Ereignis auch näherungsweise als unabhängig
betrachten, dort also ein neues C(0) wählen, um ein K total für diese Gruppe zu bestimmen.

Diese Hypothese der viralen Verbreitung ist hier doch jedenfalls schlecht zu beurteilen, weil
das Interesse bereits wieder nach ein oder zwei Meßpunkten abebbt.
Wenn eine virale Verbreitung stattfindet, dann doch vermutlich in dem Bereich, wo das ‘Daily
views’ rapide ansteigt. In dem Bereich müßte man dann eher öfter (täglich? stündlich?) gucken,
um zu unterscheiden, ob nun besagter Kurs auf Anweisung eines Dozenten gleichzeitig
draufguckt, oder ob die Ereignisse wirklich stattfinden, weil sich die Kunde über das Video wie
bei einer Lawine verbreitet hat - jeder Kursteilnehmer also etwa im Schnitt vier weiteren Leuten
von dem Video berichtet, die sich das dann angucken und das dann jeweils vier weiteren Leuten
empfehlen etc.

So, jetzt hatte ich wieder Zeit zum Basteln… :wink:

Das habe ich jetzt umgesetzt.
Zuerst wird eine neue Tabelle erstellt, in der die Statistik in Abschnitte eingeteilt wird.
Kriterium für einen neuen Abschnitt habe ich zurzeit festgelegt als:
Das aktuelle K daily muss zum vorherigen K daily einen Unterschied von mindestens 20% (vom vorherigen K daily) ausmachen, aber mindestens 0.02.
Das sind einfach mal so Werte, die ein akzeptables Ergebnis geliefert haben… Falls du ein sinnvolleres Kriterium findest, immer gern her damit :wink:
In dieser neuen Tabelle findet man:
[ul]
[li] Number of days: einfach die Anzahl Tage des Zeitraums[/li]
[li] Ø K daily: Das arithmetisches Mittel aller K daily in dem Zeitraum. Erst wollte ich die Kurve anhand von diesem Wert zeichnen, macht aber glaube ich nicht so viel Sinn. Ist somit nur noch zur Information.[/li]
[li] K total for range: Das Totale K über den ganzen Zeitabschnitt. c(0) ist der Endwert (Views total) des letzten Zeitabschnitts. c(t) ist der letzte Wert von Views total in diesem Zeitabschnitt.[/li][/ul]

Das sieht man jetzt gut in der Total Views Grafik:
[ul]
[li] Views: Sind die Total Views[/li]
[li] Approx Daily: Die Annäherung anhand der vorherigen Tabelle mit den K-Abschnitten. Dabei wird bei jedem Abschnitt der erste Wert von den realen Total Views übernommen und die anschliessenden Werte anhand des zum Abschnitt gehörenden “K total for range” berechnet.[/li]
[li] Approx Total: Nimmt den Total Views Wert vom ersten Tag und berechnet die folgenden Werte mit Hilfe des letzten K total in der Haupttabelle.[/li][/ul]

Jetzt sieht man relativ gut, wie genau die jeweiligen Annäherungen sind:
Approx Total ist meist recht weit daneben und stimmt nur am Anfang und am Ende, z.B. hier ein gutes Beispiel: http://deifnet.ch/viper/youtubestats.php?v=xVrJ8DxECbg
Approx Daily: Stimmt hingegen schon einiges besser. Dies ist natürlich auch logisch, da hierbei immer wieder Original-Werte zur Berechnung übernommen werden. Aber ich glaube, als Annäherung reicht mir das, da ich sowieso nicht extrem genaue Daten brauche (bzw. mit diesem Tool sowieso nie erreichen wird).

[quote=“hoffmann”]
Wenn man sich ‘Daily views’ anguckt, könnte man da ja auch mindestens zwei unabhängige
Vorgänge vermuten, also sozusagen einen Erstentdecker mit seinen Gläubigen Nachfolgern
und dann einen Zweitendecker, unabhängig von der ersten Gruppe, welcher das Video neu
entdeckt hat und Anhänger nach sich zieht. […] dort also ein neues C(0) wählen, um ein K total für diese Gruppe zu bestimmen.[/quote]

Das habe ich jetzt glaube ich mit der Abschnitts-Tabelle ziemlich gut visualisiert.

[quote=“hoffmann”]
Diese Hypothese der viralen Verbreitung ist hier doch jedenfalls schlecht zu beurteilen, weil
das Interesse bereits wieder nach ein oder zwei Meßpunkten abebbt.
Wenn eine virale Verbreitung stattfindet, dann doch vermutlich in dem Bereich, wo das ‘Daily views’ rapide ansteigt. In dem Bereich müßte man dann eher öfter (täglich? stündlich?) gucken[/quote]

Natürlich. Ist jetzt auch ein schlechtes Beispiel.
Ja, ich hätte (vor allem im Anfangs-Bereich) auch sehr gerne stündliche Daten, aber leider stellt die Youtube nicht zur Verfügung (oder weiss es selbst nicht)

Denkst du, das Tool macht nun Sinn, so wie es jetzt ist?

Vielen Dank für alles!!

PS: Musste auf die neuen Google Charts umsteigen, da ich bei der alten Version an die Grenzen gestossen bin…

Offenbar ist die Graphik jetzt mit java-script pessimiert, also unter meinen Sicherheitseinstellungen
gar nicht vorhanden, kann ich also nichts zu sagen.
Ich verwende zur Visualisierung meist grace, das kann das Ergebnis dann auch in verschiedene
Formate exportieren, wie EPS, SVG, PNG und das eigene Format läßt sich im Bedarfsfalle leicht
mit einem Texteditor erzeugen oder modifizieren.
Ich vermute einfach mal, das Google/Youtube-Dings taugt nichts, wenn es nicht mal in der Lage
ist, Graphik ohne java-script zugänglich darzustellen ;o)

Ja, ist die Google Charts API, die auf JavaScript basiert…
Die alte Version funktionierte noch anders, dafür war sie limitiert.
Hast du wirklich JS deaktivert bei dir? Oder einfach nur für Scripts, die von anderen Seiten als der aufgerufenen ausgeführt werden?

Bei einem sinnvoll strukturierten Dokument oder Projekt bringt die Nutzung/Aktivierung von
java-script ja allenfalls eine dekorative alternative Darstellung des eigentlichen Inhaltes, daher
braucht man das nicht.
Und wenn man dann keinen Inhalt sieht, ist eben per Definition und Selbstverständnis von
(X)HTML auch kein Inhalt vorhanden - wenn man bei aktiviertem java-script das Gefühl hat, da
sei mehr Inhalt, ist das eine Täuschung, entweder durch den Autor oder eine Selbsttäuschung.

Aus Sicherheits- und Stabilitätsgründen habe ich die Interpretation von java-script schon seit
dem letzten Jahrtausend per Voreinstellung deaktiviert - seitdem sind da zwar viele
Sicherheitslücken bei den Darstellungsprogrammen gestopft worden, nach wie vor ist das aber
wohl eine große Baustelle hinsichtlich Sicherheit und Zuverlässigkeit, wobei letzteres auch von
den Fähigkeiten des Autors abhängen kann, weswegen es da immer ein Problem hinsichtlich der
Stabilität des Darstellungsprogrammes geben wird, wenn man das pauschal auf unbekannten
Seiten interpretieren läßt. Auch der Autor ist nicht allein Quelle von Problemen, denn das ist
immer noch nicht ordentlich spezifiziert, ecma-script stellt nur eine grobe Abstraktion dar, also
letztlich alles nicht ausgereifte und einheitlich implementierte Technik, auch von daher eine
unerschöpfliche Quelle von Problemen.

Nur bei einzelnen, mir bekannten Seiten habe ich das gezielt eingeschaltet.
Meist wende ich mich aber stattdessen lieber von solch skurilen Projekten ab, die keine sinnvolle
Funktion aufweisen, wenn java-script oder flash nicht interpretiert werden ;o)