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

Schleifenabbruch mit break funktioniert nicht?

 

klepper810
Forum-Newbie

Forum-Newbie


Beiträge: 7
Anmeldedatum: 04.12.14
Wohnort: Deutschland
Version: ---
     Beitrag Verfasst am: 04.12.2014, 13:58     Titel: Schleifenabbruch mit break funktioniert nicht?
  Antworten mit Zitat      
Hallo,

ich möchte eine for-Schleife bei Erreichen eines Wertes vorzeitig beenden. Die break-Anweisung, die ich benutze funktioniert aber nicht. Hier mein Code:

Code:

for z = u:(u+t_run)
                if z >= 1440, break, end
                if RSVR_max(z) >= rsvr_f, break, end
                BHKW_Qmax(z) = 1;
                RSVR_max(z) = RSVR_max(z-1) + BHKW_min - heatreq_au(z) - q_loss;
                HEAT_acc_max(z) = HEAT_acc_max(z-1) + BHKW_min - q_loss;
end
 


Die erste Abbruchanweisung mit z >= 1440 funktioniert, die zweite aber nicht. Kann mir jemand helfen?

Viele Grüße
Private Nachricht senden Benutzer-Profile anzeigen


DSP
Forum-Meister

Forum-Meister



Beiträge: 2.117
Anmeldedatum: 28.02.11
Wohnort: ---
Version: R2014b
     Beitrag Verfasst am: 04.12.2014, 14:14     Titel:
  Antworten mit Zitat      
Da die Syntax ok ist, muss wohl die Bedingung das Problem sein. Offensichtlich tritt

Code:
RSVR_max(z) >= rsvr_f


nie ein. Da außer dir aber niemand weiß, welche Werte die Variablen haben, sind weitere Hilfeversuche Kaffeesatzleserei Wink
Private Nachricht senden Benutzer-Profile anzeigen
 
klepper810
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 7
Anmeldedatum: 04.12.14
Wohnort: Deutschland
Version: ---
     Beitrag Verfasst am: 04.12.2014, 15:00     Titel:
  Antworten mit Zitat      
OK, das stimmt wohl Wink
Also: Die Werte des Vektors RSVR_max steigen ins Unermessliche und überschreiten bereits in der 43. Zeile von 1440 den Wert 16,4 welcher der Variable rsvr_f zugewiesen ist. Im Anhang befindet sich ein Excel-File mit den Werten von RSVR_max.

RSVR_max.xls
 Beschreibung:
RSVR_max

Download
 Dateiname:  RSVR_max.xls
 Dateigröße:  84 KB
 Heruntergeladen:  248 mal
Private Nachricht senden Benutzer-Profile anzeigen
 
DSP
Forum-Meister

Forum-Meister



Beiträge: 2.117
Anmeldedatum: 28.02.11
Wohnort: ---
Version: R2014b
     Beitrag Verfasst am: 04.12.2014, 15:06     Titel:
  Antworten mit Zitat      
Und welche Werte hat z?

Es muss ja von 1...length(RSVR_max) gehen, so fern RSVR_max ein Vektor ist, damit auf alle Werte in RSVR_max zugegriffen wird.

Offensichtlich ist z eben nicht der Index, sondern etwas anderes...

Code:

i = 2; % wegen RSVR_max(i-1)
for z = u:(u+t_run)
                if z >= 1440, break, end
                if RSVR_max(i) >= rsvr_f, break, end
                BHKW_Qmax(i) = 1;
                RSVR_max(i) = RSVR_max(i-1) + BHKW_min - heatreq_au(i) - q_loss;
                HEAT_acc_max(i) = HEAT_acc_max(i-1) + BHKW_min - q_loss;
                i = i + 1; % nächstes Element
end
 


Vemutlich entspricht aber der Aufbau nicht dem gewünschten Verhalten.

Was soll denn geprüft werden...also welche Abbruchbedingungen gibt es?
Private Nachricht senden Benutzer-Profile anzeigen
 
klepper810
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 7
Anmeldedatum: 04.12.14
Wohnort: Deutschland
Version: ---
     Beitrag Verfasst am: 04.12.2014, 15:22     Titel:
  Antworten mit Zitat      
z ist meine Laufvariable und entspricht der Zeit, sie läuft von 1 bis 1440 (Minuten eines Tages). Die Schleife für z umschließt die for-Schleife:

Code:

while z <= 1440

          for z = u:(u+t_run)
                if z >= 1440, break, end
                if RSVR_max(z) >= rsvr_f, break, end
                BHKW_Qmax(z) = 1;
                RSVR_max(z) = RSVR_max(z-1) + BHKW_min - heatreq_au(z) - q_loss;
                HEAT_acc_max(z) = HEAT_acc_max(z-1) + BHKW_min - q_loss;
               
          end
z = z + 1;
end
 


Der Speicher soll bis zu seiner maximalen Kapazität gefüllt werden (16,4). Ist diese erreicht, soll die Schleife verlassen werden. Ich habe einen Plot angehängt. Der rote Graph entspricht RSVR_max.
Natürlich kommt nach der for-Schleife noch jede Menge anderer Code, welcher die Vektoren RSVR_max(z) und HEAT_acc_max(z) verändert. Ich habe jetzt nur der Übersichtlichkeit wegen den Rest weggelassen.

RSVR.JPG
 Beschreibung:

Download
 Dateiname:  RSVR.JPG
 Dateigröße:  30.75 KB
 Heruntergeladen:  217 mal
Private Nachricht senden Benutzer-Profile anzeigen
 
DSP
Forum-Meister

Forum-Meister



Beiträge: 2.117
Anmeldedatum: 28.02.11
Wohnort: ---
Version: R2014b
     Beitrag Verfasst am: 04.12.2014, 15:36     Titel:
  Antworten mit Zitat      
Du kannst nicht die Zeit als Index für deinen Vektoren nehmen.

Jeder Wert in RSVR_max entspricht einem Zeitwert in deinem Zeitvektor? Der letzte Messwert von RSVR_max entspricht RSVR_max(t=1440min)?
Private Nachricht senden Benutzer-Profile anzeigen
 
klepper810
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 7
Anmeldedatum: 04.12.14
Wohnort: Deutschland
Version: ---
     Beitrag Verfasst am: 04.12.2014, 16:10     Titel:
  Antworten mit Zitat      
Genau so wollte ich es machen...
Also eine separate Variable für den Vektor und für die Zeit?
Und warum?
Private Nachricht senden Benutzer-Profile anzeigen
 
DSP
Forum-Meister

Forum-Meister



Beiträge: 2.117
Anmeldedatum: 28.02.11
Wohnort: ---
Version: R2014b
     Beitrag Verfasst am: 04.12.2014, 16:26     Titel:
  Antworten mit Zitat      
Wenn der letzte Messwert RSVR_max(end) = RSVR_max(t=1440min) entspricht , ist eine Überprüfung doch gar nicht notwendig. Denn dann gibt es keinen weiteren Messwert, der einer größeren Zeit als 1440min entspricht.

Code:

for i=2:length(RSVR_max)    
    if RSVR_max(i) >= rsvr_f
        break
    end    
    BHKW_Qmax(i) = 1;
    RSVR_max(i) = RSVR_max(i-1) + BHKW_min - heatreq_au(i) - q_loss;
    HEAT_acc_max(i) = HEAT_acc_max(i-1) + BHKW_min - q_loss;
             
end
 


Falls auch Messwerte nach t=1440min vorhanden sind, hier mit Überprüfung der Zeit

Code:

t = [...]; % Zeitvektor  

for i=2:length(RSVR_max)
    if t(i) >= 1440
        break
    end
    if RSVR_max(i) >= rsvr_f
        break
    end    
    BHKW_Qmax(i) = 1;
    RSVR_max(i) = RSVR_max(i-1) + BHKW_min - heatreq_au(i) - q_loss;
    HEAT_acc_max(i) = HEAT_acc_max(i-1) + BHKW_min - q_loss;
             
end
 


Das setzt aber voraus, dass length(t) und length(RSVR_max) gleich sind, also gleiche viele Werte enthalten.
Private Nachricht senden Benutzer-Profile anzeigen
 
klepper810
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 7
Anmeldedatum: 04.12.14
Wohnort: Deutschland
Version: ---
     Beitrag Verfasst am: 04.12.2014, 21:57     Titel:
  Antworten mit Zitat      

Schleifenabbruch mit break funktioniert nicht?
Klicke hier, um den Artikel bei Amazon.de anzuschauen.

Die Überprüfung ist schon notwendig, da, entschuldige, das hatte ich vergessen anzugeben, in meiner Syntax

Code:

while z <= 1440

         u = z;
                 for z = u:(u+t_run)
                         if z >= 1440, break, end
                         if RSVR_max(z) >= rsvr_f, break, end
                         BHKW_Qmax(z) = 1;
                         RSVR_max(z) = RSVR_max(z-1) + BHKW_min - heatreq_au(z) - q_loss;
                         HEAT_acc_max(z) = HEAT_acc_max(z-1) + BHKW_min - q_loss;
             
                   end
end
 


der Variable t_run der Wert 60 zugewiesen ist. Wird also die Schleife zwischen z=1341 und z=1440 noch einmal durchlaufen, würde durch die for-Schleife der Endwert 1440 überschritten werden, daher die Überprüfung.
Diese funktioniert ja aber auch. Aber warum die andere Überprüfung mit RSVR_max nicht funktioniert, habe ich noch nicht verstanden.
Private Nachricht senden Benutzer-Profile anzeigen
 
DSP
Forum-Meister

Forum-Meister



Beiträge: 2.117
Anmeldedatum: 28.02.11
Wohnort: ---
Version: R2014b
     Beitrag Verfasst am: 04.12.2014, 22:11     Titel:
  Antworten mit Zitat      
Der ganze Code macht so keinen Sinn.

Es scheint aber auch so, dass du meine Vorschläge nicht verstehst und umgekehrt. So können wir hier noch mehrmals posten und reden wohl aneinander vorbei.

Hänge doch mal bitte als MAT file alle Variablen aus deinem Workspace an, die man benötigt um deinen Code verwenden zu können. Befehl "save" nutzen

Nochmal zum Verständnis deine gewünschten Bedingungen für den Abbruch sind:

1. wenn der i. Wert von RSVR_max(i) >= einer Konstante ist

RSVR_max(i) >= rsvr_f

wobei i=1,2,3...length(RSVR_max)

oder 2. wenn der Zeitwert t=1440min überschritten ist

Ist das so richtig?

Und bitte mal den ganze Code posten! Denn welchen Wert haben u und z wenn die Schleife zu 1. mal durchlaufen wird?

Code:

while z <= 1440

         u = z;
 



Ich weiße auch auf folgenden Punkt des goMatlab Knigge hin:
Zitat:
• Werbung ist auf goMatlab.de nicht erwünscht.
Ausgenommen davon sind lediglich:
o Projekte die in direktem Zusammenhang mit Matlab stehen.
Private Nachricht senden Benutzer-Profile anzeigen
 
klepper810
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 7
Anmeldedatum: 04.12.14
Wohnort: Deutschland
Version: ---
     Beitrag Verfasst am: 05.12.2014, 13:42     Titel:
  Antworten mit Zitat      
Hi,
ich habe es hinbekommen.
Ich habe die Bedingungsprüfung ans Ende der for-Schleife gesetzt:

Code:

for i = u:(u+t_run)
            if i >= 1440, break, end
            BHKW_Qmax(i) = 1;
            RSVR_max(i) = RSVR_max(i-1) + BHKW_min - heatreq_au(i) - q_loss;
            HEAT_acc_max(i) = HEAT_acc_max(i-1) + BHKW_min - q_loss;
            if RSVR_max(i) >= rsvr_f, break, end
      end

 


Nun wird die Schleife verlassen, sobald der Wert von rsvr_f erreicht ist Smile
Kann das damit zu tun haben, dass zum Zeitpunkt der Prüfung der neue Wert RSVR_max(z) noch nicht berechnet ist?
Private Nachricht senden Benutzer-Profile anzeigen
 
DSP
Forum-Meister

Forum-Meister



Beiträge: 2.117
Anmeldedatum: 28.02.11
Wohnort: ---
Version: R2014b
     Beitrag Verfasst am: 05.12.2014, 13:54     Titel:
  Antworten mit Zitat      
Nein, denn würde die Abfrage wie vorher auch vor der erneuten Berechnung statfinden, würde der Wert RSVR_max(i) einfach nur 1 i später über rsvr_f liegen.

Aber ehrlich gesagt verstehe ich deinen Code immer noch nicht, was die Zählvariable i angeht.

Code:

% Beispiel Startwerte
t_run=60
u=1

% Ausdruck for
 i = u:(u+t_run)
 


Damit läuft i = 1,2,3,...61. Dementsprechend werden auch nur die ersten 61. Werte in RSVR_max(i) etc. gelesen und neu berechnet.

Wie soll also i >= 1440 sein? Ist u größer 1, wird eben auf den Vektorenbereich

RSVR_max(u:u+t_10) zugegriffen. Ist das wirklich so gewollt?
Private Nachricht senden Benutzer-Profile anzeigen
 
klepper810
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 7
Anmeldedatum: 04.12.14
Wohnort: Deutschland
Version: ---
     Beitrag Verfasst am: 05.12.2014, 14:25     Titel:
  Antworten mit Zitat      
Die Zählvariable i soll das ganze Programm hindurch von 1 bis 1440 laufen.
Bevor nun die For-Schleife ausgeführt wird, weiße ich den aktuellen Wert von i u zu, um den Startwert für die for-Schleife zu bekommen. Der Endwert für die For-Schleife bekomme ich, in dem ich zu u den Wert der Variable t_run (= 60) addiere. Die Zählvariable läuft somit auch während der for-Schleife mit, was auch so gewollt ist.

Ich weiß nicht ob es jetzt verstehst... eine bessere Erklärung fällt mir im Moment nicht ein. Da ich Anfänger in Matlab bin, weiß ich aber nicht ob ich mit der Methode irgendwann an Grenzen stoße... Confused

Danke auf jeden Fall für die Mühen!
Private Nachricht senden Benutzer-Profile anzeigen
 
DSP
Forum-Meister

Forum-Meister



Beiträge: 2.117
Anmeldedatum: 28.02.11
Wohnort: ---
Version: R2014b
     Beitrag Verfasst am: 05.12.2014, 14:50     Titel:
  Antworten mit Zitat      
Deine Schleife läuft aber eben nicht von 1 bis 1440, sondern immer nur im Bereich u:u+t_run mit dem Wert u zum aktuellen Aufruf.

Wenn immer die Abschnittsweise Berechnung gewünscht ist, braucht es eben noch eine zweite Schleife.

Code:

u = 2;
endbedingung = 2000;% ???
rsvr_f  = 16.4;
t_run = 60;
A = ones(2000,1);
while u < endbedingung    
   for i = u:(u+t_run)
        if i >= 1440
            break % Schleife wird immer sofort abgebrochen wenn u >= 1440
        end
        A(i) = A(i) + A(i-1); % Berechnung an dieser Stelle -> kann die if Bedingung wahr sein
        if A(i) >= rsvr_f
            break
        end
        A(i) = A(i) + A(i-1); % Berechnung an dieser Stelle -> Bedingung nie wahr, da A(i) VOR der Berechnung NIE größer rsvr_F ist.
    end
    % nächster bereich
    u = u + t_run; % nur als Bsp.    
end
 


Dein Code stimmt soweit also, aber die Bedingung ist RSVR_max(i) >= rsvr_f niemals wahr weshalb die Schleife dann auch nicht abgebrochen wird.
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.