|
|
Iterationsschritte des Solvers pro Zeitschritt |
|
slash-hammer |
Forum-Newbie
|
|
Beiträge: 7
|
|
|
|
Anmeldedatum: 03.07.12
|
|
|
|
Wohnort: Innsbruck
|
|
|
|
Version: R2012a
|
|
|
|
|
|
Verfasst am: 03.07.2012, 12:52
Titel: Iterationsschritte des Solvers pro Zeitschritt
|
|
Hallo Zusammen,
ich habe für die Simulation von Druckwellen in Rohrleitungen eine embedded Matlab function in meinem Modell. Darin wird nach dem Charakteristiken Verfahren die Druckausbreitung entlang der Charakteristiken bei jedem Zeitschritt gelöst.
Um Zeit zu sparen würde ich gern einen Teil der Berechnung pro Zeitschritt nur einmal durchführen und nicht bei jeder Iteration des Solvers das ganze Paket. Die in der Rohrleitung liegenden Punkte habe nämlich keinen Einfluss auf die Iteration, nur die beiden am Rand liegenden.
Vielleicht kennt einer von euch einen Befehl mit dem man etwas bei der Simulation pro Zeitschritt nur einmal ausführen lassen kann!
Gruß Andi
|
|
|
|
|
cybbi |
Forum-Fortgeschrittener
|
|
Beiträge: 84
|
|
|
|
Anmeldedatum: 23.08.11
|
|
|
|
Wohnort: ---
|
|
|
|
Version: Alle
|
|
|
|
|
|
Verfasst am: 04.07.2012, 07:38
Titel:
|
|
Ich wüsste keine Möglichkeit für den normalen Matlab Function Block. Falls du dir die Mühe machen möchtest.. mit dem Level 2 Matlab S-Function Block sollte das allerdings gehen. Darin kannst du detailliert steuern, was du wann während einer Simulation rechnen möchtest.
|
|
|
slash-hammer |
Themenstarter
Forum-Newbie
|
|
Beiträge: 7
|
|
|
|
Anmeldedatum: 03.07.12
|
|
|
|
Wohnort: Innsbruck
|
|
|
|
Version: R2012a
|
|
|
|
|
|
Verfasst am: 04.07.2012, 08:06
Titel:
|
|
servus cybbi,
was ich wann in der Simulation berechnen möchte kann ich anhand einer Zeitvariable auch im Matlab function Block super steuern. Nur ist halt bei jeder Iteration des Solvers die Zeit gleich, bis das Ergebnis konvergiert. Und ich habe bis jetzt noch keine Laufvariable für die Iterationsschritte des Solvers gefunden.
Wie würde das denn bei der Level 2 S-function funktionieren??
mfg
Andi
|
|
|
cybbi |
Forum-Fortgeschrittener
|
|
Beiträge: 84
|
|
|
|
Anmeldedatum: 23.08.11
|
|
|
|
Wohnort: ---
|
|
|
|
Version: Alle
|
|
|
|
|
|
Verfasst am: 04.07.2012, 08:28
Titel:
|
|
Vielleicht hab ich die Frage nicht genau verstanden.
Ein Matlab Function Block wird ein Mal pro Simulationsschritt berechnet (sogenanntes "Fixed in Minor Step"). Irgendwelche Iterationen des Solvers hast du bei Integratorblöcken (1/s z.B.), das hat aber auch keine Auswirkungen auf den auf den Matlab Function Block.
Meine Aussage bzgl. Matlab S-Functions war die, dass du eben genau steuern kannst, welche outputs, state update, derivatives, etc. wann berechnet werden.
Wie gesagt, vielleicht hab ich die Frage falsch verstanden. Vielleicht könntest du nochmal ein bisschen detaillierter schildern, was du möchtest..? Vllt. auch ein Beispiel anhängen?
|
|
|
slash-hammer |
Themenstarter
Forum-Newbie
|
|
Beiträge: 7
|
|
|
|
Anmeldedatum: 03.07.12
|
|
|
|
Wohnort: Innsbruck
|
|
|
|
Version: R2012a
|
|
|
|
|
|
Verfasst am: 04.07.2012, 08:42
Titel:
|
|
Ich glaube du meinst den normalen Matlab bzw. Simulink function Block in dem sowas wie z.B.: sin(u(1))*u(2) drin steht.
In dem Programm verwende ich "embedded Matlab" Blöcke (haben so in der 2010 Version geheißen), jetzt werden diese: "Matlab function" Blöcke genannt.
http://www.mathworks.de/help/toolbo.....slref/matlabfunction.html
Mit denen kann ich in Simulink direkt mit Matlab Code programmieren, das funktioniert auch super. Nur möchte ich halt einen Teil des Codes ausklammern wenn die Iteration im Zeischritt sich wiederholt. Solver = Discrete.
Anbei der angesprochene Matlab Block mit Code!
Beschreibung: |
|
Download |
Dateiname: |
Druckstollen.mdl |
Dateigröße: |
68.91 KB |
Heruntergeladen: |
500 mal |
|
|
|
cybbi |
Forum-Fortgeschrittener
|
|
Beiträge: 84
|
|
|
|
Anmeldedatum: 23.08.11
|
|
|
|
Wohnort: ---
|
|
|
|
Version: Alle
|
|
|
|
|
|
Verfasst am: 04.07.2012, 09:22
Titel:
|
|
|
|
|
Okay so langsam kapier ich auch halbwegs was du machen möchtest
Ein paar prinzipielle Sachen, die mir auffallen:
1.
Du verwendest in deinem Code diverse while-Schleifen. Du solltest sicherheitshalber eine Abbruchbedingung in solchen iterativen Codeteilen einbauen.. sowas wie:
Damit kannst du den Fall umgehen, dass deine Lösung unter Umständen nicht konvergiert. Damit sollte man grundsätzlich in while-Schleifen aufpassen.
2.
Wo verwendest du einen Discrete Solver? Es ist ein Variable-Step ode45 solver eingestellt.. Ich gehe mal davon aus, dass er automatisch auf variable step discrete umstellt, aber das sollte man auch speziell einstellen, wenn man das möchte.
3.
Entschuldige, wenn ichs immer noch nicht kapiert habe. Sagen wir, der Solver macht alle 0.2s einen Berechnungsschritt.
Möchtest du jetzt, dass er Teile der Simulation nur alle 1s oder 2s oder so ähnlich rechnet? Das könntest du z.B. über die Simulationszeit rechnen, z.B. mit Hilfe der modulo Funktion.
Möchtest du irgendeinen Rechenschritt ausschließlich ein einziges Mal machen? Dann verwende persistent data (persistent bedeutet, dass die Variable während den Matlab function Block Aufrufen den Datenwert im Speicher behält, ähnlich static bei C):
|
|
|
slash-hammer |
Themenstarter
Forum-Newbie
|
|
Beiträge: 7
|
|
|
|
Anmeldedatum: 03.07.12
|
|
|
|
Wohnort: Innsbruck
|
|
|
|
Version: R2012a
|
|
|
|
|
|
Verfasst am: 04.07.2012, 09:59
Titel:
|
|
|
|
|
1. Danke für den Tipp mit den while Schleifen, das hab ich total vergessen.
2. Du hast vollkommen recht, aufgrund des fehlenden continous state wechselt er automatisch immer auf den discrete solver. Die Warnung habe ich gekonnt ignoriert und habs noch nie direkt bei den Parametern eingestellt. Aber verwendet wird immer der Diskret Solver.
3. Mir geht es nicht darum einen Teil der Berechnung zu einer gewissen Zeit durchzuführen. So wie du sagst, ist das ja einfach zu machen, und ich habe auch eine if Abfrage bezüglich t == 0, damit ich den Initialzustand berechne und else wenn die Simulation läuft.
Simulink rechnet ja das gesamte Modell pro Zeitschritt einige Male durch. Das kann man sehr gut mit verfolgen wenn man im debug Modus irgendwo einen break point hat. Beim Zeitschritt t=0, kommt er ca. 8 mal zu diesem break point, bis die Lösung des Modells konvergiert und dann geht er in den nächsten Zeitschritt.
Ich möchte dass er bei diesen 8 Iterationsschritten einen Teil der Berechnung nur beim ersten Mal macht, weil die keinen Einfluss auf das Modell und die Iteration haben.
Super wäre ein Befehl der mir den Iterationsschritt zurückgibt und ich somit die Berechnung bei i > 1 ausschließen kann.
Wenn ich die Daten als persistent data anlege, kann ich dann davon ausgehen dass das Programm diese nicht mehr berechnet beim nächsten Iterationsschritt. Das wäre dann schon sowas das ich mir gedacht hätte. Nur glaube ich dass ich eine Abfrage davor brauche.
Danke im Voraus,
mfg Andi
|
|
|
cybbi |
Forum-Fortgeschrittener
|
|
Beiträge: 84
|
|
|
|
Anmeldedatum: 23.08.11
|
|
|
|
Wohnort: ---
|
|
|
|
Version: Alle
|
|
|
|
|
|
Verfasst am: 04.07.2012, 10:23
Titel:
|
|
|
|
|
Ich hab deine Simulation mal laufen lassen (mit ein paar Default Werten für die ganzen Parameter). Er macht bei mir alle 0.2 Sekunden einen Zeitschritt (ergibt sich ja über den Solver automatisch).
Ansonsten rechnet er pro Zeitschritt einmal das komplette Matlab Subsystem durch (wird als Atomic Subsystem betrachtet).
Simulink iteriert da gar nichts von sich aus automatisch. Das Subsystem wird einmal, genauso wie es da steht, durchgerechnet. Iterationen (sog. minor steps) macht er nur, wenn du integratoren (also kontinuierliche Zustände) in deinem System hast. Aber das hast du ja nicht. Deswegen wird dein Matlab Block einmal pro 0.2 Sekunden durchgerechnet.
Ich hab mir das auch mit dem Debugger angeschaut. Die Aussage, dass er 8 Mal zu einem bestimmten breakpoint kommt, kann ich nicht nachvollziehen. An welcher Stelle hast du denn den Breakpoint gesetzt?
Noch eine andere Idee: Du könntest deinen Code auch aufspalten in zwei Matlab Function Blöcke und z.B. über einen Trigger-Block steuern, dass du den ausgelagerten Matlab Function Block nur zu bestimmten Zeitpunkten berechnest. Wäre das eine Lösung?
Zum persistent:
Das Codebeispiel von mir legt eben eine persistent-Variable an, falls sie nicht existiert. Initialisieren kann man diese dann eben über den isempty-Befehl.
|
|
|
slash-hammer |
Themenstarter
Forum-Newbie
|
|
Beiträge: 7
|
|
|
|
Anmeldedatum: 03.07.12
|
|
|
|
Wohnort: Innsbruck
|
|
|
|
Version: R2012a
|
|
|
|
|
|
Verfasst am: 04.07.2012, 10:44
Titel:
|
|
Sorry, das Beispiel ist nur ein Teil des Gesamtmodells in dem ich das Problem habe. Es kommen noch einige andere Teile dazu.
Ich wollte nicht das Gesamtmodell ins Forum stellen, um niemand von Beginn an zu überfordern .
Anbei findest du das gesamte Modell.
Alles in den workfolder, dann Initialisieren ausführen, dann noch Traegheitsvektor ausführen und dann läuft das Modell. Dort siehst du dann die einzelnen Schritte pro Zeitschritt.
Beschreibung: |
|
Download |
Dateiname: |
Modell.zip |
Dateigröße: |
93.33 KB |
Heruntergeladen: |
511 mal |
|
|
|
cybbi |
Forum-Fortgeschrittener
|
|
Beiträge: 84
|
|
|
|
Anmeldedatum: 23.08.11
|
|
|
|
Wohnort: ---
|
|
|
|
Version: Alle
|
|
|
|
|
|
Verfasst am: 04.07.2012, 11:54
Titel:
|
|
Danke für das Gesamtmodell. Dadurch weiß ich auch endlich, worum es geht
2 Punkte:
1.
Bitte, bitte nimm diese ganzen GoTo und From Blöcke raus. Ohne jetzt übertreiben zu wollen, aber das Modell ist so absolut unleserlich. Vor Allem die Verwendung von diesen Blöcken in den ganzen Subsystemen macht das so schwierig.
2.
Der Grund, warum deine Simulation so langsam ist, liegt an den ganzen algebraischen Schleifen (Steht auch in der Kommandozeile beim Simulieren). Diese versucht Simulink iterativ aufzulösen, was auch scheinbar funktioniert. Das ist aber auch der Grund, warum die Blöcke einige Male (z.B. 8 Mal) berechnet werden. Wenn du diese algebraischen Schleifen auflöst, sollte das Modell deutlich (!) schneller laufen.
Damit kommen wir wieder zu Punkt 1.. um diese algebraischen Schleifen besser auflösen zu können, solltest du dein Modell übersichtlicher machen, indem du die From und GoTo Blöcke entfernst.
Hoffe, das hilft dir ein wenig weiter!
|
|
|
slash-hammer |
Themenstarter
Forum-Newbie
|
|
Beiträge: 7
|
|
|
|
Anmeldedatum: 03.07.12
|
|
|
|
Wohnort: Innsbruck
|
|
|
|
Version: R2012a
|
|
|
|
|
|
Verfasst am: 04.07.2012, 13:07
Titel:
|
|
|
|
|
Du hast vollkommen recht, das ganze Ding ist ziemlich unübersichtlich geworden, aber die meisten From und goto Blöcke hab ich eingebaut um die Verästelung von den Signalen los zu werden. Ich brauch die ganzen Signale immer auch für das Diagramm und da spar ich mir einige Linien.
PS: die goto Befehle beziehen sich immer nur auf die jeweilige Modellebene, soweit hab ich es vereinfacht
Der algebraische Loop ist leider notwendig, da die einzelnen Subsysteme verschiede Anlagenteile von einem Kraftwerk darstellen und diese voneinander abhängig sind. z.B.: Turbinendurchfluss ist abhängig von Druck vor der Turbine --> Druck vor der Turbine ist abhängig vom Durchfluss.
Somit bin ich wieder beim Kernproblem angelangt. An allen Punkten wo die unterschiedlichen Teile zusammenkommen muss die Iteration einige Male durchgeführt werden, da komm ich nicht drum rum. Aber in einigen Submodellen könnte ich einen Teil der Berechnung nur einmalig machen, da sich dort nichts mehr ändert durch die Iteration, diese Bereiche sind unabhängig von der Variation der Eingangsgrößen des Submodells.
Danke dir für die große Hilfe, aber ich glaube langsam dass es für dieses Problem keine Lösung gibt und ich die Wartezeit in Kauf nehmen muss
|
|
|
|
|
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 - 2024
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.
|
|