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;
ifnargin < 5, tol = 1.e-3; end ifnargin < 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.';
iftrace 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 iftrace 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 "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:
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.
OK, danke.
Debugger kenne ich zwar noch nicht, aber das muss ja auch mal sein.
Einstellungen und Berechtigungen
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
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.