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 Verfahren liefert falsches Ergebnis

 

Kahnbein.Kai
Forum-Newbie

Forum-Newbie


Beiträge: 3
Anmeldedatum: 09.05.19
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 09.05.2019, 14:16     Titel: Runge-Kutta Verfahren liefert falsches Ergebnis
  Antworten mit Zitat      
Guten Tag,
ich habe ein Problem mit dem Runge-Kutta Verfahren, mein Script nährt sich nicht wirklich meiner Funktion an. Ich weiß einfach nicht woran es liegt. Zusätzlich habe ich noch eine Frage, warum muss die Funktion von @(x,y) mit einem Zeilenumbruch geschrieben werden ?


Hier ist mein Script:
Code:

F = @(x,y) [
            x(1).*cos(x(1))
            y(1).^2
           
    ]; % Warum muss das hier mit Zeilenumbruch stehen ?

tEx = (0:0.1:20)'; %Werte für den Plot erstellen

x1 = @(t) (t).*cos(t); %Werte werden in t eingesetzt und in x1 gespeichert
y1 = @(t) (t.^2); %Werte werden in t eingesetzt und in y1 gespeichert

yEx = [x1(tEx) y1(tEx)] %Lösungen aus x1 und y1 werden gespeichert

plot(tEx(:,1),yEx(:,1)) %Ploten von x1
plot(tEx(:,1),yEx(:,2)) %Ploten von y1
plot(yEx(:,1),yEx(:,2)) %Parametricplot von x1 und z1

[tRk1, yRk1] = rungekutta4(F, [0, 20], [0; 0], 0.5); %Runge-Kutta

plot(yEx(:,1),yEx(:,2), yRk1(:, 1), yRk1(:, 2), '.-'); %Parametricplot
 


Hier ist das Script für das Runge-Kutta Verfahren
Code:

function [t, y] = rungekutta4(odefun, tspan, y0, h)
    %odefun Funktion als handle
    %tspan Spannweite als [X;Y]
    %y0 Startwert als [X,Y]
    %h Schrittweite als X
   
    t = (tspan(1):h:tspan(2))';
    y = zeros(length(t), length(y0));
    y(1, :) = y0';

    for i = 1:length(t) - 1
        t(i);
        y(i,:);
        k1 = odefun(t(i), y(i, :))';
        k1;
        k2 = odefun(t(i) + 0.5 * h, y(i, :) + 0.5 * h * k1)';
        k2;
        k3 = odefun(t(i) + 0.5 * h, y(i, :) + 0.5 * h * k2)';
        k3;
        k4 = odefun(t(i) + h, y(i, :) + h * k3)';
        k4;
        y(i + 1, :) = y(i, :) + h * (k1 + 2 * k2 + 2 * k3 + k4) / 6;
    end
end
 


Einen schönen Abend noch
Gruß Kai

ParaPlot.jpg
 Beschreibung:
Blau parametrische Funktion
Orange Runge-Kutta Lösung

Download
 Dateiname:  ParaPlot.jpg
 Dateigröße:  31.37 KB
 Heruntergeladen:  399 mal
Private Nachricht senden Benutzer-Profile anzeigen


Kahnbein.Kai
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 3
Anmeldedatum: 09.05.19
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 09.05.2019, 14:42     Titel:
  Antworten mit Zitat      
Ich glaube ich habe den Fehler gefunden, das Script des Verfahrens ist für y(1,2) und t geschrieben, ich habe jedoch x1 und y1 in meiner Funktion verwendet, liegt es vielleucht daran ?

Gruß Kai
Private Nachricht senden Benutzer-Profile anzeigen
 
Kahnbein.Kai
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 3
Anmeldedatum: 09.05.19
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 10.05.2019, 09:26     Titel:
  Antworten mit Zitat      
Nein, das war nicht der Fehler, ich habe noch ein wenig weiter rum probiert. Ich bin im Moment so weit. Leider wird immer noch ein viel zu hoher Wert ausgegeben, bzw. bei F passiert gar nichts.

Code:

clear

F = @(t,y) [y(1);y(2)] % Hier wird bei RK-Verfahren Null ausgegeben
F1 = @(t,y) [(t).*cos(t);t.^2]; % Hier wird ein viel zu hoher Wert
                                % ausgegeben

tEx = (0:0.1:20)'; %Werte für den Plot erstellen

y1 = @(t) (t).*cos(t); % y1 gleich der Funktion x*cos(x)
y2 = @(t) (t.^2); % y2 gleich der Funktion x^2

y  = @(t) [y1(t);y2(t)] % y gleich der Funktion y1(t) und y2(t)

yEx = [y1(tEx) y2(tEx)]; %Lösungen aus y1 und y2 werden gespeichert
y(0) % y von 0 wird für beide Funktionen ausgegeben

plot(tEx(:,1),yEx(:,1)) %Ploten von x1
title('Funktion X1 [x * cos(x)]')
plot(tEx(:,1),yEx(:,2)) %Ploten von y1
title('Funktion Y1 [x^2]')
plot(yEx(:,1),yEx(:,2)) %Parametricplot von x1 und z1
title('Parametric Plot von X1 und Y1')

[tRk1, yRk1] = rungekutta4(F, [0, 20], [0; 0], 0.5); %Runge-Kutta
[tRk2, yRk2] = rungekutta4(F1, [0, 20], [0; 0], 0.5); %Runge-Kutta I

plot(yEx(:,1),yEx(:,2), yRk1(:, 1), yRk1(:, 2), '.-'); %Parametricplot
title('Parametric Plot von X1, Y1 und Runge-Kutta')

plot(yEx(:,1),yEx(:,2), yRk2(:, 1), yRk2(:, 2), '.-'); %Parametricplot
title('Parametric Plot von X1, Y1 und Runge-Kutta I')


 


Gruss Kai
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.492
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 10.05.2019, 09:36     Titel:
  Antworten mit Zitat      
Hallo,

was ist denn der aktuelle Stand des RK-Verfahrens?

Dass bei F = @(t,y) [y(1);y(2)] nur Nullen herauskommen, ist bei Startwert [0;0] kein Wunder: Man fängt mit 0 an, es ändert sich nichts, also bleibt es bei 0. Das ist einfach die Lösung.

Befehle wie
Code:
t(i);
y(i,:);

haben keine Auswirkung für den weiteren Verlauf und sind daher nicht sinnvoll.

Grüße,
Harald
_________________

1.) Ask MATLAB Documentation
2.) Search gomatlab.de, google.de or MATLAB Answers
3.) Ask Technical Support of MathWorks
4.) Go mad, your problem is unsolvable ;)
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.