Hallo Community,
ich habe gerade ein Problem mit Matlab.
Gegeben ist eine Liste mit Dezimalzahlen im Floatingpoint Format. Sie
umfasst 400 Elemente. Es sind eigentlich Funktionswerte, von denen ich
jetzt den Mittelwert berechnen möchte. Dabei ist es wichtig, dass NICHT
der Mittelwert gebildet wird durch Aufaddieren der Punkte und Teilen
durch die Anzahl! Ich möchte die Punkte gerne als Funktion Interpolieren
(linear!) und davon dann den Mittelwert berechnen. Der dürfte sich ja
von dem auf Basis der Punkte unterscheiden.
Die Berechnung mit "mean" funktioniert ja ganz gut, aber ich befürchte,
der addiert und teilt danach... man kann doch in Matlab auch Funktionen
definieren, ableiten, integrieren usw. Da gibt's doch sicherlich auch
eine Funktion, sodass ich von meiner mithilfe von "interp1()" erstellte
Funktion den Mittelwert bilden kann! Ich habe bereits Google betätigt,
werde aber nicht fündig. Mean bezieht sich offensichtlich nur auf
einzelne Punkte in Arrays/Vektoren.
Kennt jemand eine (vernünftige) Dokumentation von Matlab oder kann mir
direkt helfen? Die Matlab-Hilfe ist schlichtweg nicht zu gebrauchen...
arbeite normalerweise mit Python, da bin ich gute Dokumentationen
gewohnt.
Vielen Dank im Voraus!
kludwig
Hallo,
also wenn ich dich richtig verstanden habe liegen deine Daten
folgendermaßen vor:
[ 0 3 6 9 12 15 .... ]
und du möchtest jetzt einen Mittelwert (oder vlt. den Median?).
Wie liegen denn deine Werte vor? Sind diese äquidistant?
Hier kannst du mal nachschauen welchen Mittelwert du eigentlich suchst.
https://de.wikipedia.org/wiki/Mittelwert#Weitere_Mittelwerte_und_.C3.A4hnliche_Funktionen
Auf Grundlage der von dir gegebenen Informationen kann ich leider nicht
mehr tun.
Hier vlt. mal noch ein Link zu einem Matlab - Forum.
http://www.gomatlab.de/
Ich persönich finde die Doku von Matlab übrigens sehr gut.
Gruß
BT
Ludwig K. schrieb:> Dabei ist es wichtig, dass NICHT> der Mittelwert gebildet wird durch Aufaddieren der Punkte und Teilen> durch die Anzahl!
Das ist aber die Definition eines Mittelwerts
Ludwig K. schrieb:> Ich möchte die Punkte gerne als Funktion Interpolieren> (linear!) und davon dann den Mittelwert berechnen.
Häääh?
Ludwig K. schrieb:> Die Berechnung mit "mean" funktioniert ja ganz gut, aber ich befürchte,> der addiert und teilt danach...
mean macht genau das wie es in der Doku spezifiziert ist. Aus einem
Array von Werten den Mittelwert berechnen.
Was willst du erreichen?
Irgendwie beschreibst du dein Problem deutlich schlechter als die Doku
matlab.
Zunächst mal: Ja, "mean" bildet, wie du richtig annimmst, die Summe über
alle Elemente eines Vektors und teilt anschließend durch die Anzahl der
Elemente.
"interp1" ermittelt anhand der gegebenen x- und y-Werte aus neuen
X-Werten zugehörige Y-Werte: Y = interp1(x, y, X)
Optional kann auch noch eine Methode angegeben werden, die
MathWorks-Homepage weiß da mehr.
Wenn du eine Funktionsgleichung ermitteln willst, könnte dir z.B.
"polyfit" helfen. Du übergibst der Funktion x- und y-Werte sowie den
gewünschten Grad n des Polynoms und bekommst eine Matrix mit n+1
Elementen, den Koeffizienten vor den einzelnen Potenzen von x, zurück.
Es gibt auch noch weitere Fitting-Optionen, bei denen man eine bestimmte
Funktionsgleichung mit Parametern vorgeben kann, die dann an die
vorliegenden Daten angepasst werden, z.B. mittels der Funktion
"lsqcurvefit".
Ludwig K. schrieb:> Die Matlab-Hilfe ist schlichtweg nicht zu gebrauchen...
naja....
ich finde sie sehr gut
ich versteh nicht wieso du nicht aufaddieren und teilen willst? so ist
der mittelwert schlichtweg definiert. wenn du eine lineare regression
durchführst bekommst du einen fehler (siehe least square error).
beim interpolieren lügst du immer was hinzu, und zwar das wissen, wie
die messdaten grundsätzlich verteilt sind.
woher weisst du überhaupt, dass du linear interpolieren musst?
fachlich gesehen finde ich das vorhaben, gelinde gesagt, quatsch.
hier dennoch die befehle dazu:
Frank Meier schrieb:> wenn mein gefühl richtig ist, sind die ergebnisse eh gleich.
Die sind gleich...
Punkte (1, 0), (4, 1), Mittelwert (4+1)/2 = 2.5. Wird jetzt linear
interpoliert so das die Punkte exakt erreicht werden, also m = (4 - 1) /
(1 - 0) = 3, offset = 1 und der Mittelwert der Funktion mit
Arc Net schrieb:> Punkte (1, 0), (4, 1), Mittelwert (4+1)/2 = 2.5. Wird jetzt linear> interpoliert
Er hat aber n Punkte. Will er jetzt abschnittsweise linear
interpolieren, oder über ein Polynom, oder über Splines ???
Ich habe zumindest nicht verstanden was er jetzt will.
das was du eigentlich suchst so weit ich das verstehe, ist eine funktion
oder einen rechenweg wie man eine funktion approximiert... ich denke du
hast dich nur etwas schräg ausgedrückt mit deinem mittelwert... such mal
nach der methode der kleinsten fehlerquadrate (least mean squareroot
oder so auf englisch), die lässt sich sehr gut mit matlab durchführen.
dann verläuft deine funktionskurve auch im mittel durch deine
funktionswerte...
Hi also danke erst mal für die Antworten.
Noch mal genauer: Die Funktionswerte werden, um die Schwankungen einer
Versorgungsspannung zu modellieren in ein Textdokument gespeichert und
nachher in Cadence importiert. Cadence simuliert und berechnet mir dann
Delays vom Low-High Pegel am Eingang einer Digitalen Schaltung zum
Ausgang der Schaltung, die natürlich in Abhängigkeit von der
Versorgungsspannung kleiner oder größer ausfallen, da z.B.
Gatekapazitäten erst geladen werden, bevor ein Transistor umschaltet.
Jetzt möchte ich eine Grafik erstellen, die mir mit den Delays, die ich
erhalten habe gegen die averages aufträgt.
Cadence bekommt zwar nur eine Liste mit ein paar Punkten, verbindet aber
selber die einzelnen Punkte mit Geraden und benutzt dann diese
Zeitfunktion als Versorgungsspannungsverlauf für die Simulation.
Die Grafik, die ich derzeit erhalte kann nicht korrekt sein und ich
vermute deshalb, dass meine Berechnung des "average" nicht stimmt. Bis
jetzt rechne ich wie gesagt die Funktionswerte zusammen und teile dann
durch die Anzahl.
Das würde dann aber übereinstimmen mit einem Spannungsverlauf der immer
eine Zeit lang seinen Wert hält und dann auf den nächsten Wert springt.
Und das ist ja nicht die Annahme, nach der die Delays berechnet wurden.
Ja, da habe ich mich wohl etwas schwammig ausgedrückt. Ich suche
eigentlich eher nach einer Funktion in Matlab, mit der ich erst
integriere und dann durch die Zeitdauer teile- also einem Mittelwert für
eine stetige Funktion, genau so wie Arc Net es geschrieben hat.
Da du von einer "Liste mit Dezimalzahlen" schreibst, gehe ich davon aus,
dass die Liste nur die y-Werte enthält und somit die x-Werte als
äquidistant angenommen werden. Dann ist der Mittelwert der Funktion, die
durch lineare Interpolation zwischen jeweils zwei benachbarten gegebenen
Funktionswerten entsteht, der Mittelwert der einzelnen Funktionswerte,
wobei aber der erste und der letzten Funktionswert jeweils nur halb
gewichtet werden.
In Octave (und damit hoffentlich auch in Matlab) kann man das so
schreiben:
Vielen Dank Yalu X., Frank Meyer und Arc Net,
ihr habt mich überzeugt, konnte mir vorher nicht vorstellen, dass das
wirklich gleich ist. Hab noch mal drüber nachgedacht und der Mittelwert
muss bei beiden Berechnungen gleich sein. Dann liegt mein Fehler wohl an
anderer Stelle!
Ich heul eigentlich in Foren ja nie rum und bin dankbar für jede Antwort
auch wenn sie eventuell nicht weiter hilft, aber jetzt muss es mal kurz
sein: Urschmitt, warum postest du in ein Topic nur um den Fragensteller
bloßzustellen? Wenn du keine Lust auf unpräzise Fragen hast, ignoriere
sie doch bitte einfach. Mit Antworten wie "Hääääh?" ist wirklich
niemandem geholfen.
Allen anderen: vielen Dank!
Ludwig K. schrieb:> konnte mir vorher nicht vorstellen, dass das wirklich gleich ist.
Nein, der Mittelwert der einzelnen Funktionswerte und der Mittelwert der
linear interpolierten Funktion sind i. Allg. verschieden. In meinem
obigen Beispiel ist ersterer gleich 3,75 und letzterer gleich 3,67. Je
größer die Anzahl der Funktionswerte ist, desto geringer wird allerdings
der Unterschied zwischen den beiden Ergebnissen.
Ludwig K. schrieb:> Urschmitt, warum postest du in ein Topic nur um den Fragensteller> bloßzustellen?
Das hast du selbst mit der Formulierung übernommen, ich habe nur
umgangssprachlich zum Ausdruck gebracht daß ich den Sermon nicht
verstehe.
Ludwig K. schrieb:> Mit Antworten wie "Hääääh?" ist wirklich niemandem geholfen.
Es war keine Antwort, sondern eine kurze prägnante Frage. Man kann statt
dessen auch sagen "Wie meinst du das jetzt?". Es will halt nicht jeder
Romane schreiben.
Ansonsten: Schau dir die Netiquette zu Problembeschreibung an.
Und denke daran: Das Problem sitzt manchmal vor der eigenen Tastatur
Ok, hm. Ja die Punkte sind äquidistant. Den Mittelwert berechne ich für
jede Taktperiode, bei mir sind das 8 Punkte die ich für einen Mittelwert
benutze. Dann befasse ich mich morgen mit interp1 und fertig ist. Danke!
Udo Schmitt schrieb:> Ansonsten: Schau dir die Netiquette zu Problembeschreibung an.
Genau das hab ich gemacht. Neben den Tipps für Anfänger gibt es hier
auch eine andere interessante Sache:
"[...] Im Sinne eines konstruktiven und mindestens neutralen oder sogar
freundlichen Miteinanders ist es geraten, solche Worte wie "Quatsch",
"Unsinn" usw. zur Qualifizierung von Fragen oder Antworten zu vermeiden.
Selbst wenn es nicht wirklich so gemeint ist, dass die Person abgewertet
werden soll, ist es für den Leser doch oft schwer allein aus dem Text
die Lesart zu entnehmen. [...]"
Bitte berücksichtige das, auch ein "hääää" ist nicht neutral. Topic ist
jetzt erledit.