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

Dauer der oder45-Integration über Event verkürzen?

 

ChriX

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 17.01.2012, 13:57     Titel: Dauer der oder45-Integration über Event verkürzen?
  Antworten mit Zitat      
Hi,
ich bin auf der Suche nach einer Möglichkeit,die Dauer einer Integration zu verkürzen, da ein Optimierer diese immer wieder ausführen muss.
Es handelt sich um einen 1-Massen-Schwinger, der eine Sprunganregung erhält und sich auf diesen Wert einpendelt.
Ich habe mir gedacht, über die Event-funktion ab einer gewissen Toelranz die letzten 5 Werte zu vergleichen, und wenn diese meine vorgegebene Abweichung nicht überschreiten, die Integration abzubrechen.
Soweit funktioniert die Sache auch, nur spare ich dadurch keine Zeit, es dauert sogar bei einer Integration schon 0.1s länger als wenn die komplette Integration ausgeführt wird.
Liegt es an meiner Idee oder gibt es eine elegantere Lösung.
Ich hatte mir auch schon den Code für die ODE-Funktion angeschaut, bin da aber nicht so ganz hintergestiegen, was da eig. passiert.

Code:

function [ value,isterminal,direction ] = event( t,x0,P,Pc,An )
global n_ev;
global x;
value= zeros(1024,1);
if t==0

   n_ev=1;
end
i=n_ev;
x(i) = x0(1,1);
n_ev=n_ev+1;

if abs(x0(1,1)-An.u)>=1e-4
    value      = 1 ; %
    isterminal(1) =   1  ; % Abbruch, ...
    direction(1)  =   0  ; % ... in jedem Fall

else
    for j=i-5:i
            value(j,1) = abs(x(i)-x(j)) ; %
            if value (j,1)<=1e-4
                value(j,1)=0;
            else
                value(j,1)=1;
            end
    end
    if value == 0
        value = 0;
        isterminal(1) =   1  ; % Abbruch, ...
        direction(1)  =   0  ; % ... in jedem Fall
        return
    end
    value = 1;
    isterminal(1) =   1  ; % Abbruch, ...
    direction(1)  =   0  ; % ... in jedem Fall
end
end
 


Ich hoffe ihr versteht was ich versuche euch zu erklären und könnt mir weiter helfen.

Lg Chrix


Harald
Forum-Meister

Forum-Meister


Beiträge: 24.501
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 17.01.2012, 14:14     Titel:
  Antworten mit Zitat      
Hallo,

diese Event-Funktion muss ja nach jedem Integrationsschritt ausgeführt werden. Es ist für mich also nicht weiter erstaunlich, dass du mit dieser relativ komplexen Event-Funktion eher Zeit verlierst als Zeit zu gewinnen.

Ich hätte einen alternativen Vorschlag:
Sagen wir, die gesamte Simulationszeit ist 60 Sekunden.
1. Simuliere 1 Sekunde
2. Überprüfe, ob bereits eingependelt.
- Falls ja, Abbruch.
- Falls nein, verwende den Endzustand als Anfangszustand und gehe zu 1.

Vorteil: Du ersparst dir unter Umständen eine beträchtliche Simulationszeit und hast verhältnismäßig wenig zusätzlichen Aufwand.

Natürlich könntest du auch deine Event-Funktion so trimmen, dass sie nur alle Sekunden anfängt, Werte zu sammeln und dann ggf. abbricht. Das erscheint mir aber umständlicher.

Unabhängig von all dem kannst du natürlich auch mit verschiedenen Solvern experimentieren.

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
ChriX

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 17.01.2012, 15:06     Titel:
  Antworten mit Zitat      
Hallo Harald,
danke schonmal für die schnelle Antwort.
mir scheint das die Integration generell länger dauert sobald man eine Eventfunktion benutzt.
Deine Alternative habe ich inhaltlich verstanden, nur wie ich diese implementiere ist mir nicht so ganz klar.
Ich würde jetzt den ode-solver in einer Schleife ausführen für jeweils z.B. 1s Integrationszeit und danach wieder die letzten Werte vergleichen.
dann ggf. die nächste Sekunde integrieren.
Gibt es schon einen "Stopbefehl" für den solver, bzw einen um die Integration fortzusetzen?
Sonst würde ich ja entsprechend viele [T,Y]-Vektore erhalten, die ich danach wieder zusammenführen müsste.

Gruß
ChriX
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.501
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 17.01.2012, 15:21     Titel:
  Antworten mit Zitat      
Hallo,

Zitat:
mir scheint das die Integration generell länger dauert sobald man eine Eventfunktion benutzt.

Kann ich nicht beurteilen. Daran kann man aber vermutlich nichts ändern.

Zitat:
Sonst würde ich ja entsprechend viele [T,Y]-Vektore erhalten, die ich danach wieder zusammenführen müsste.

Genau. Wenn du an ode45 beispielsweise einen Vektor tspan in der Form [t:dt:t+1] übergibst, weißt du ja, wieviele Werte du maximal bekommst, und kannst entsprechend vorbelegen. Das wäre auch für das Abbruchkriterium nützlich.

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
ChriX

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 17.01.2012, 18:07     Titel:
  Antworten mit Zitat      
Vielen Dank nochmal harald,
habe es jetzt geschafft es ist tatsächlich schneller. In dem ersten einfachsten Fall sogar gute 20%.
Hier mal meine Lösung
Code:

T_abb = [] ; Y_abb = [] ;
cont = 1 ;

tElapsed = toc(tStart);

tStart_1 = tic;
while cont == 1
  for i=1:8
      tspan = 1023/8*(i-1)*P.TsRazz.Ts:i*(1023/8)*P.Ts;
      [t Y_128]  = ode45 (@(t,x0) integration(t,x0,P,Pc,An) , tspan , x0 , options) ;

      T_abb  = [T_abb  ; t]  ;
      Y_abb = [Y_abb ; Y_128] ;

      for j=1:5
          x_abw(j)=abs(Y_abb(i*128,1)-Y_abb(i*128-j,1));
          if x_abw(j)<=1e-4
              x_abw(j)=0;
          end
      end
      if  x_abw==0
          cont=0;
          Y_abb(i*128+1:1024,1) = Y_abb(i*128,1);
          Y_abb(i*128+1:1024,2) = Y_abb(i*128,2);
         
          break
      end
      x0=Y_abb(128*i,:);
  end
end

 


Vielen Dank für die Hilfe
und noch einen schönen Abend
ChriX
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.501
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 17.01.2012, 21:13     Titel:
  Antworten mit Zitat      
Hallo,

probier mal, ob es einen weiteren Geschwindigkeitszuwachs gibt, wenn du die Zwischenschritte gröber rasterst. Du verlierst dadurch keine Genauigkeit, weil ode45 ja trotzdem Zwischenschritte macht, wenn es nötig ist.

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 - 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.