WICHTIG: Der Betrieb von goMatlab.de wird privat finanziert fortgesetzt. - Mehr Infos...

Mein MATLAB Forum - goMatlab.de

Mein MATLAB Forum

 
Gast > Registrieren       Autologin?   

Partner:




Forum
      Option
[Erweitert]
  • Diese Seite per Mail weiterempfehlen
     


Gehe zu:  
Neues Thema eröffnen Neue Antwort erstellen

Gleitender Mittelwert mit "filter-" Funktion

 

Clausius_Rankine
Forum-Newbie

Forum-Newbie


Beiträge: 8
Anmeldedatum: 04.11.13
Wohnort: Oberhausen
Version: R2010b
     Beitrag Verfasst am: 15.11.2013, 12:35     Titel: Gleitender Mittelwert mit "filter-" Funktion
  Antworten mit Zitat      
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));
       
        if Tm_a > 12
            qwall = Uwall*(Awall+Aroof)*(Ta(x)-Ti_neu(x,1))+Uwindow*Awindow*(Ta(x)-Ti_neu(x,1));
            qair = (Vdh*1.2*Cair*(Ta(x)-Ti_neu(x,1)))/Nair;
            qsol= G(x)*a*g*Awindow;
            Qges = qwall + qair + qsol;
            Qheiz = 0; % keine Beheizung erforderlich
            Qres = qwall + qair + qsol + Qheiz*eta;
            Ti_neu(x+1,1) = Ti_neu(x,1) + Qres*0.25/m_c;
            Daten(x,1) = num2cell(date2(x));
            Daten(x,2) = num2cell(t(x));
            Daten(x,3) = num2cell(Ta(x));
            Daten(x,4) = num2cell(G(x));
            Daten(x,5) = num2cell(qwall);
            Daten(x,6) = num2cell(qair);
            Daten(x,7) = num2cell(qsol);
            Daten(x,8) = num2cell(Qges);
            Daten(x,9) = num2cell(Qheiz);
            Daten(x,10) = num2cell(Ti_neu(x,1));
        else if hilfe(x,1) >= 22 || hilfe(x,1) <= 6    
            Ti_neu(x,1) = 16;
            qwall = Uwall*(Awall+Aroof)*(Ta(x)-Ti_neu(x,1))+Uwindow*Awindow*(Ta(x)-Ti_neu(x,1));
            qair = (Vdh*1.2*Cair*(Ta(x)-Ti_neu(x,1)))/Nair;
            qsol= G(x)*a*g*Awindow;
            Qges = qwall + qair + qsol;
            Qheiz = -(qwall + qair + qsol)/eta; %Heizen
            Qres = qwall + qair + qsol + Qheiz*eta;
            Ti_neu(x+1,1) = Ti_neu(x,1) + Qres*0.25/m_c;
            Daten(x,1) = num2cell(date2(x));
            Daten(x,2) = num2cell(t(x));
            Daten(x,3) = num2cell(Ta(x));
            Daten(x,4) = num2cell(G(x));
            Daten(x,5) = num2cell(qwall);
            Daten(x,6) = num2cell(qair);
            Daten(x,7) = num2cell(qsol);
            Daten(x,8) = num2cell(Qges);
            Daten(x,9) = num2cell(Qheiz);
            Daten(x,10) = num2cell(Ti_neu(x,1));
        else
            Ti_neu(x,1) = Ti;
            qwall = Uwall*(Awall+Aroof)*(Ta(x)-Ti_neu(x,1))+Uwindow*Awindow*(Ta(x)-Ti_neu(x,1));
            qair = (Vdh*1.2*Cair*(Ta(x)-Ti_neu(x,1)))/Nair;
            qsol= G(x)*a*g*Awindow;
            Qges = qwall + qair + qsol;
            Qheiz = -(qwall + qair + qsol)/eta; %Heizen
            Qres = qwall + qair + qsol + Qheiz*eta;
            Ti_neu(x+1,1) = Ti_neu(x,1) + Qres*0.25/m_c;
            Daten(x,1) = num2cell(date2(x));
            Daten(x,2) = num2cell(t(x));
            Daten(x,3) = num2cell(Ta(x));
            Daten(x,4) = num2cell(G(x));
            Daten(x,5) = num2cell(qwall);
            Daten(x,6) = num2cell(qair);
            Daten(x,7) = num2cell(qsol);
            Daten(x,8) = num2cell(Qges);
            Daten(x,9) = num2cell(Qheiz);
            Daten(x,10) = num2cell(Ti_neu(x,1));
            end
        end
    end



Die WindowSize = 20 bei einer viertelstündlichen Auflösung der Zeit.

Ich kann auch gerne einmal das vollständige Programm zuschicken bzw. hochladen, falls das besser ist.

Vielen lieben Dank schonmal im Voraus!!!

Gruß

Stefan
Private Nachricht senden Benutzer-Profile anzeigen


Winkow
Moderator

Moderator



Beiträge: 3.842
Anmeldedatum: 04.11.11
Wohnort: Dresden
Version: R2014a 2015a
     Beitrag Verfasst am: 15.11.2013, 12:45     Titel:
  Antworten mit Zitat      
nunja ich denke ein index bei tm_a wäre gut so alle
Code:

kleiner tipp für später Smile 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.
_________________

richtig Fragen
Private Nachricht senden Benutzer-Profile anzeigen
 
Clausius_Rankine
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 8
Anmeldedatum: 04.11.13
Wohnort: Oberhausen
Version: R2010b
     Beitrag Verfasst am: 15.11.2013, 14:17     Titel:
  Antworten mit Zitat      
Hallo Winkow,

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));
       
        if Tm_a(x) > 12  



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

Viele Grüße

Stefan

Waermeleitung_for_2_2.m
 Beschreibung:

Download
 Dateiname:  Waermeleitung_for_2_2.m
 Dateigröße:  4.2 KB
 Heruntergeladen:  366 mal
Private Nachricht senden Benutzer-Profile anzeigen
 
Winkow
Moderator

Moderator



Beiträge: 3.842
Anmeldedatum: 04.11.11
Wohnort: Dresden
Version: R2014a 2015a
     Beitrag Verfasst am: 15.11.2013, 14:21     Titel:
  Antworten mit Zitat      
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.
_________________

richtig Fragen
Private Nachricht senden Benutzer-Profile anzeigen
 
Clausius_Rankine
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 8
Anmeldedatum: 04.11.13
Wohnort: Oberhausen
Version: R2010b
     Beitrag Verfasst am: 15.11.2013, 16:20     Titel:
  Antworten mit Zitat      
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.

Quasi nach folgendem Schema:

1. (n1+n2+...+n20)/20
2. (n2+n3+...+n21)20
3. (n3+n4+...+n22)/20
usw.

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

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 Laughing

Gruß

Stefan
Private Nachricht senden Benutzer-Profile anzeigen
 
Winkow
Moderator

Moderator



Beiträge: 3.842
Anmeldedatum: 04.11.11
Wohnort: Dresden
Version: R2014a 2015a
     Beitrag Verfasst am: 15.11.2013, 16:52     Titel:
  Antworten mit Zitat      
Zitat:
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.
_________________

richtig Fragen
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.501
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 15.11.2013, 17:32     Titel:
  Antworten mit Zitat      
Hallo,

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.

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
Clausius_Rankine
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 8
Anmeldedatum: 04.11.13
Wohnort: Oberhausen
Version: R2010b
     Beitrag Verfasst am: 15.11.2013, 22:03     Titel:
  Antworten mit Zitat      
Hallo nochmal,

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!! Smile

Gruß

Stefan
Private Nachricht senden Benutzer-Profile anzeigen
 
Neues Thema eröffnen Neue Antwort erstellen



Einstellungen und Berechtigungen
Beiträge der letzten Zeit anzeigen:

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
.





 Impressum  | Nutzungsbedingungen  | Datenschutz | FAQ | goMatlab RSS Button RSS

Hosted by:


Copyright © 2007 - 2025 goMatlab.de | Dies ist keine offizielle Website der Firma The Mathworks

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.