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

ODE mit Matlab lösen, allgemeinerer Vorgang

 

xedosh
Forum-Anfänger

Forum-Anfänger


Beiträge: 18
Anmeldedatum: 16.05.09
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 30.05.2009, 11:14     Titel: ODE mit Matlab lösen, allgemeinerer Vorgang
  Antworten mit Zitat      
Hallo liebe Leute,

ich versuche das Gleichungssystem Mx'' + Dx' + Sx = F für beliebige M,D,S und F zu lösen und habe dafür eine Funktion geschrieben:

Code:

function y = basicODE(x,M,D,S,F)

y = [x(2);
     M^-1 *F - M^-1 * D*x(2) - M^-1 *S*x(1)];
   
end
 


Nun wollte ich ersteinmal eine Funktion schreiben, dir mir das ganze dann löst mit ode45:

Code:

function [x,t] = odeSolver(M,D,S,F,T,x0,RelTol,AbsTol)
% Matrices:
%       M - Mass-Matrix (ASSUMPTION: M not equal to 0)
%       D - Absorbability-Matrix
%       S - Stiffness-Matrix
%       F - Force-Vector
% Time-Vector: T;   Initial-Value-Vector: x0
% RelTol - Is one vector
% AbsTol - Vector with the same size as x0

ODE = @(y) basicODE(y,M,D,S,F);

options = odeset('RelTol',RelTol,'AbsTol',AbsTol);

% Berechne mit entsprechendem Solver
% Hier evtl. noch Variationen ermoeglichen
[t,x] = ode45(ODE,T,x0,options);

end
 


Als Beispiel überlegte ich mir dann folgendes:

Code:

function example_1()

[x,t] = odeSolver(1,4,0,0,[0 2*pi],[2 0],1e-4,1e-4);

y = @(t) 2*cos(2*t);

plot(t,y,'r');
plot(t,x(:,1),'b');
legend('Exakte Loesung','Numerische Loesung');

end
 


Leider schaffe ich es nicht, zu erkennen, warum ich mal als Fehlermeldung "Too many input arguments" oder "x(2) undefined" erhalte.

Wäre für Rat sehr sehr dankbar!

Schönen Samstag wünscht euch,

XeDoSh
Private Nachricht senden Benutzer-Profile anzeigen


mr_endres
Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 78
Anmeldedatum: 11.06.08
Wohnort: Unterfranken
Version: ---
     Beitrag Verfasst am: 31.05.2009, 17:15     Titel: Re: ODE mit Matlab lösen, allgemeinerer Vorgang
  Antworten mit Zitat      
Hallo,

ich glaube es gibt mehrere Fehler in deinen Überlegungen:

Bereits bei der Definition der DGL passiert der "Hauptfehler". Du hast vergessen den Parameter t für die Zeit zu übergeben; alle DGL Definitionen müssen die Form y'=f(t,y) haben, also besser:

Code:

function y = basicODE(t,x,M,D,S,F)
y=zeros(2,1);
y(1) = x(2);
y(2)=F/M-D/M*x(2)-S/M*x(1);
end
 


Entsprechend dann auch in:
Code:

function [x,t] = odeSolver(M,D,S,F,T,x0,RelTol,AbsTol)
% Matrices:
%       M - Mass-Matrix (ASSUMPTION: M not equal to 0)
%       D - Absorbability-Matrix
%       S - Stiffness-Matrix
%       F - Force-Vector
% Time-Vector: T;   Initial-Value-Vector: x0
% RelTol - Is one vector
% AbsTol - Vector with the same size as x0

ODE = @(y) basicODE(t,y,M,D,S,F);

options = odeset('RelTol',RelTol,'AbsTol',AbsTol);

% Berechne mit entsprechendem Solver
% Hier evtl. noch Variationen ermoeglichen
[t,x] = ode45(ODE,T,x0,options);

end
 


Dein Bsp. war etwas ungünstig gewählt, ich habe mal ein anderes genommen:

Code:

[x,t] = odeSolver(1,2,0,1,[0 2*pi],[2 -2],1e-10,1e-10);

y = @(x) 5/4*exp(-2*x)+1/2*x+3/4;

plot(t,y(t),'r');
hold on;
plot(t,x(:,1),'b');
legend('Exakte Loesung','Numerische Loesung');
 


Zudem hast du beim plot-Befehl der exakten Lösung das Argument von y vergessen (richtig: y(t)). Ein hold on Befehl habe ich ebenfalls noch eingefügt.

Hoffe ich habe jetzt nichts vergessen. Beide Lösungen stimmen bei mir gut überein.


Schöne Pfingsten.

mfg
Johannes
Private Nachricht senden Benutzer-Profile anzeigen
 
xedosh
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 18
Anmeldedatum: 16.05.09
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 01.06.2009, 09:49     Titel:
  Antworten mit Zitat      
Super, hab vielen Dank Smile.

Das funktioniert super!

Danke!

XeDoSh
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.