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

Runden nach jeder Integration eines ODE-Solvers

 

dagginio
Forum-Newbie

Forum-Newbie


Beiträge: 6
Anmeldedatum: 10.06.09
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 10.06.2009, 11:53     Titel: Runden nach jeder Integration eines ODE-Solvers
  Antworten mit Zitat      
Hallo

Ich möchte ein Differentialgleichungssystem lösen, und nach jedem Integrationsschritt des ODE-Solvers auf die z.B. 5. Stelle nach dem Komma runden.

Das DGL-System zu lösen ist kein Problem, es hapert nur an dem runden und ich habe keine Idee wie man sowas machen kann. Bevor ich hier meinen Code poste, will ich erstmal wissen wie man so was generell realisieren kann.

Danke

Daniel
Private Nachricht senden Benutzer-Profile anzeigen


steve
Ehrenmitglied

Ehrenmitglied



Beiträge: 2.022
Anmeldedatum: 03.09.07
Wohnort: Wien
Version: R2023b
     Beitrag Verfasst am: 10.06.2009, 11:58     Titel:
  Antworten mit Zitat      
Moin,

das runden kannst du mit
Code:
ungerundet = 0.12334567;
gerundet = round(ungerundet*1e5)/1e5;


Aber warum willst du runden?

Gruß
Alex
_________________

>> I told me to.

____________________________________
Matlab Cheat Sheet
goMatlab-Knigge - dran gehalten?!
Schon in den FAQ gesucht?
Ist vielleicht bei den Skripten oder den Tutorials was für dich dabei?
Private Nachricht senden Benutzer-Profile anzeigen
 
dagginio
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 6
Anmeldedatum: 10.06.09
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 10.06.2009, 12:20     Titel:
  Antworten mit Zitat      
Danke für die Antwort.

Diese art von runden kannte ich, so war das aber nicht gemeint.

Die Lösung der DGL hat unter anderem Werte in der Größenordnung von 1e-20. Werte die kleiner 1e-5 sind sollen zu null gesetzt werden, aber nicht erst nachdem die DGL berechnet wurde, sondern bereits während der Berechnung, so das der Solver im nächsten Iterations schritt nicht mit 1e-20 sondern mit 0 rechnet. Warum ich das ganze so haben will, ist eine lange Geschichte, und dauert lange zu erklären. Es geht auf jeden Fall um die Lösung einer population balance equation.

Eine meiner Ideen war, eine OutputFcn zu benutzen, weiß aber nicht wie ich das umsetzten kann. Gibt es andere Ideen?

Kann mir dabei jemand helfen?

Daniel
Private Nachricht senden Benutzer-Profile anzeigen
 
Bane
Forum-Anfänger

Forum-Anfänger


Beiträge: 34
Anmeldedatum: 09.06.09
Wohnort: Berlin
Version: ---
     Beitrag Verfasst am: 10.06.2009, 13:44     Titel:
  Antworten mit Zitat      
Hallo Daniel,

schreib doch Deinen eigenen Solver, z.B. klassisches Runge-Kutta-Verfahren. Das sind nur ein paar Zeilen und Du kannst in jedem Iterationsschritt mit den Zwischenergebnissen machen was Du willst.

Gruß, Phil
Private Nachricht senden Benutzer-Profile anzeigen
 
dagginio
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 6
Anmeldedatum: 10.06.09
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 10.06.2009, 14:58     Titel:
  Antworten mit Zitat      
Danke Phil,
werde ausprobieren. Bin im Moment für ein halbes Jahr in England, und habe daher nicht meine Bücher zur Hand. Kannst du mir eine verlässliche Quelle für das Runge Kutta verfahren. funktioniert es auch bei steifen Problemen?

Danke
Daniel
Private Nachricht senden Benutzer-Profile anzeigen
 
Bane
Forum-Anfänger

Forum-Anfänger


Beiträge: 34
Anmeldedatum: 09.06.09
Wohnort: Berlin
Version: ---
     Beitrag Verfasst am: 10.06.2009, 15:29     Titel:
  Antworten mit Zitat      
Hallo Daniel,

Das klassische RK-Verfahren ist explizit und daher nicht besonders für steife ODEs geeignet. Wenn Du kein Problem mit einer kleinen Schrittweite hast, sollte es aber gehen. Wenn Du ein sehr steifes Problem hast dann ist ein implizites Verfahren wahrscheinlich besser geeignet. Allerdings auch etwas schwerer zu implementieren. Ich habe entsprechenden Code zu Hause, schau heut abend mal nach.

Gruß, Phil
Private Nachricht senden Benutzer-Profile anzeigen
 
dagginio
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 6
Anmeldedatum: 10.06.09
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 10.06.2009, 15:42     Titel:
  Antworten mit Zitat      
vielen Dank

Daniel
Private Nachricht senden Benutzer-Profile anzeigen
 
Bane
Forum-Anfänger

Forum-Anfänger


Beiträge: 34
Anmeldedatum: 09.06.09
Wohnort: Berlin
Version: ---
     Beitrag Verfasst am: 10.06.2009, 23:52     Titel:
  Antworten mit Zitat      
Klassisches Runge-Kutta Verfahren für ein Beispiel ODE-Gleichungssystem:

Code:
function RKmethod

% time discretization
to = 0;
tend = 20;
h = 0.01;
t = to:h:tend;

% initial conditions
e = 0.6;
u(1) = 1- e; u(3) = 0; u(2) = 0; u(4) = sqrt((1+e)/(1-e));
u = u';

% classical Runge-Kutta
for i = 1:length(t)-1
    K1 = udot(u(:,i));
    K2 = udot(u(:,i) + h/2*K1);
    K3 = udot(u(:,i) + h/2*K2);
    K4 = udot(u(:,i) + h  *K3);
    u(:,i+1) = u(:,i) + h /6* (K1 + 2*K2 + 2*K3 + K4);
end

% plot
plot(t,u(1,:)); hold on
plot(t,u(2,:),':'); plot(t,u(3,:),'r'); plot(t,u(4,:),'--')
legend('x','v in x','y','v in y',2); title('classical Runge-Kutta')
hold off

% ODE-System
function dudt = udot(u)
    dudt = [ u(2)                       ;
            -u(1)/(u(1)^2+u(3)^2)^(3/2) ;
             u(4)                       ;
            -u(3)/(u(1)^2+u(3)^2)^(3/2)];


Wenn Du kein Gleichungssystem hast, dann kannst Du den Code leicht adaptieren.
Wenn Du eine ODE höherer Ordnung hast, dann musst Du sie erst in ein System erster Ordnung umwandeln.

Schönen Gruß, Phil
Private Nachricht senden Benutzer-Profile anzeigen
 
dagginio
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 6
Anmeldedatum: 10.06.09
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 11.06.2009, 09:59     Titel:
  Antworten mit Zitat      
Danke Phil,

wenn ich das richtig sehe, muss ich nur mein Gleichungssystem und die Startwerte anpassen, richtig?

Daniel
Private Nachricht senden Benutzer-Profile anzeigen
 
Bane
Forum-Anfänger

Forum-Anfänger


Beiträge: 34
Anmeldedatum: 09.06.09
Wohnort: Berlin
Version: ---
     Beitrag Verfasst am: 11.06.2009, 11:25     Titel:
  Antworten mit Zitat      
Wenn Du ein ODE System erster Ordnung hast, brauchst Du das nur unten einsetzen und die Zeitdiskretisierung und Anfangsbedingungen nach Deinen Vorgaben anpassen.

Gruß, Phil
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.