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

Runge-Kutta 4/5.Ordnung

 

Suchender
Forum-Anfänger

Forum-Anfänger


Beiträge: 19
Anmeldedatum: 13.04.13
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 12.05.2013, 22:04     Titel: Runge-Kutta 4/5.Ordnung
  Antworten mit Zitat      
Hallo,

ich brauche eine, hoffentlich kleine, Hilfe.
Ich habe ein Runge-Kutta-verfahren 4/5. Ordnung. Dabei soll die Schrittweite selbstständig vom Programm geändert werden können, nur leider hakt die function an einer Stelle. Er gibt mir aber zumindest keine Fehlermeldung; seht selbst:

Erstmal die function

Code:
function [tout, yout] = rk45new(ypfun, t0, tfinal, y0, tol, trace)
p = 1/6;
if nargin < 5, tol = 1.e-3; end
if nargin < 6, trace = 0; end
t = t0;
hmax = (tfinal - t)/16;
h = hmax/8;
y = y0(:);
chunk = 128;
tout = zeros(chunk,1);
yout = zeros(chunk,length(y));
k = 1;
tout(k) = t;
yout(k,:) = y.';
if trace
clc; t; h; y;
end
while (t < tfinal) && (t + h > t)
if t + h > tfinal, h = tfinal - t; end
k1 = feval(ypfun, t, y); k1 = k1(:);
k2 = feval(ypfun, t+2/9*h, y+h*2/9*k1); k2 = k2(:);
k3 = feval(ypfun, t+h/3, y+h*(k1/12+k2/4)); k3 = k3(:);
k4 = feval(ypfun, t+3/4*h, y+h*(69/128*k1-243/128*k2+135/64*k3)); k4 = k4(:);
k5 = feval(ypfun, t+h, y+h*(27/4*k2-17/12*k1-27/5*k3+16/15*k4)); k5 = k5(:);
k6 = feval(ypfun, t+5/6*h, y+h*(65/432*k1-5/16*k2+13/16*k3+4/27*k4+5/144*k5)); k6 = k6(:);
y1=y+1/9*k1+9/20*k3+16/45*k4+k5/12;
y2=y+47/450*k1+12/25*k3+32/225*k4+k5/30+6/25*k6;
delta = norm((y2-y1)/y2,'inf');
tau = tol*max(norm(y,'inf'),1.0);
if delta <= tau
t = t + h;
y = y1;
k = k+1;
if k > length(tout)
tout = [tout; zeros(chunk,1)];
yout = [yout; zeros(chunk,length(y))];
end
tout(k) = t;
yout(k,:) = y.';
end
if trace
home, t; h; y;
end
if delta ~= 0.0
h = min(hmax, 0.9*h*(tau/delta)^p);
end
end
if (t < tfinal)
disp('Singularity likely.')
end
tout = tout(1:k);
yout = yout(1:k,:);
end


Mit
Code:
function dy =lotka(t,y)
dy1=10*y(1)*(1-y(2)) ;
dy2=y(2)*(y(1)-1) ;
dy=[dy1 dy2]';
end


mache ich

Code:
[tout,yout]=rk45new(@lotka,0,10,[3 1],0.1)


und er gibt mir mehrmals aus

Code:
Warning: Rank deficient, rank = 0,  tol =   1.#INFe+000.
> In rk45new at 28


und nach den zahllosen Wiederholungen

Code:
yout =

  1.0e+302 *

    0.0000    0.0000
    0.0000    0.0000
   -0.0000    0.0000
   -0.0000   -0.0000
    0.0000   -0.0000
    1.9824   -0.1982
       NaN       NaN
       NaN       NaN
       NaN       NaN
       NaN       NaN


Mit "Nan" geht es noch viele Zeilen weiter, aber die brauche ich wohl nicht zu posten. Irgendwie sind die Zahlen zu groß, weil da mit 302 potenziert wird. Er scheint ein Problem mit der Zeile zu haben:

Code:
delta = norm((y2-y1)/y2,'inf');


Diese Zeile soll dazu dienen, den Fehler vom RK4 abzuschätzen, um dann die Schrittweite ggf. anzupassen. Was mache ich falsch?

Danke! Smile
Private Nachricht senden Benutzer-Profile anzeigen


Harald
Forum-Meister

Forum-Meister


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

wenn y1 und y2 Vektoren sind, solltest du darauf achten, komponentenweise zu teilen:
Code:
delta = norm((y2-y1)./y2,'inf');


Genauso an anderen Stellen, an denen du durch einen Vektor teilst.

Der Debugger sollte übrigens helfen, solchen Problemen auf die Spur zu kommen.

Grüße,
Harald

P.S.: dir ist bekannt, dass es ode45 gibt und das hier ist sicher nur zur Übung?
Private Nachricht senden Benutzer-Profile anzeigen
 
Suchender
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 19
Anmeldedatum: 13.04.13
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 12.05.2013, 22:36     Titel:
  Antworten mit Zitat      
Ah, danke.

Ich habe genannte Stelle geändert, aber jetzt rechnet und rechnet er. Bei 0.1 Schrittweite sollte es eigentlich nicht so lange dauern. Gibt's noch andere falsche Stellen?

Zitat:
Genauso an anderen Stellen, an denen du durch einen Vektor teilst.


Teile ich noch woanders durch Vektoren? Ich sehe's gerade nicht.

Und: Ja, das ist zur Übung, und zwar für die Uni, ode45 darf ich leider nicht benutzen, sonst wär ich mit meinem Übungszettel schnell fertig. Wink
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


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

Zitat:
aber jetzt rechnet und rechnet er.

Dann versuchs mal mit dem Debugger. Schau dir an, ob die berechneten Lösungsteile korrekt sind und was mit der Schrittweite passiert.

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

Forum-Anfänger

Forum-Anfänger


Beiträge: 19
Anmeldedatum: 13.04.13
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 12.05.2013, 23:01     Titel:
  Antworten mit Zitat      
OK, danke.
Debugger kenne ich zwar noch nicht, aber das muss ja auch mal sein.
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.