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

DGL 1. Ordnung mit ode45 lösen

 

Monika
Forum-Anfänger

Forum-Anfänger


Beiträge: 17
Anmeldedatum: 15.01.16
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 16.02.2016, 16:57     Titel: DGL 1. Ordnung mit ode45 lösen
  Antworten mit Zitat      
Hallo zusammen!

Ich möchte gerne eine DGL 1. Ordnung mit der ode45 lösen. Ich bekomme mit den folgenden Codes unzählige Error-Meldungen und finde den Fehler nicht. "dydt" ist die erste Ableitung von "y". "y" und "f" hängen von "t" ab. Die Matrizen A,D und L sind konstant. Meine DGL "dydt" habe ich im Script für Funktionen wie folgt definiert

Code:

function dydt = myode2(t,y,ft,f,A,D,L)
f = interp1(ft,f,t); % Interpolate the data set (ft,f) at time t
dydt =L^(-1)*A*f+L^(-1)*D*y ; % Evaluate ODE at time t
 


Die Datei heißt auch "myode2.m". Im Hauptscript steht folgender Code :

Code:

A=rand(4,6);
D=rand(4,4);
L=rand(4,4);
ft = [0:2:12];% Generate t for f
nt=length(ft);

f=zeros(6,nt);
f= ft.*(0.01/3); % Generate f(t)
f=repmat(f,6,1);

Tspan=[1 5]; % Solve from t=1 to t=5
IC = zeros(6,1); % y(t=1) = 1
[T,Y] = ode45(@(t,y) myode2(t,y,ft,f,A,D,L),Tspan,IC); % Solve ODE
 


Sieht jemand den Fehler? Ich bin euch für jede Hilfe sehr dankbar!

Gruß,
Moni
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: 16.02.2016, 22:37     Titel:
  Antworten mit Zitat      
Hallo,

bei der Fehlermeldung oben anfangen zu lesen, und das Problem wird klar:
Code:

kann nicht wie von dir angegeben ausgeführt werden.

Ich finde es auch verwirrend, f in dieser Zeile zu überschreiben.

Wie das zu beheben ist, ist eine gute Frage. Mir ist nicht klar, was du bei einem zweiten Input f mit diesen Dimensionen erreichen willst.

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

Forum-Anfänger

Forum-Anfänger


Beiträge: 17
Anmeldedatum: 15.01.16
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 17.02.2016, 10:31     Titel:
  Antworten mit Zitat      
Hallo Harald,

vielen Dank für deine Antwort. Ich habe diese Interpolations-Zeile auch schon weggelassen, aber selbst dann funktioniert es nicht. Die Fehlermeldungen erscheinen immer dann, wenn ich aus dem Zeilenvektor f (ich hatte es vorher mit f als Zeilenvektor ausprobiert und IC war in dem Fall nur ein einzelner Wert. Auch die Matritzen A, D und L waren nicht vorhanden, stattdessen hieß die zu lösende DGL dydt=-f.*y. Da hat noch alles funktioniert) eine Matrix mit mehreren Zeilen formuliere.

Mir ist nicht klar, was ich zusätzlich ändern muss, damit die DGL gelöst werden kann.

Gruß,
Moni
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: 17.02.2016, 11:04     Titel:
  Antworten mit Zitat      
Hallo,

bitte den Code ohne Interpolationszeile zur Verfügung stellen.

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

Forum-Anfänger

Forum-Anfänger


Beiträge: 17
Anmeldedatum: 15.01.16
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 17.02.2016, 11:09     Titel:
  Antworten mit Zitat      
Also hier noch einmal das Hauptskript:
Code:

A=rand(4,6);
D=rand(4,4);
L=rand(4,4);
ft = [0:2:12];% Generate t for f
nt=length(ft);

f=zeros(6,nt);
f= ft.*(0.01/3); % Generate f(t)
f=repmat(f,6,1);

Tspan=[1 5]; % Solve from t=1 to t=5
IC = zeros(4,1); % y(t=1) = 1
[T,Y] = ode45(@(t,y) myode2(t,y,ft,f,A,D,L),Tspan,IC); % Solve ODE
 


Und hier die definierte DGL ohne Interpolations-Zeile:

Code:

function dydt = myode2(t,y,ft,f,A,D,L)
dydt =L^(-1)*A*f+L^(-1)*D*y ; % Evaluate ODE at time t
 


Gruß,
Moni
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: 17.02.2016, 11:40     Titel:
  Antworten mit Zitat      
Hallo,

D ist 4x4, y ist 6x1 --> die Dimensionen passen nicht zusammen.

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

Forum-Anfänger

Forum-Anfänger


Beiträge: 17
Anmeldedatum: 15.01.16
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 17.02.2016, 11:46     Titel:
  Antworten mit Zitat      
y soll aber eine 4xnt also in diesem Fall eine 4x7-Matrix sein. Habe es schon versucht, y=zeros(4,7) im Hauptskript und im Funktionsskript zu definieren. Beides hat nicht funktioniert.

Eine Fehlermeldung ist: "must return a column vector". Ich möchte aber, dass mein Ergebnis eine 4xnt bzw. 4x7-Matrix ist. Wie ist das mit ode45 realisierbar?

Gruß,
Moni
Private Nachricht senden Benutzer-Profile anzeigen
 
Jan S
Moderator

Moderator


Beiträge: 11.057
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 17.02.2016, 12:01     Titel:
  Antworten mit Zitat      
Hallo Monika,

Es ist sehr seltsam, dass Du von Fehlermeldungen (im Plural) sprichst. Matlab stoppt immer beim ersten (nicht per CATCH abgefangenen) Fehler, also darf es immer nur eine Meldung geben. Meinst Du Warnungen von MLint im Editor?
Welche Meldugen bekommst Du denn? Es ist immer einfacher Fehler zu verbessern, als sie zu erraten.

Anmerkung: Während L^-1 eine sehr teurer Potenz-Operation ist, iat 1/L viel effizienter.

Gruß, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
Monika
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 17
Anmeldedatum: 15.01.16
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 17.02.2016, 12:04     Titel:
  Antworten mit Zitat      
Diese Fehlermeldungen bekomme ich:
Error using +
Matrix dimensions must agree.

Error in myode2 (line 2)
dydt =L^(-1)*A*f+L^(-1)*D*y ; % Evaluate ODE at time t

Error in Versuch>@(t,y)myode2(t,y,ft,f,A,D,L)

Error in odearguments (line 87)
f0 = feval(ode,t0,y0,args{:}); % ODE15I sets args{1} to yp0.

Error in ode45 (line 115)
odearguments(FcnHandlesUsed, solver_name, ode, tspan, y0, options, varargin);

Error in Versuch (line 13)
[T,Y] = ode45(@(t,y) myode2(t,y,ft,f,A,D,L),Tspan,IC); % Solve ODE

Im übrigen rechnet er 1/L nicht Sad

Gruß,
Moni
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: 17.02.2016, 12:15     Titel:
  Antworten mit Zitat      
Hallo,

ode45 ist aber nun einmal auf Vektoren ausgelegt. Du kannst lediglich mit reshape innerhalb der Funktion zwischen Matrixformat und Vektorformat hin- und herwandeln.

Vektor nach Matrix:
Code:
ymatrix = reshape(yvektor, 4, 7);

Matrix nach Vektor:
Code:
yvektor = reshape(ymatrix, [], 1);


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

Forum-Anfänger

Forum-Anfänger


Beiträge: 17
Anmeldedatum: 15.01.16
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 17.02.2016, 13:25     Titel:
  Antworten mit Zitat      
Wie genau nutze ich den Befehl, Harald? Hab es ausprobiert, aber auch das hat leider nicht funktioniert.

Gruß,
Moni
Private Nachricht senden Benutzer-Profile anzeigen
 
Jan S
Moderator

Moderator


Beiträge: 11.057
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 17.02.2016, 13:34     Titel:
  Antworten mit Zitat      
Hallo Monika,

Das ist eine Fehlermeldung.
Setze einen Breakpoint in die Zeile (siehe "Debugger" in der Dokumentation). Dann lass Dir die Dimensionen der Operanden anzeigen:
Code:
% Hier stoppen:
%* dydt =L^(-1)*A*f+L^(-1)*D*y ; % Evaluate ODE at time t

% Im command window eingeben:
size(L^(-1)*A*f)
size(L^(-1)*D*y)

Irgendwie passt das nicht zusammen.

Gruß, Jan
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: 17.02.2016, 13:34     Titel:
  Antworten mit Zitat      
Hallo,

bitte schreibe immer genau, was du versucht hast und was daran nicht funktioniert hat.

Anpassung im Aufruf:
Code:
IC = zeros(4,7); % y(t=1) = 1
IC = reshape(IC, [], 1);


Code:
function dydt = myode2(t,y,ft,f,A,D,L)
y = reshape(y, 4, 7);
dydt =L^(-1)*A*f+L^(-1)*D*y ; % Evaluate ODE at time t
dydt = reshape(dydt, [], 1);


Grüße,
Harald
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.