|
|
Weiterrechnen mit einem Ergebnis innerhalb einer Schleife |
|
eh27 |

Forum-Anfänger
|
 |
Beiträge: 12
|
 |
|
 |
Anmeldedatum: 31.03.16
|
 |
|
 |
Wohnort: ---
|
 |
|
 |
Version: ---
|
 |
|
|
 |
|
Verfasst am: 13.04.2016, 12:37
Titel: Weiterrechnen mit einem Ergebnis innerhalb einer Schleife
|
 |
Ich möchte gern das nach elseif der p_Z1(k) weiterberechnet wird mit dem letzten Wert aus dem elseif Bereich. Es soll also im else Bereich (Zeile 61) gelten:
p_Z1(k)=[das letzte Ergebnis aus der vorhergehenden elseif Schleife (Zeile 56) von p_Z1(k)]/((V_Z1(k)/V_max)^kappa);
Wie lässt sich das umsetzen?
Und gibt es für diesen Code allgemeine Verbesserungsvorschläge? Wenn ich diesen mit mehr als 50 oder 100 Arbeitsspielen rechne lasse wird ewig gerechnet, bei einem Test mit 1000 war der Speicher voll
Das ist der aktuelle Code.
|
|
|
|
|
Jan S |

Moderator
|
 |
Beiträge: 11.057
|
 |
|
 |
Anmeldedatum: 08.07.10
|
 |
|
 |
Wohnort: Heidelberg
|
 |
|
 |
Version: 2009a, 2016b
|
 |
|
|
 |
|
Verfasst am: 13.04.2016, 16:12
Titel: Re: Weiterrechnen mit einem Ergebnis innerhalb einer Schleif
|
 |
|
 |
|
Hallo eh27,
Zitat: |
Ich möchte gern das nach elseif der p_Z1(k) weiterberechnet wird mit dem letzten Wert aus dem elseif Bereich. |
Es ist schwieirg die Frage im Detail nachvollziehen zu können. Vermutlich musst Du den letzten Wert einfach nur in einer Variablen speicherN: "temp = ..." und kannst sie dann wie gewünscht verwenden.
Zitat: |
Und gibt es für diesen Code allgemeine Verbesserungsvorschläge? |
Der Profiler verrät Dir, wo die meiste Zeit im Code benötigt wird. Wann immer man Laufzeitprobleme bekommt, ist er deshalb das erste Tool der Wahl.
Ich vermute aber, dass Du bereits im Editor Warn-Hinweise bekommst, da z.B. p_Z1 nicht pre-alloziert ist. Wenn ein Array in jeder Iteration wächst, verbraucht das verblüffend viele Resourcen. Ein Beispiel:
Jetzt wird in jeder Iteration ein neues Array für A im Speicher alloziert und die vorherigen Werte kopiert. Im Endeffekt hast Du also nicht 1000*8 Byte vom OS angefordert, sondern
sum(1:1000)*8
. Der Speicher wird zwar bei Gegelegenheit wieder freigegeben, aber das ist trotzdem (in jeder Programmiersprache) eine ernste Schwachstelle.
Wie Du die etwas unpraktische Rundung per
rem
direkt hinbekommst, hatte ich Dir schon in einem anderen Thread erklärt.
10^-5 ist eine teure Berechnung, 1e-5 eine sehr billige Konstante.
Leerzeichen um die Operatoren machen den Code lesbar und debugbar.
Bei einem solchen Block bekomme ich akute Augenschmerzen:
Gruß, Jan
|
|
|
eh27 |
Themenstarter

Forum-Anfänger
|
 |
Beiträge: 12
|
 |
|
 |
Anmeldedatum: 31.03.16
|
 |
|
 |
Wohnort: ---
|
 |
|
 |
Version: ---
|
 |
|
|
 |
|
Verfasst am: 14.04.2016, 14:28
Titel:
|
 |
Hallo Jan,
vielen Dank für deine Hilfe. Das mit der rem Funktion habe ich gemacht.
Wie kann ich den letzten Wert in der elseif als Variable speichern? Und wird dieser dann jedes mal, wenn die elseif erneut durchlaufen wird wieder überschrieben mit dem neuen letzten Wert?
Den Profiler schau ich mir an.
Gruß Eric
|
|
|
Jan S |

Moderator
|
 |
Beiträge: 11.057
|
 |
|
 |
Anmeldedatum: 08.07.10
|
 |
|
 |
Wohnort: Heidelberg
|
 |
|
 |
Version: 2009a, 2016b
|
 |
|
|
 |
|
Verfasst am: 14.04.2016, 17:43
Titel:
|
 |
Hallo eh27,
Gerne!
Ich kann nicht erraten, was genau "der letzte Wert" bedeutet.
Wenn Du in dem elseif-Teil schreibst:
(was auch immer "der letzte Wert" bedeutet) wird temp immer dort gesetzt und gilt im Rest des Codes. Das ist zwar unübersichtlich, funktioniert aber zuverlässig.
Zitat: |
Und wird dieser dann jedes mal, wenn die elseif erneut durchlaufen wird wieder überschrieben mit dem neuen letzten Wert? |
Na klar, was sonst? Am besten probierst Du es einfach aus. Setze doch einen Breakpoint in diese Zeile und gehe dann Zeile für Zeile durch den Code. Dann siehst Du ja, was wo wie definiert ist.
Gruß, Jan
|
|
|
eh27 |
Themenstarter

Forum-Anfänger
|
 |
Beiträge: 12
|
 |
|
 |
Anmeldedatum: 31.03.16
|
 |
|
 |
Wohnort: ---
|
 |
|
 |
Version: ---
|
 |
|
|
 |
|
Verfasst am: 14.04.2016, 19:10
Titel:
|
 |
|
 |
|
Hallo Jan,
Zum besser nachvollziehen. Das ganze soll ein Kreisprozess sein. Im Bereich if startet der Prozess und findet im geschlossenen Raum1 statt. Im elseif Bereich wird ein Ventil geöffnet, womit der Raum1 mit Raum2 verbunden wird. Es findet ein Ausgleich statt. Deshalb die dTs und dps. Im Raum aus sinkt damit T und p. Anschließend schließt das Ventil wieder, damit ist Raum 1 wieder geschlossen und T und P sind höher als am Anfang ( p_Umg, T_Umg ) aber niedriger, als zu Beginn im elseif Bereich. Jetzt soll statt T_Umg, p_Umg die neuen Werte zur Verdichtung genommen werden. Also der neue Startwert soll der letzte Wert aus der elseif von T und p sein.
Also der letzte wert soll im Prinzip beim ersten Arbeitsspiel wenn das Ventil bei 320 grad öffnet und 350 grad schließt T und p von 350 grad sein. In der Berechnung sind es bei 320 grad kw ca. 33 bar und bei 350 grad kw ca 26 bar, jetzt soll der Prozess im geschlossenen Raum mit 26 bar als Startwert fortgesetzt werden. Im nächsten Arbeitsspiel steigt der Druck weiter, und sollte dann im nächsten wiederum mit dem Wert aus dem letzten als Start weitermachen.
Vielen Dank für deine Hilfe!
|
|
|
|
|
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
|
|
Impressum
| Nutzungsbedingungen
| Datenschutz
| FAQ
| 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.
|
|