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

Sehr langsames Modell. Wie beschleunigen?

 

Greepy
Forum-Anfänger

Forum-Anfänger


Beiträge: 23
Anmeldedatum: 28.09.11
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 05.08.2014, 15:48     Titel: Sehr langsames Modell. Wie beschleunigen?
  Antworten mit Zitat      
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ß
Private Nachricht senden Benutzer-Profile anzeigen


Harald
Forum-Meister

Forum-Meister


Beiträge: 24.492
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 05.08.2014, 21:20     Titel:
  Antworten mit Zitat      
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
Private Nachricht senden Benutzer-Profile anzeigen
 
Greepy
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 23
Anmeldedatum: 28.09.11
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 06.08.2014, 11:16     Titel:
  Antworten mit Zitat      
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

Code:

%Initialisierung
t_pred = 0; % Initial value 0s
t_pred_stepsize = 0.001; % sample time 0.001s
t_pred_max = 3; % 3s

while t_pred < t_pred_max && CollisionDetected == false
    t_pred = t_pred + t_pred_stepsize;

    [object1_prediction, object2_prediction] = prediction(object1,object2)
    CollisionDetected = CollisionDetection(object1_prediction,object2_prediction)

    %Initialisierung
    t_pred_avoidance = 0; % Initial value 0s
    t_pred_stepsize_avoidance = 0.001; % sample time 0.001s
    t_pred_max_avoidance = 3; % 3s

   while t_pred_avoidance < t_pred_max_avoidance && CollisionUnavoidable_all
        t_pred_avoidance = t_pred_avoidance + t_pred_stepsize;

        % Acht Aufrufe mit verschiedenen Vermeidungsmanövern (Beschleunigen in alle Richtungen)
        [object1_prediction_avoidance, object2_prediction_avoidance] = prediction(object1_avoidance,object2_avoidance)
        CollisionUnavoidable =         CollisionDetection_(object1_prediction_avoidance,object2_prediction_avoidance)

        % Falls alle Aufrufe CollisionUnavoidable = true ergeben, dann ist  CollisionUnavoidable_all = true und die innere Schleife wird abgebrochen
    end
end
 


Dieses Konstrukt wird durch die fixe Schrittweite alle 1e-3 s aufgerufen.
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.492
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 06.08.2014, 11:59     Titel:
  Antworten mit Zitat      
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
Private Nachricht senden Benutzer-Profile anzeigen
 
amoibos
Forum-Anfänger

Forum-Anfänger


Beiträge: 40
Anmeldedatum: 23.05.14
Wohnort: ---
Version: 2013a
     Beitrag Verfasst am: 08.08.2014, 09:43     Titel:
  Antworten mit Zitat      
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.
Private Nachricht senden Benutzer-Profile anzeigen
 
Greepy
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 23
Anmeldedatum: 28.09.11
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 11.08.2014, 12:39     Titel:
  Antworten mit Zitat      
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 Smile

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
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.492
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 11.08.2014, 13:25     Titel:
  Antworten mit Zitat      
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
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 - 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.