|
|
Sehr langsames Modell. Wie beschleunigen? |
|
Greepy |
Forum-Anfänger
|
|
Beiträge: 23
|
|
|
|
Anmeldedatum: 28.09.11
|
|
|
|
Wohnort: ---
|
|
|
|
Version: ---
|
|
|
|
|
|
Verfasst am: 05.08.2014, 15:48
Titel: Sehr langsames Modell. Wie beschleunigen?
|
|
Hallo zusammen,
ich nutze für Simulationen ein relativ umfangreiches Simulink-Modell. Einige Funktionen sind mit dem MATLAB Function Block umgesetzt. In diesen werden u.a. ineinander geschachtelte while-Schleifen ausgeführt was die ganze Sache recht langsam macht.
Welche schnelleren Methoden gibt es?
Ich habe mit Google gefunden, dass Built-In-Functions schneller sind. Was ist das genau? Sind das einfache Funktionen wie sin und cos?
Gibt es auch eine Möglichkeit m-files im Current-Folder zu haben und diese dann aus Simulink aufzurufen?
Gruß
|
|
|
|
|
Harald |
Forum-Meister
|
|
Beiträge: 24.492
|
|
|
|
Anmeldedatum: 26.03.09
|
|
|
|
Wohnort: Nähe München
|
|
|
|
Version: ab 2017b
|
|
|
|
|
|
Verfasst am: 05.08.2014, 21:20
Titel:
|
|
Hallo,
je mehr du über das Modell sagen kannst, desto besser.
Beispielsweise: geht es um diskrete oder kontinuierliche Dynamiken?
Scheint das Zeitproblem in der Anzahl der Simulationsschritte oder deren Ausführungsdauer zu liegen?
Zitat: |
In diesen werden u.a. ineinander geschachtelte while-Schleifen ausgeführt was die ganze Sache recht langsam macht. |
Klingt ungut. Vorschläge zur Abhilfe kann man allerdings nur machen, wenn man den Code sieht.
Zitat: |
Welche schnelleren Methoden gibt es? |
Es geht ja um schnelle Methoden, die das gleiche bewirken wie du erreichen willst. Dazu müssten wir aber mehr wissen - s.o.
Zitat: |
Gibt es auch eine Möglichkeit m-files im Current-Folder zu haben und diese dann aus Simulink aufzurufen? |
Aus einem MATLAB Function-Block kann man grundsätzlich alles aufrufen, im Zweifelsfall als extrinsisch deklarieren. Ich weiß allerdings nicht, was das jetzt mit dem Hauptthema zu tun hat.
Grüße,
Harald
|
|
|
Greepy |
Themenstarter
Forum-Anfänger
|
|
Beiträge: 23
|
|
|
|
Anmeldedatum: 28.09.11
|
|
|
|
Wohnort: ---
|
|
|
|
Version: ---
|
|
|
|
|
|
Verfasst am: 06.08.2014, 11:16
Titel:
|
|
Genauer gesagt geht es um Simulationsprogramm das via Simulink läuft. Deshalb ist die Schrittweite fix auf 1e-3 s und nicht veränderbar
Mir ist bewusst, dass die while-Schleifen die Laufzeit sehr stark erhöhen, aber ich habe bislang noch keine andere Variante gefunden.
Mein Ziel ist den Zeitpunkt einer Kollision berechnen und den Zeitpunkt, zu dem die Kollision noch vermeidbar ist. Ich prädiziere zwei Objekte (Position, Geschwindigkeit und Beschleunigung) und überprüfe ob sie miteinander kollidieren. Ist das der Fall, so überprüfe ich, ab wann eine Kollision unvermeidbar ist (begrenzte Dynamik der Objekte). Nachfolgend ein Minimalbeispiel
Dieses Konstrukt wird durch die fixe Schrittweite alle 1e-3 s aufgerufen.
|
|
|
Harald |
Forum-Meister
|
|
Beiträge: 24.492
|
|
|
|
Anmeldedatum: 26.03.09
|
|
|
|
Wohnort: Nähe München
|
|
|
|
Version: ab 2017b
|
|
|
|
|
|
Verfasst am: 06.08.2014, 11:59
Titel:
|
|
Hallo,
Eine Frage der Logik:
Ist es sinnvoll, innerhalb der while-Schleife immer die andere while-Schleife auszuführen? Wenn es keine Kollision gibt, brauche ich doch nicht zu überprüfen, ob sie vermeidbar ist?
Ein Vorschlag bzgl. Performance:
Statt alle t_pred_stepsize = 0.001 s zu testen könnte man z.B. auch alle 0.1 s testen und nur, wenn in diesem Intervall eine Änderung auftritt (also z.B. t = 1.1s noch keine Kollision, t = 1.2s eine Kollision), eine feinere Unterteilung machen. Das klappt allerdings nur, wenn nicht davon auszugehen ist, dass sich CollisionDetected in kurzen Zeiträumen hin- und her ändert.
Grüße,
Harald
|
|
|
amoibos |
Forum-Anfänger
|
|
Beiträge: 40
|
|
|
|
Anmeldedatum: 23.05.14
|
|
|
|
Wohnort: ---
|
|
|
|
Version: 2013a
|
|
|
|
|
|
Verfasst am: 08.08.2014, 09:43
Titel:
|
|
Wie gut optimiert denn Matlab? Bspw. muss Matlab bei false mappen und erkennt es sinnlose Operationen und Zuweisungen?
_________________
An guten Tagen stürzt Matlab nur zweimal ab.
|
|
|
Greepy |
Themenstarter
Forum-Anfänger
|
|
Beiträge: 23
|
|
|
|
Anmeldedatum: 28.09.11
|
|
|
|
Wohnort: ---
|
|
|
|
Version: ---
|
|
|
|
|
|
Verfasst am: 11.08.2014, 12:39
Titel:
|
|
|
|
|
Hallo Harald,
danke für Dein ausführliches Feedback.
Harald hat Folgendes geschrieben: |
Eine Frage der Logik:
Ist es sinnvoll, innerhalb der while-Schleife immer die andere while-Schleife auszuführen? Wenn es keine Kollision gibt, brauche ich doch nicht zu überprüfen, ob sie vermeidbar ist? |
Du hast Recht. Vorher hatte ich diese Abfrage drinne, ist im Laufe der Entwicklung rausgeflogen. Ist jetzt wieder drinne
Harald hat Folgendes geschrieben: |
Ein Vorschlag bzgl. Performance:
Statt alle t_pred_stepsize = 0.001 s zu testen könnte man z.B. auch alle 0.1 s testen und nur, wenn in diesem Intervall eine Änderung auftritt (also z.B. t = 1.1s noch keine Kollision, t = 1.2s eine Kollision), eine feinere Unterteilung machen. Das klappt allerdings nur, wenn nicht davon auszugehen ist, dass sich CollisionDetected in kurzen Zeiträumen hin- und her ändert. |
Ich muss den Zeitpunkt ziemlich genau wissen, daher ist die maximale Schrittweite, die ich festlegen kann, leider begrenzt.
Hast Du noch ein paar schlaue Ideen wie man allgemein die MATLAB functions schneller machen kann, bzw. diese durch schnellere Funktionen ersetzen kann? Ich habe im Internet recherchiert, dass die MATLAB functions allgemein sehr langsam sind, aber keine guten Alternativen finden können.
Grüße
|
|
|
Harald |
Forum-Meister
|
|
Beiträge: 24.492
|
|
|
|
Anmeldedatum: 26.03.09
|
|
|
|
Wohnort: Nähe München
|
|
|
|
Version: ab 2017b
|
|
|
|
|
|
Verfasst am: 11.08.2014, 13:25
Titel:
|
|
Hallo,
Zitat: |
Ich muss den Zeitpunkt ziemlich genau wissen, daher ist die maximale Schrittweite, die ich festlegen kann, leider begrenzt. |
Das schließt ja nicht aus, dass man zunächst grob simuliert und nur bei Bedarf verfeinert.
Zitat: |
Ich habe im Internet recherchiert, dass die MATLAB functions allgemein sehr langsam sind |
Das würde ich in dieser Allgemeinheit nicht sagen. Für die Simulation wird C-Code generiert, das sollte an sich so schnell wie's eben geht sein. Du kannst wohl nur daran drehen, was du überhaupt rechnen / simulieren lässt. Wenn du alle 0.001s quasi eine interne Simulation für 3s mit 0.001s ausführst, dann bedeutet das nämlich 3 Mio. Funktionsauswertungen pro simulierter Sekunde. Dass das dauert, sollte nicht verwundern.
Ein weiterer Ansatz wäre: müssen die 3s wirklich vollkommen neu berechnet werden, oder kann man da z.B. auf der Auswertung aus dem vorherigen Schritt aufbauen?
Grüße,
Harald
|
|
|
|
|
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.
|
|