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

Alternative zur For-Schleife um Runge Kutta Verfahren

 

maze
Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 73
Anmeldedatum: 05.04.11
Wohnort: Hamburg
Version: 7.11.0 R2010b
     Beitrag Verfasst am: 21.10.2011, 16:40     Titel: Alternative zur For-Schleife um Runge Kutta Verfahren
  Antworten mit Zitat      
Ich habe mein Programm hier extrem gekürzt, der Übersicht halber und hoffe sehr, dass meine Fragestellung dann immer noch verständlich ist. Das gekürzte Progamm ist im Text reinkopiert und nochmal als Anhang.

Ich habe 5 miteinander zusammenhängende Differentialgleichungen, die ich mit Runge-Kutta (ode45) löse.
Ich berechne zu Beginn meine Werte für m_d, m_v, m_l, v und t (der Teil ist weggelassen).
Diese übergebe ich dann, ( wie jetzt wieder im Hauptprogramm zu sehen) als Anfangswerte y97(1), y97(2).
Das Hauptprogramm ruft dann das mfile glaze_97 auf, in der die 5 Differentialgleichungen sind, setzt die Anfangswerte aus dem Hauptprogramm ein, rechnet von 0 bis z+hstep, und gibt mir das Rechenergebnis wieder im Hauptprogramm als Werte [zh, y97n] aus.
Damit werden diee Funktionsvariablen dann wieder neu berechnet für die nächste Iteration in Runge Kutta.

Jetzt kommt der Knackpunkt. Dieser Schritt muss wiederholt werden bis z+hstep=40000. Die probiere ich mit der for schleife über z+k+hstep. Aber schon für k=400 benötigt der Rechner ca. eine Minute. Für 4000 Schritte bin ich schon bei 4 Minuten (selbst wenn ich k=0:5:4000 eingebe).

Gibt es eine Möglichkeit hier etwas zu beschleunigen??
Vielen lieben Dank schon im voraus!



Code:
   %  ------------------  Hauptprogramm  ----------------------

% Anfangsbedingungen:

global phi_av phi_ad r_ab c_ab rho_ad rho_ab rho_av

      m_d = rho_d*u*r^2*phi_d;
      m_v = rho_v*u*r^2*phi_v;
      m_l = rho_l*u*r^2*phi_l;
      m_s = rho_s*u*r^2*phi_s;
      m = m_d+m_v+m_l+m_s;
     
      v = rho_b*u^2*r^2;
      t = rho_b*u*r^2*c_b*thetap ;


      y97(1) = m_d;
      y97(2) = m_v;
      y97(3) = m_l;
      y97(4) = v;
      y97(5) = t;
     
    m = m_d + m_v +m_l +m_s;
   
z0=0;
z=z0;
hstep=5;  
 
  for k=0:400
 
options = odeset('Refine', 1,'RelTol',1e-2,'AbsTol',1e-2)
[zh,y97n] = ode45(@glaze_97,[z z+k+hstep],y97, options);
 
   
        m_d = y97n(end,1);
        m_v = y97n(end,2);
        m_l = y97n(end,3);
        v   = y97n(end,4);
        t   = y97n(end,5);
 
 
% calculate u, r, etc at new height

      m = m_d + m_v + m_l + m_s;
      un = v / m;
      c_b = ( m_d*c_d + m_v*c_v + m_l*c_l + m_s*c_s ) / m;
      rho_b = p .* m.^2 .* c_b ./( r_v .* t .* ( m_v + ep.*m_d ));
      rn = ( m.^2 ./ ( rho_b.*v ) ).^0.5;
      m_d = rho_d*u*r^2*phi_d;
      m_v = rho_v*u*r^2*phi_v;
      m_l = rho_l*u*r^2*phi_l;
      m_s = rho_s*u*r^2*phi_s;
      m = m_d+m_v+m_l+m_s;
      c_b = ( m_d*c_d+m_v*c_v+m_l*c_l+m_s*c_s ) / m ;
      rho_b = rho_d*phi_d + rho_v*phi_v + rho_l*phi_l + rho_s*phi_s;
      rhob_0 = rho_b;
      m_v0 = m_v;
      v = rho_b*u^2*r^2;
      t = rho_b*u*r^2*c_b*thetap ;
  end
   
%   -------------   mfile glaze_97 ------------------

function dy = glaze_97(z,y)

global phi_av phi_ad r_ab c_ab rho_ad rho_ab rho_av

dy=zeros(5,1);

m = y(1)+y(2)+y(3)+m_s; % gesamtmasse in column
c_b = (y(1)*c_d+y(2)*c_v+y(3)*c_l+m_s*c_s)/m; % bulk specific heat


dy(1)=2*al*rho_ad*phi_ad*(a1*y(4)*c1)^0.5;
dy(2)=2*al*rho_av*phi_av*(a1*y(4)*c1)^0.5-omega*y(2)*d1;
dy(3)=omega*y(2)*d1;
dy(4)=e1*(rho_ab*(f1)-m^2);
dy(5)=2*al*rho_ab*c_ab*thetaa*(a1*y(4)*g1)^0.5+l*omega*y(2)*d1...
    -rho_ab*g*((h1)-(i1+j1));


end  


Hauptprogramm.m
 Beschreibung:

Download
 Dateiname:  Hauptprogramm.m
 Dateigröße:  1.67 KB
 Heruntergeladen:  355 mal
glaze_97.m
 Beschreibung:

Download
 Dateiname:  glaze_97.m
 Dateigröße:  484 Bytes
 Heruntergeladen:  367 mal
Private Nachricht senden Benutzer-Profile anzeigen


Jan S
Moderator

Moderator


Beiträge: 11.057
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 21.10.2011, 18:12     Titel: Re: Alternative zur For-Schleife um Runge Kutta Verfahren
  Antworten mit Zitat      
Hallo maze,

Kannst Du bitte ein lauffähiges Programm posten? Andernfalls können wir es nicht laufenen lassen und dann natürlich auch kaum Tipps für Verbesserungen geben.

phi_av phi_ad r_ab c_ab rho_ad rho_ab rho_av n0 sind nicht definiert.

Ist ODE45 ein geeigneter Solver? Ist das ODE vielleicht steif?

Gruß, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
maze
Themenstarter

Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 73
Anmeldedatum: 05.04.11
Wohnort: Hamburg
Version: 7.11.0 R2010b
     Beitrag Verfasst am: 22.10.2011, 09:22     Titel:
  Antworten mit Zitat      
Jan, sorry. Hier der komplette Code. Ich dachte mein Ausschnitt samt Fragestellung reicht für Tipps. Ich wollte es nicht zu lang werden lassen. Aber zum Testdurchlauf reichts natürlich nicht. "usstand" ist ein Zusatzprogramm, welches im Hauptprogramm und im glaze97-file aufgerufen wird.
Danke Dir und evtl. anderen schon vorab für die Hilfe.

usstand.m
 Beschreibung:

Download
 Dateiname:  usstand.m
 Dateigröße:  1.38 KB
 Heruntergeladen:  411 mal
glaze_97.m
 Beschreibung:

Download
 Dateiname:  glaze_97.m
 Dateigröße:  743 Bytes
 Heruntergeladen:  359 mal
Hauptprogramm_glaze_.m
 Beschreibung:

Download
 Dateiname:  Hauptprogramm_glaze_.m
 Dateigröße:  4.21 KB
 Heruntergeladen:  362 mal
Private Nachricht senden Benutzer-Profile anzeigen
 
maze
Themenstarter

Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 73
Anmeldedatum: 05.04.11
Wohnort: Hamburg
Version: 7.11.0 R2010b
     Beitrag Verfasst am: 22.10.2011, 09:24     Titel:
  Antworten mit Zitat      
Ach Jan, und das Problem ist nicht steif, weshalb ode45 glaube ich schon am geeignetesten ist.
Private Nachricht senden Benutzer-Profile anzeigen
 
Jan S
Moderator

Moderator


Beiträge: 11.057
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 22.10.2011, 16:05     Titel:
  Antworten mit Zitat      
Hallo maze,

In usstand.m, Zeile 25:
Statt "else zkm > h2 ;" soll es wahrscheinlicu "elseif zkm > h2" heißen.

Der PROFILEr bestätigt meine erste Idee: Die Verwendung der vielen globalen Variablen verbraucht mehr als die Hälfte der Rechenzeit. Globale Variablen haben den Nachteil, dass Matlab's JIT-Beschleuniger nicht beurteilen kann, ob sie während einer Schleife von Aussen verändert werden. Zudem müssen die GLOABLs bei jedem Aufruf zeitraubend aus dem Base-Workspace kopiert werden. Bei einem einzigen großen Array kann das zwar Vorteile bringen, bei vielen Skalaren ist das aber eine heftige Bremse.

Entweder Du versuche die Variablen in einen einzigen globalen Struct zu packen, oder Du benutzt beim Aufruf des Integrators eine anonyme Funktion, in der die Parameter mit eingesetzt werden. Beispiel für anonyme Funktion mit parameters p1, p2, ...:
Code:
[T, Y] = ode45(@(t,x) myfun(t, x, p1, p2, ...), ts, x0)

Wenn Du das behoben hast, kann man die ODE-Funktion noch weiter beschleunigen.

Ich bekomme beim Durchlauf bis 4000 übrigens die Warnung:
Zitat:
Warning: Imaginary parts of complex X and/or Y arguments ignored
> In Hauptprogramm_glaze_ at 121


Gruß, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
maze
Themenstarter

Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 73
Anmeldedatum: 05.04.11
Wohnort: Hamburg
Version: 7.11.0 R2010b
     Beitrag Verfasst am: 22.10.2011, 16:25     Titel:
  Antworten mit Zitat      
Jan, herzlichen Dank schon mal! Ein guter Hinweis wegen der Rechenzeit im Zusammenhang mit den globalen Variablen. Das war mir nicht klar.
Auch viele Dank für den Fehlerhinweis in ustand..
Ich probiere das gleich Montag aus und melde mich evtl. nochmal Smile
Viele liebe Grüße
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.