Durchschnitt eines Graphens < Matlab < Mathe-Software < Mathe < Vorhilfe
|
Status: |
(Frage) überfällig | Datum: | 17:06 Di 12.12.2006 | Autor: | mjh53 |
Ich habe diese Frage in keinem Forum auf anderen Internetseiten gestellt.
hallo,
ich bin noch recht frisch in matlab, daher ist diese frage wohl relativ einfach zu beantworten, nur mir fehlt gerade die idee, sollte jdn. einen tipp für mich haben, vielen dank im voraus...
ich habe einen ziemlich osszilierenden graphen, mit ca. 1000 punkten, wie kann ich denn mit dem Durchschnitt arbeiten, so dass der Graph mit Geraden überlagert wird, die jeweils über 100 Punkte reichen.... ich möchte also dann 10 Geraden haben, die meinen ursprünglichen Graphen überlagern...
gruss
mathias
|
|
|
|
Status: |
(Mitteilung) Reaktion unnötig | Datum: | 17:11 Di 12.12.2006 | Autor: | Martin243 |
Hallo,
Gegenfrage:
Woraus soll der Durchschnitt denn berechnet werden? Aus je 100 Werten? Dann hast du aber 10 waagerechte Strecken, also eine Treppenfunktion.
Oder sollen die Endpunkte der Strecken durch Mittelung von irgendetwas gewonnen werden?
Kannst du vielleicht deine Strategie erläutern (evtl. skizzieren?)
Gruß
Martin
|
|
|
|
|
Status: |
(Mitteilung) Reaktion unnötig | Datum: | 17:42 Di 12.12.2006 | Autor: | Martin243 |
Noch etwas, wo du schon vom Durchschnitt sprichst:
Man kann auch den laufenden Durchschnitt der letzten k Elemente bilden. Das glättet die Kurve dann auch. Hier sollte k ungerade sein und die Druchschnittskurve nach links verschoben sein, damit der Durchschnittswert mitten im Intervall liegt und nicht an dessen Ende.
Natürlich sind die Ränder dieser Durchschnittskurve nicht aussagekräftig, aber in der Mitte sieht es ok aus.
Hier ein Beispiel:
data = rand(1,100); %Zufallsdaten, ziemlich ausgefranst
plot(data); hold on;
k=7; %Mittelung über die 7 letzten Werte
data1 = filter(ones(1,k)/k,1,data); %Berechnung des laufenden Durchschnitts
plot(data1(1+floor(k/2):end),'r');
So sieht es für die k-Werte 7, 15 und 31 aus:
[Dateianhang nicht öffentlich]
Gruß
Martin
Dateianhänge: Anhang Nr. 1 (Typ: jpg) [nicht öffentlich]
|
|
|
|
|
Status: |
(Mitteilung) Reaktion unnötig | Datum: | 17:52 Di 12.12.2006 | Autor: | mjh53 |
hallo...
ja das mit dem gleitenden durchschnitt ist erst mal super... ich würde aber auch gerne Geraden auf die Kurve legen, die die Tendenz in diesem Bereich wiederspiegelt.... also nicht nur waagrechte Geraden, sondern je nach Trend.. steigend, fallend, konstant....
gruss
mathias
|
|
|
|
|
Status: |
(Mitteilung) Reaktion unnötig | Datum: | 18:25 Di 12.12.2006 | Autor: | Martin243 |
Dann nochmal meine Frage nach deiner Strategie.
Falls dir das lokale Verhalten innerhalb jedes Intervalls reicht, dann könnte man es mit einer Regressionsgeraden pro Intervall versuchen. Das geht mit der Funktion polyfit und liefert z.B. bei 1000 Zufallswerten bei einer Unterteilung in 100er-Intervalle folgendes Bild:
[Dateianhang nicht öffentlich]
Gruß
Martin
Dateianhänge: Anhang Nr. 1 (Typ: jpg) [nicht öffentlich]
|
|
|
|
|
Status: |
(Frage) überfällig | Datum: | 10:52 Mi 13.12.2006 | Autor: | mjh53 |
hallo...
zwei Fragen dazu... einmal verstehe ich folgendes nicht ganz...
da ich das selbe problem hatte, frage ich nun nach...damals sah die zeile so aus..
plot(startzeit:(endzeit-startzeit)/(size(kurs,2)-1):endzeit,kurs);
nun
plot(kurs(1+floor(k/2):end),'r');
es geht um die "1"... einmal ziehst du sie ab, das andere mal addierst du sie... mir ist schon klar, dass das eine nichts mit dem anderen zu tun hat, und das dies ein genereller vorgang ist bei, um ein bestimmtes problem zu lösen... welches denn??
zweite Frage... zufällig möchte ich exakt die den ersten plot mit dem zweiten glätten... da habe ich aber das problem mit der x-achse... wie kann ich die x-achse beim zweiten plot dem ersten anpassen...
gruss
mathias
|
|
|
|
|
Hallo,
die Sache mit der Eins... Richtig, die beiden Einsen haben nichts miteinander zu tun und lösen zwei grundverschiedene Probleme:
1. plot(startzeit:(endzeit-startzeit)/(size(kurs,2)-1):endzeit,kurs);
Hier geht es darum, dass wir genauso viele x-Werte haben wollen wie y-Werte vorhanden sind. Wir geben dabei den ersten und den letzten x-Wert vor. Dazwischen liegt ein Intervall. Allgemein unterteilen n Stützstellen ein großen Intervall in (n-1) kleinere.
Da wir size(kurs,2) y-Werte haben, wollen wir das Intervall [startzeit,endzeit] in (size(kurs,2)-1) kleinere Intervalle der Länge (endzeit-startzeit)/(size(kurs,2)-1) unterteilen.
2. plot(kurs(1+floor(k/2):end),'r');
Hier geht es darum, dass wir über eine ungerade Anzahl von Werten gemittelt haben. Das hat den Vorteil, dass es ein mittleres Element gibt. Da die Mittelwerte aber bei der filter-Funktion immer am Ende des Intervalls stehen, müssen wir sie um die "kleinere" Hälfte von k nach links verschieben. Wir ziehen von k diese "kleinere" Hälfte ab un erhalten als Startindex:
$k - floor(k/2) = 1 + floor(k/2)$, weil k ungerade ist und deshalb gilt:
$k = 2*floor(k/2) + 1$
(floor entspricht ja der Gaußklammer)
Die zweite Frage habe ich leider nicht verstanden... Du willst einen Plot mit einem anderen glätten?!?
Gruß
Martin
|
|
|
|
|
Status: |
(Frage) beantwortet | Datum: | 15:36 Mi 13.12.2006 | Autor: | mjh53 |
hallo...
ich habe meine daten (kurs) erzeugt und stelle sie mittles plot graphisch dar... die x-achse soll dabei nun die zeit darstellen, daher habe ich anfangszeit und endzeit mittles datenum() erzeugt....
-->
plot(startzeit:(endzeit-startzeit)/(size(kurs,2)-1):endzeit,kurs);
nun möchte ich diesen graphen glätten...
-->
plot(kurs(1+floor(k/2):end),'r');
dabei bekomme ich aber probleme mit der x-achse, die ich nicht in den begriff bekomme... ich müsste doch dem zweiten plot die x-achsenwerte des ersten mitübergeben... wie mir dies gelingen kann ist nun meine frage....
gruss
mathias
|
|
|
|
|
Aaah,
wieso sagst du nicht einfach:
plot(startzeit:(endzeit-startzeit)/(size(kurs,2)-1):endzeit, kurs(1+floor(k/2):end),'r');
Wenn plot einen Vektor übergeben bekommt, interpretiert er diesen als y-Werte und nimmt einfach 1,2,3... als x-Werte. Bei zwei Vektoren interpretiert er den ersten als x- und den zweiten als y-Werte.
Gruß
Martin
|
|
|
|
|
Status: |
(Mitteilung) Reaktion unnötig | Datum: | 11:20 Fr 15.12.2006 | Autor: | matux |
$MATUXTEXT(ueberfaellige_frage)
|
|
|
|