Forum: PC-Programmierung Matlab average einer Funktion


von Ludwig K. (kludwig)


Lesenswert?

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

von BT (Gast)


Lesenswert?

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

von Udo S. (urschmitt)


Lesenswert?

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.

von Felix P. (fixxl)


Lesenswert?

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".

von Frank M. (aktenasche)


Lesenswert?

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:
1
x_org = linspace(0,1,5);
2
y_org = [1 4 5 6 9];
3
x_interp = linspace(0,1,1000);
4
y_interp = interp1(x_org,y_org,x_interp);
5
plot(x_interp,y_interp,'k');hold on;plot(x_org,y_org,'rx','MarkerSize',10);
6
mean(y_interp)
7
mean(y_org)

wenn mein gefühl richtig ist, sind die ergebnisse eh gleich.

von Arc N. (arc)


Lesenswert?

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
berechnet würde...

von Udo S. (urschmitt)


Lesenswert?

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.

von G.A. (Gast)


Lesenswert?

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...

von Ludwig K. (kludwig)


Lesenswert?

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.

von Yalu X. (yalu) (Moderator)


Lesenswert?

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:
1
function m = meani(a)
2
  n = length(a)
3
  m = mean([(a(1)+a(n))/2, a(2:n-1)])
4
end
5
6
array = [2 4 3 6]
7
mittel = meani(array)

Ergebnis:
1
mittel =  3.6667

von Ludwig K. (kludwig)


Lesenswert?

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!

von Yalu X. (yalu) (Moderator)


Lesenswert?

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.

von Udo S. (urschmitt)


Lesenswert?

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

von Ludwig K. (kludwig)


Lesenswert?

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!

von Ludwig K. (kludwig)


Lesenswert?

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.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.