Verfasst am: 15.11.2013, 12:35
Titel: Gleitender Mittelwert mit "filter-" Funktion
Hallo zusammen,
ich bin kurz vorm Verzweifeln und brauche dringend euro Hilfe. Da ich leider ein absoluter MATLAB Anfänger bin, weiss ich im Moment echt nicht mehr weiter.
Ich bin gerade dabei eine thermische Gebäudesimulation in Matlab umzusetzen. Bisher hat alles auch ganz gut funktioniert. Nun habe ich aber versucht eine gleitende Mittelwertbildung der Außentemperatur über die jeweils vorherigen 5 Stunden zu realisieren und den aktuellen Mittelwert dann in einer verschachtelten if-Abfrage einzubauen. Jedoch ohne Erfolg.
Sogar zu Zeiten, in denen der aktuelle Mittelwert der Außentemperatur Tm_a (der letzten 5 Stunden) größer als 12 °C ist, wird Qheiz nicht auf 0 gesetzt. Das heisst im Klartext, dass die aller erste if-Abfrage einfach niemals zutrifft bzw. übernommen wird. Das kann laut meiner Zeitreihe aber nicht sein. Nur wo liegt der Fehler??? Die erste if-Abfrage müsste definitiv bei hohen Außentemperaturen zutreffen.
Zur besseren Veranschaulichung hier einmal der Code:
Code:
for x=1:35039 % gleitende Mittelwertbildung von Ta mit Hilfe der Filterfunktion
Tm_a = filter(ones(1,WindowSize)/WindowSize,1,Ta(x));
kleiner tipp für später es ist immer einfacher für uns wenn du ein lauffähiges minimalbeispiel giebst. der großteil deines codes hat glaube ich nix mit dem problem an sich zu tun.
_________________
vielen dank schonmal für den Vorschlag! Allerdings weiss ich nicht genau, ob ich dich richtig verstanden habe. Ich habe den Code nun einfach folgendermaßen verändert:
Code:
for x=1:35039 % gleitende Mittelwertbildung von Ta mit Hilfe der Filterfunktion
Tm_a(x) = filter(ones(1,WindowSize)/WindowSize,1,Ta(x));
Als Index für Tm_a habe ich einfach mal das x genommen, da das ja auch meine Laufvariable ist. So meintest du das doch oder? Nur leider funktioniert das auch nicht. Die erste if-Abfrage wird nach wie vor ignoriert und schlägt nicht an.
Das kann ich absolut nachvollziehen, allerdings ist ein lauffähiges Minimalbeispiel für dieses Programm nicht möglich. Ich müsste dann noch die Excel Tabellen aus denen die Daten importiert und exportiert werden ebenfalls mit hochladen, sonst könnte man das garnicht nachvollziehen. Das wäre wahrscheinlich etwas aufwendig.
Ich habe jetzt trotzdem einfach mal das Programm ohne die nötigen Excel Tabellen hochgeladen.
bei sowas hilft meist der debugger. einfach mal den debugger in die schleife setzen und dir den inhalt von tm_a angucken.
edit:
so hab mir mal die doc zu filter angeguckt. bin mir nicht ischer ob du das richtig benutzt.
Code:
Ta=randi(30,1000,1);
WindowSize=20;
tm_a=filter(ones(1,WindowSize)/WindowSize,1,Ta) for k=1:numel(tm_a) if tm_a(k)>12
%insert code here
end;
end;
das ist übrigens ein lauffähiges minimalbeispiel ^^ man kann bei dir auch einiges ohne die schleife lösen mit logischen indizierung. weiterhin sind denke ich einige sachen in der schleife überflüssig da sie dort garnicht berechnet werden.
_________________
Oh man, danke für den Hinweis. Du hast vollkommen Recht! Das Problem liegt an der filter-Funktion. Die macht garnicht das was sie tun soll. Da wird überhaupt kein gleitender Mittelwert berechnet.
Die doc bzw. MATLAB Definition zu filter habe ich ehrlich gesagt nicht richtig begriffen, allerdings habe ich in mehreren Foren gelesen, dass filter eine sehr einfache und elegante Möglichkeit ist, um einen gleitenden Mittelwert für jeden Zeitschritt neu zu ermitteln.
Beim ersten Zeitschritt müssten dann natürlich die ersten 19 Werte für Ta durch Nullen aufgefüllt werden. Ich dachte, dass filter genau so vorgeht...
Wie kann ich denn nun einen gleitenden Mittelwert realisieren?
P.S: Ich glaube dir, dass man das Programm auch deutlich eleganter schreiben kann, allerdings bin ich ein absoluter Anfänger und das ist das höchste was ich bis jetzt programmieren kann
Wie kann ich denn nun einen gleitenden Mittelwert realisieren?
das habe ich oben bereits geschrieben.
Zitat:
Beim ersten Zeitschritt müssten dann natürlich die ersten 19 Werte für Ta durch Nullen aufgefüllt werden. Ich dachte, dass filter genau so vorgeht... Confused
warum ? ist das sinnvoll ? dabei wird ja der durschnitt gesenkt? das macht filter übrigens nicht. wenn die vorherigen 19 werte nicht existieren werden sie nicht beachtet. der durchschnitt des ersten wertes ist halt der erste wert. das macht auch mehr sinn als nullen einzusetzen in dem fall.
_________________
die filter-Funktion macht das, was dokumentiert ist und dank dem Namen naheliegt: sie filtert. Wenn du als kernel einen speziellen Vektor verwendest, wird ein gleitender Mittelwert berechnet - siehe Grafik und Formeln in der Doku bei "Algorithm".
Zitat:
Beim ersten Zeitschritt müssten dann natürlich die ersten 19 Werte für Ta durch Nullen aufgefüllt werden. Ich dachte, dass filter genau so vorgeht...
Inwiefern tut es das denn nicht?
Im übrigen liefert das Beispiel von Winkow alles, was du brauchen solltest.
verzeihung, ich habe gar nicht begriffen, dass das Beispiel von Winkow die Lösung meines Problems ist. Muss jetzt nur leider bis Montag warten, da ich auf meinem eigenen Rechner kein MATLAB habe.
Vielen Dank für eure Hilfe, ihr seid echt klasse!!
Gruß
Stefan
Einstellungen und Berechtigungen
Du kannst Beiträge in dieses Forum schreiben. Du kannst auf Beiträge in diesem Forum antworten. Du kannst deine Beiträge in diesem Forum nicht bearbeiten. Du kannst deine Beiträge in diesem Forum nicht löschen. Du kannst an Umfragen in diesem Forum nicht mitmachen. Du kannst Dateien in diesem Forum posten Du kannst Dateien in diesem Forum herunterladen
MATLAB, Simulink, Stateflow, Handle Graphics, Real-Time Workshop, SimBiology, SimHydraulics, SimEvents, and xPC TargetBox are registered trademarks and The MathWorks, the L-shaped membrane logo, and Embedded MATLAB are trademarks of The MathWorks, Inc.