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

Prädiktor-Korrektor Numerik Problem

 

Matlab_Newbie2

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 22.06.2014, 19:09     Titel: Prädiktor-Korrektor Numerik Problem
  Antworten mit Zitat      
Hallo zusammen,

ich bin was Matlab angeht noch ein ziemlicher Anfänger und habe bei einer Uni-Aufgabe folgende Fehlermeldung, wenn ich
Attempted to access y(42); index out of bounds because numel(y)=41.

Error in Fehler_10 (line 12)
error(i)=abs(exakt(i)-y(i));

Error in Blatt10 (line Cool
Fehler_10(y,0,8,80,40)

Zur Aufgabe und meinem bisherigen Lösungsversuch:
Aufgabe:
Ich soll die ODE y'(x)=-y(x) mit y(0)=1 auf dem Intervall [0;8] mittels des Prädiktor-Korrektor-Verfahrens unter Anwendung des klassichen Runge-Kutta-Verfahrens als Löser und dem explizitem Adams-Bashforth als Prädiktor und
dem implizitem Adams-Moulton als Korrektor lösen. Die Schrittweite h des Lösers soll h=0,1; 0,01; 0,001; 0,005 sein und die Schrittweite h_quer der Adams-Algorithmen soll größer sein. Insgesamt soll ich das Verfahren einmal mit einem korrekturschritt ausführen, und einmal mit zwei Korrekturschritten. Am Ende soll ich meine beste Lösung als Plot ausgeben und den Fehler im loglog-Plot für beide Korrekturschritte ausgeben.

Soweit, sogut. Im Folgenden habe ich meinen bisherigen Lösungsversuch aufgelistet. Ich habe insgesamt 4 mfiles, eine mit dem Verfahren mit einem Korrekturschritt (PreKor_10), eine mfile mit dem Verfahren mit zwei Korrekturschritten (PreKor_zwei_10), die mfile für den Fehler (Fehler_10) und die Ausgabe mfile (Ausgabe).

PreKor_10:
Code:
function [y t] = PreKor(f,a,b,ya,n,n_quer); % f - Funktion; a,b Intervall, ya Anfangsbedingung, n Anzahl der Schritte des Löser, n_quer Anzahl der Schritte der Adams-Algorithmen
h = (b - a) / n; % Schrittweite des Lösers
h_quer = (b - a)/n_quer; % Schrittweite der Adams-Algorithmen
h24 = h / 24;
h_quer24 = h_quer / 24;

y(1,:) = ya;
t(1) = a;

m = min(3,n);

for i = 1 : m % Anfangsphase; benutze Runge-Kutta-Verfahren Ordnung 4
    t(i+1) = t(i) + h;
    s(i,:) = f(t(i), y(i,:));
    s2 = f(t(i) + h / 2, y(i,:) + s(i,:) * h /2);
    s3 = f(t(i) + h / 2, y(i,:) + s2 * h /2);
    s4 = f(t(i+1), y(i,:) + s3 * h);
    y(i+1,:) = y(i,:) + (s(i,:) + s2+s2 + s3+s3 + s4) * h / 6;
end;

for i = m + 1 : n_quer % Hauptphase
    s(i,:) = f(t(i), y(i,:));
    y(i+1,:) = y(i,:) + (55 * s(i,:) - 59 * s(i-1,:) + 37 * s(i-2,:) - 9 * s(i-3,:)) * h_quer24; % Prädiktor (Adams-Bashforth)
    t(i+1) = t(i) + h_quer;
    y(i+1,:) = y(i,:) + (9 * f(t(i+1), y(i+1,:)) + 19 * s(i,:) - 5 * s(i-1,:) + s(i-2,:)) * h_quer24; % Korrektor (Adams-Moulton)
   
end;


PreKor_zwei_10:
Code:
function [y t] = PreKor(f,a,b,ya,n,n_quer); % f - Funktion; a,b Intervall, ya Anfangsbedingung, n Anzahl der Schritte
h = (b - a) / n; % Schrittweite des Lösers
h_quer = (b - a)/n_quer; % Schrittweite der Adams-Algorithmen
h24 = h / 24;
h_quer24 = h_quer / 24;

y(1,:) = ya;
t(1) = a;

m = min(3,n);

for i = 1 : m % Anfangsphase; benutze Runge-Kutta-Verfahren Ordnung 4
    t(i+1) = t(i) + h;
    s(i,:) = f(t(i), y(i,:));
    s2 = f(t(i) + h / 2, y(i,:) + s(i,:) * h /2);
    s3 = f(t(i) + h / 2, y(i,:) + s2 * h /2);
    s4 = f(t(i+1), y(i,:) + s3 * h);
    y(i+1,:) = y(i,:) + (s(i,:) + s2+s2 + s3+s3 + s4) * h / 6;
end;

for i = m + 1 : n_quer % Hauptphase
    s(i,:) = f(t(i), y(i,:));
    y(i+1,:) = y(i,:) + (55 * s(i,:) - 59 * s(i-1,:) + 37 * s(i-2,:) - 9 * s(i-3,:)) * h_quer24; % Prädiktor (Adams-Bashforth)
    t(i+1) = t(i) + h_quer;
    y(i+1,:) = y(i,:) + (9 * f(t(i+1), y(i+1,:)) + 19 * s(i,:) - 5 * s(i-1,:) + s(i-2,:)) * h_quer24; % Korrektor (Adams-Moulton)
    y(i+1,:) = y(i,:) + (9 * f(t(i+1), y(i+1,:)) + 19 * s(i,:) - 5 * s(i-1,:) + s(i-2,:)) * h_quer24; % 2ter Durchgang Korrektor
end;


Fehler_10:
Code:
function [mistake] = Fehler(y,a,b,n,n_quer);
exakt=[];
error=[];
h=(b-a)/n;  % Schrittweite des Lösers
h_quer=(b-a)/n_quer %Schrittweite der Adams-Algorithmen
for i=1:n
    exakt(i)=exp(-(a+(i-1)*h));
    error(i)=abs(exakt(i)-y(i));
end
error
loglog(error)


Ausgabe:
Code:

disp('PC-Verfahren für 80 Schritte')
y=PreKor_10(inline('y','t','y'),0,8,1,80,40);
figure(1);
Fehler_10(y,0,8,80,40)
y=PreKor_zwei_10(inline ('y','t','y'),0,8,1,80,40);
figure(2); %Plot für 2 Korrekturschritte
Fehler_10(y,0,8,80,40)


Beim Testen von Ausgabe kommt wie gesagt folgender Fehler:
Attempted to access y(42); index out of bounds because numel(y)=41.

Error in Fehler_10 (line 12)
error(i)=abs(exakt(i)-y(i));

Error in Blatt10 (line Cool
Fehler_10(y,0,8,80,40)

Wie kann ich das Problem denn beheben? Und habe ich bis jetzt alles richtig gemacht?

Vielen Dank für Eure Antworten.
Lg Matlab_Newbie2
Verschoben: 22.06.2014, 23:00 Uhr von Jan S
Von Programmieraufträge nach Programmierung


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.